types: 新增 is_ok(Move m) 函数

顺带新增未完成的 Position::legal() 函数。
This commit is contained in:
Calcitem 2020-09-19 23:38:47 +08:00
parent b0e01f64b4
commit 806b97d334
3 changed files with 40 additions and 3 deletions

View File

@ -349,6 +349,39 @@ const string Position::fen() const
} }
/// Position::legal() tests whether a pseudo-legal move is legal
bool Position::legal(Move m) const
{
assert(is_ok(m));
Color us = sideToMove;
Square from = from_sq(m);
Square to = to_sq(m);
if (phase == PHASE_MOVING && type_of(move) != MOVETYPE_REMOVE) {
if (color_of(moved_piece(m)) != us) {
return false;
}
}
// TODO: Add more
return true;
}
/// Position::pseudo_legal() takes a random move and tests whether the move is
/// pseudo legal. It is used to validate moves from TT that can be corrupted
/// due to SMP concurrent access or hash position key aliasing.
bool Position::pseudo_legal(const Move m) const
{
// TODO
return legal(m);
}
/// Position::do_move() makes a move, and saves all information necessary /// Position::do_move() makes a move, and saves all information necessary
/// to a StateInfo object. The move is assumed to be legal. Pseudo-legal /// to a StateInfo object. The move is assumed to be legal. Pseudo-legal
/// moves should be filtered out before this function is called. /// moves should be filtered out before this function is called.

View File

@ -84,6 +84,7 @@ public:
// Properties of moves // Properties of moves
bool legal(Move m) const; bool legal(Move m) const;
bool pseudo_legal(const Move m) const; bool pseudo_legal(const Move m) const;
Piece moved_piece(Move m) const;
// Doing and undoing moves // Doing and undoing moves
void do_move(Move m, StateInfo &newSt); void do_move(Move m, StateInfo &newSt);
@ -262,6 +263,11 @@ inline bool Position::empty(Square s) const
return piece_on(s) == NO_PIECE; return piece_on(s) == NO_PIECE;
} }
inline Piece Position::moved_piece(Move m) const
{
return piece_on(from_sq(m));
}
template<PieceType Pt> inline int Position::count(Color c) const template<PieceType Pt> inline int Position::count(Color c) const
{ {
if (Pt == ON_BOARD) { if (Pt == ON_BOARD) {

View File

@ -523,11 +523,9 @@ inline const Move reverse_move(Move m)
return make_move(to_sq(m), from_sq(m)); return make_move(to_sq(m), from_sq(m));
} }
#if 0 static inline bool is_ok(Move m)
constexpr bool is_ok(Move m)
{ {
return from_sq(m) != to_sq(m); // Catch MOVE_NULL and MOVE_NONE return from_sq(m) != to_sq(m); // Catch MOVE_NULL and MOVE_NONE
} }
#endif
#endif // #ifndef TYPES_H_INCLUDED #endif // #ifndef TYPES_H_INCLUDED