All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
pieceEval.tcc
Go to the documentation of this file.
1 /* pieceEval.tcc
2  */
3 #ifndef OSL_PIECEEVAL_TCC
4 #define OSL_PIECEEVAL_TCC
7 #include "osl/eval/pieceEval.h"
9 namespace osl
10 {
11  namespace eval
12  {
13  using container::PtypeOSquareVector;
19  template <Player P>
21  {
22  static void select(const NumEffectState& state, Square target,
23  const PtypeOSquareVector& src,
24  PtypeOSquareVector& out)
25  {
26  for (size_t i=0; i<src.size(); ++i)
27  {
28  assert(P == getOwner(src[i].first));
29  const Ptype ptype = getPtype(src[i].first);
30  const Square from = src[i].second;
31  if ((ptype == KING) // 王は無条件でいれておく
33  isMember(state,ptype,from,target)))
34  {
35  out.push_back(src[i]);
36  }
37  }
38  }
42  static void select(const NumEffectState& state, Square target,
43  const PtypeOSquareVector& src,
44  PtypeOSquareVector& out, Square except_for)
45  {
46  for (size_t i=0; i<src.size(); ++i)
47  {
48  assert(P == getOwner(src[i].first));
49  const Ptype ptype = getPtype(src[i].first);
50  const Square from = src[i].second;
51  if ((ptype == KING) // 王は無条件でいれておく
53  isMember(state,ptype,from,target,except_for)))
54  {
55  out.push_back(src[i]);
56  }
57  }
58  }
59  };
60 
62  {
64  template <Player P>
65  static void findEffectPieces(const NumEffectState& state, Square effect_to,
66  PtypeOSquareVector& my_pieces,
67  PtypeOSquareVector& op_pieces)
68  {
70  store_t op_pieces_store(&op_pieces, effect_to);
71  state.template forEachEffect<PlayerTraits<P>::opponent,store_t>
72  (effect_to, op_pieces_store);
73  if (! op_pieces.empty())
74  {
75  store_t my_pieces_store(&my_pieces, effect_to);
76  state.template forEachEffect<P,store_t>(effect_to, my_pieces_store);
77  }
78  }
80  template <Player P>
81  static void findEffectPiecesAfterMove(const NumEffectState& state, Move move,
82  PtypeOSquareVector& my_pieces,
83  PtypeOSquareVector& op_pieces)
84  {
85  using namespace effect_action;
86 
87  const Square from=move.from();
88  const Square to=move.to();
89  const Player Opponent = PlayerTraits<P>::opponent;
90  StorePtypeOSquare my_pieces_store(&my_pieces, to);
91  StorePtypeOSquare op_pieces_store(&op_pieces, to);
92  {
93  // moveの結果目的のマスの利きが変わるのを調節
97  Offset shortOffset=Board_Table.getShortOffsetNotKnight(Offset32(to,from));
98  // knightの場合は変わらない
99  if (! shortOffset.zero()){
100  Piece p;
101  for (Square pos=from-shortOffset; (p=state.pieceAt(pos)).isEmpty();
102  pos-=shortOffset)
103  ;
104  if (p.isOnBoardByOwner<P>()){
105  // 利きあり
106  const int moveMask=Ptype_Table.getMoveMask(p.ptype());
108  if ((moveMask&dirToMask(dir))!=0){
109  my_pieces_store.store(p);
110  }
111  }
112  else if (p.isOnBoardByOwner<Opponent>()){
113  // 利きあり
114  const int moveMask=Ptype_Table.getMoveMask(p.ptype());
116  if ((moveMask&dirToMask(dir))!=0){
117  op_pieces_store.store(p);
118  }
119  }
120  }
121  }
122  state.template forEachEffect<PlayerTraits<P>::opponent,StorePtypeOSquare>
123  (to, op_pieces_store);
124  if (! op_pieces.empty())
125  {
126  const Piece movePiece=state.pieceAt(from);
127  state.template forEachEffectNotBy<P,StorePtypeOSquare>
128  (to, movePiece,my_pieces_store);
129  }
130  }
131 
145  template <Player P>
146  static int computeValue(Square target, PtypeO ptypeO,
147  const PtypeOSquareVector& my_pieces,
148  const PtypeOSquareVector& op_pieces)
149  {
150  int val = 0;
151  CArray<int,Piece::SIZE> vals;
152  const Player Opponent = PlayerTraits<P>::opponent;
153  size_t i;
154  for (i=0;i<op_pieces.size();i++)
155  {
156  vals[i*2]=val;
157  // opponentMove
158  val+=Ptype_Eval_Table.captureValue(ptypeO);
159  {
160  ptypeO = op_pieces[i].first;
161  const bool promotable = canPromote(ptypeO)
162  && (target.canPromote<Opponent>()
163  || op_pieces[i].second.canPromote<Opponent>());
164  if (promotable)
165  {
166  ptypeO=promote(ptypeO);
167  val+=Ptype_Eval_Table.promoteValue(ptypeO);
168  }
169  }
170  vals[i*2+1]=val;
171  // myMove
172  if (i>=my_pieces.size()){
173  break;
174  }
175  val+=Ptype_Eval_Table.captureValue(ptypeO);
176  {
177  ptypeO=my_pieces[i].first;
178  const bool promotable = canPromote(ptypeO)
179  && (target.canPromote<P>()
180  || my_pieces[i].second.canPromote<P>());
181  if (promotable)
182  {
183  ptypeO=promote(ptypeO);
184  val+=Ptype_Eval_Table.promoteValue(ptypeO);
185  }
186  }
187  }
188  for (int j=i-1;j>=0;j--)
189  {
190  val=EvalTraits<P>::max(val,vals[j*2+1]);
191  val=EvalTraits<Opponent>::max(val,vals[j*2]);
192  }
193  return val;
194  }
195  };
196 
198  template <Ptype PTYPE> inline int captureVal(Player P)
199  {
200  // unpromote(PTYPE) を定数で求められれば即値に出来る
201  return Ptype_Eval_Table.captureValue(newPtypeO(alt(P),PTYPE));
202  }
203 } // namespace eval
204 } // namespace osl
205 
206 template<osl::Player P>
207 int osl::PieceEval::
208 computeDiffAfterMove(const NumEffectState& state, Move move)
209 {
210  assert(P == state.turn());
211  assert(state.isAlmostValidMove(move));
212 
214  PtypeOSquareVector my_pieces,op_pieces;
218  const Square from=move.from();
219  const Square to=move.to();
220  int val=0;
224  if (from.isPieceStand()) // drop moveは簡単
225  {
226  TakeBackValue::findEffectPieces<P>(state, to,
227  my_pieces, op_pieces);
228  }
229  else
230  {
231  val+=diffWithMove(state,move);
232  TakeBackValue::
233  findEffectPiecesAfterMove<P>(state, move, my_pieces, op_pieces);
234  }
235 
236  if (op_pieces.empty())
237  return val;
238 
239  PtypeOSquareVector my_safe_pieces, op_safe_pieces;
240  if (from.isPieceStand())
241  {
243  select(state, to, my_pieces, my_safe_pieces);
245  select(state, to, op_pieces, op_safe_pieces);
246  }
247  else
248  {
250  select(state, to, my_pieces, my_safe_pieces, from);
252  select(state, to, op_pieces, op_safe_pieces, from);
253  }
254 
255  my_safe_pieces.sort();
256  op_safe_pieces.sort();
257 
258  return val + TakeBackValue::
259  computeValue<P>(to, move.ptypeO(), my_safe_pieces, op_safe_pieces);
260 }
261 
262 #endif /* OSL_PIECEEVAL_TCC */
263 // ;;; Local Variables:
264 // ;;; mode:c++
265 // ;;; c-basic-offset:2
266 // ;;; End: