My Project
oracleAdjust.h
Go to the documentation of this file.
1/* oracleAdjust.h
2 */
3#ifndef _ORACLEADUST_H
4#define _ORACLEADUST_H
5
7
8namespace osl
9{
10 namespace checkmate
11 {
13 {
14 static const Move attack(const NumEffectState& state, Move check_move)
15 {
16 assert(check_move.isValid());
17 if (! check_move.isDrop())
18 {
19 // capture
20 {
21 const Piece p=state.pieceOnBoard(check_move.to());
22 if (p.isPtype<KING>())
23 return Move();
24 check_move=check_move.newCapture(p);
25 }
26
27 // from
28 if (state.pieceOnBoard(check_move.from()).ptype() != check_move.oldPtype()
29 && Ptype_Table.hasLongMove(check_move.ptype())) {
30 Piece p;
31 switch (unpromote(check_move.ptype())) {
32 case ROOK:
33 {
34 mask_t m = state.allEffectAt<ROOK>(check_move.player(), check_move.to());
35 while (m.any()) {
36 const int num = m.takeOneBit()+PtypeFuns<ROOK>::indexNum*32;
37 p = state.pieceOf(num);
38 if (Board_Table.getShortOffsetNotKnight(Offset32(check_move.to(), check_move.from()))
40 break;
41 }
42 break;
43 }
44 case BISHOP:
45 {
46 mask_t m = state.allEffectAt<BISHOP>(check_move.player(), check_move.to());
47 while (m.any()) {
48 const int num = m.takeOneBit()+PtypeFuns<BISHOP>::indexNum*32;
49 p = state.pieceOf(num);
50 if (Board_Table.getShortOffsetNotKnight(Offset32(check_move.to(), check_move.from()))
52 break;
53 }
54 break;
55 }
56 case LANCE: p = state.findAttackAt<LANCE>(check_move.player(), check_move.to());
57 break;
58 default:
59 assert(0);
60 }
61 if (p.isPiece()) {
62 if (check_move.oldPtype() == p.ptype())
63 check_move=check_move.newFrom(p.square());
64 else if (check_move.ptype() == p.ptype())
65 check_move = Move(p.square(), check_move.to(), check_move.ptype(),
66 check_move.capturePtype(), false, check_move.player());
67 if (! state.isValidMoveByRule(check_move, false))
68 return Move();
69 }
70 }
71 }
72 if (! state.isAlmostValidMove<false>(check_move))
73 return Move();
74 return check_move;
75 }
76 };
77 }
78}
79
80
81#endif /* _ORACLEADUST_H */
82// ;;; Local Variables:
83// ;;; mode:c++
84// ;;; c-basic-offset:2
85// ;;; End:
const Offset getShortOffsetNotKnight(Offset32 offset32) const
Longの利きの可能性のあるoffsetの場合は, 反復に使う offsetを Knight以外のShortの利きのoffsetの場合はそれ自身を返す.
Definition boardTable.h:119
圧縮していない moveの表現 .
bool isValid() const
Ptype ptype() const
Player player() const
bool isDrop() const
Ptype capturePtype() const
const Move newCapture(Piece capture) const
Move newFrom(Square new_from) const
Ptype oldPtype() const
移動前のPtype, i.e., 成る手だった場合成る前
const Square to() const
const Square from() const
利きを持つ局面
bool isAlmostValidMove(Move move) const
合法手かどうかを簡単に検査する.局面に依存するチェックのみ. ルール上指せない手である可能性がある場合は,isValidMove を用いる.
const Piece findAttackAt(Player attack, Square target) const
return a piece s.t.
const mask_t allEffectAt(Player P, Square target) const
差が uniqになるような座標の差分.
Definition offset32.h:17
Ptype ptype() const
Definition basic_type.h:821
const Square square() const
Definition basic_type.h:832
bool isPiece() const
Definition basic_type.h:953
bool isPtype() const
Definition basic_type.h:930
bool hasLongMove(Ptype ptype) const
遅くて良い?
Definition ptypeTable.h:54
const Piece pieceOnBoard(Square sq) const
static bool isValidMoveByRule(Move move, bool show_error)
盤面以外の部分の反則のチェック
const Piece pieceOf(int num) const
Definition simpleState.h:76
@ ROOK
Definition basic_type.h:100
@ BISHOP
Definition basic_type.h:99
@ KING
Definition basic_type.h:93
@ LANCE
Definition basic_type.h:96
const PtypeTable Ptype_Table
Definition tables.cc:97
Ptype unpromote(Ptype ptype)
ptypeがpromote後の型の時に,promote前の型を返す. promoteしていない型の時はそのまま返す
Definition basic_type.h:157
const BoardTable Board_Table
Definition tables.cc:95
Offset32Base< 8, 9 > Offset32
Definition offset32.h:63
static const Move attack(const NumEffectState &state, Move check_move)