mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
Use generate_moves() in san.cpp
Instead of MovePicker and cleanup san.cpp No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
61c03b9d22
commit
a0f0a7dc4f
2 changed files with 70 additions and 71 deletions
|
@ -659,7 +659,7 @@ namespace {
|
||||||
|
|
||||||
Color us = pos.side_to_move();
|
Color us = pos.side_to_move();
|
||||||
|
|
||||||
if ( (Side == KING_SIDE && pos.can_castle_kingside(us))
|
if ( (Side == KING_SIDE && pos.can_castle_kingside(us))
|
||||||
||(Side == QUEEN_SIDE && pos.can_castle_queenside(us)))
|
||(Side == QUEEN_SIDE && pos.can_castle_queenside(us)))
|
||||||
{
|
{
|
||||||
Color them = opposite_color(us);
|
Color them = opposite_color(us);
|
||||||
|
|
139
src/san.cpp
139
src/san.cpp
|
@ -28,8 +28,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#include "history.h"
|
#include "movegen.h"
|
||||||
#include "movepick.h"
|
|
||||||
#include "san.h"
|
#include "san.h"
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
@ -41,14 +40,9 @@ using std::string;
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
enum Ambiguity {
|
enum Ambiguity {
|
||||||
AMBIGUITY_NONE,
|
AMBIGUITY_NONE, AMBIGUITY_FILE, AMBIGUITY_RANK, AMBIGUITY_BOTH
|
||||||
AMBIGUITY_FILE,
|
|
||||||
AMBIGUITY_RANK,
|
|
||||||
AMBIGUITY_BOTH
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const History H; // Used as dummy argument for MovePicker c'tor
|
|
||||||
|
|
||||||
Ambiguity move_ambiguity(const Position& pos, Move m);
|
Ambiguity move_ambiguity(const Position& pos, Move m);
|
||||||
const string time_string(int milliseconds);
|
const string time_string(int milliseconds);
|
||||||
const string score_string(Value v);
|
const string score_string(Value v);
|
||||||
|
@ -71,13 +65,15 @@ const string move_to_san(Position& pos, Move m) {
|
||||||
string san;
|
string san;
|
||||||
Square from = move_from(m);
|
Square from = move_from(m);
|
||||||
Square to = move_to(m);
|
Square to = move_to(m);
|
||||||
PieceType pt = type_of_piece(pos.piece_on(move_from(m)));
|
PieceType pt = type_of_piece(pos.piece_on(from));
|
||||||
|
|
||||||
if (m == MOVE_NONE)
|
if (m == MOVE_NONE)
|
||||||
return "(none)";
|
return "(none)";
|
||||||
else if (m == MOVE_NULL)
|
|
||||||
|
if (m == MOVE_NULL)
|
||||||
return "(null)";
|
return "(null)";
|
||||||
else if (move_is_long_castle(m) || (int(to - from) == -2 && pt == KING))
|
|
||||||
|
if (move_is_long_castle(m) || (int(to - from) == -2 && pt == KING))
|
||||||
san = "O-O-O";
|
san = "O-O-O";
|
||||||
else if (move_is_short_castle(m) || (int(to - from) == 2 && pt == KING))
|
else if (move_is_short_castle(m) || (int(to - from) == 2 && pt == KING))
|
||||||
san = "O-O";
|
san = "O-O";
|
||||||
|
@ -103,16 +99,19 @@ const string move_to_san(Position& pos, Move m) {
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pos.move_is_capture(m))
|
if (pos.move_is_capture(m))
|
||||||
{
|
{
|
||||||
if (pt == PAWN)
|
if (pt == PAWN)
|
||||||
san += file_to_char(square_file(move_from(m)));
|
san += file_to_char(square_file(from));
|
||||||
san += "x";
|
|
||||||
|
san += 'x';
|
||||||
}
|
}
|
||||||
san += square_to_string(move_to(m));
|
san += square_to_string(to);
|
||||||
|
|
||||||
if (move_is_promotion(m))
|
if (move_is_promotion(m))
|
||||||
{
|
{
|
||||||
san += "=";
|
san += '=';
|
||||||
san += piece_type_to_char(move_promotion_piece(m));
|
san += piece_type_to_char(move_promotion_piece(m));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,41 +137,43 @@ Move move_from_san(const Position& pos, const string& movestr) {
|
||||||
|
|
||||||
assert(pos.is_ok());
|
assert(pos.is_ok());
|
||||||
|
|
||||||
MovePicker mp = MovePicker(pos, MOVE_NONE, ONE_PLY, H);
|
enum { START, TO_FILE, TO_RANK, PROMOTION_OR_CHECK, PROMOTION, CHECK, END };
|
||||||
Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
|
static const string pieceLetters = "KQRBN";
|
||||||
|
|
||||||
|
MoveStack mlist[MOVES_MAX], *last;
|
||||||
|
PieceType pt = PIECE_TYPE_NONE, promotion = PIECE_TYPE_NONE;
|
||||||
|
File fromFile = FILE_NONE, toFile = FILE_NONE;
|
||||||
|
Rank fromRank = RANK_NONE, toRank = RANK_NONE;
|
||||||
|
Move move = MOVE_NONE;
|
||||||
|
Square from, to;
|
||||||
|
int matches, state = START;
|
||||||
|
|
||||||
|
// Generate all legal moves for the given position
|
||||||
|
last = generate_moves(pos, mlist);
|
||||||
|
|
||||||
// Castling moves
|
// Castling moves
|
||||||
if (movestr == "O-O-O" || movestr == "O-O-O+")
|
if (movestr == "O-O-O" || movestr == "O-O-O+")
|
||||||
{
|
{
|
||||||
Move m;
|
for (MoveStack* cur = mlist; cur != last; cur++)
|
||||||
while ((m = mp.get_next_move()) != MOVE_NONE)
|
if (move_is_long_castle(cur->move))
|
||||||
if (move_is_long_castle(m) && pos.pl_move_is_legal(m, pinned))
|
return cur->move;
|
||||||
return m;
|
|
||||||
|
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
}
|
}
|
||||||
else if (movestr == "O-O" || movestr == "O-O+")
|
else if (movestr == "O-O" || movestr == "O-O+")
|
||||||
{
|
{
|
||||||
Move m;
|
for (MoveStack* cur = mlist; cur != last; cur++)
|
||||||
while ((m = mp.get_next_move()) != MOVE_NONE)
|
if (move_is_short_castle(cur->move))
|
||||||
if (move_is_short_castle(m) && pos.pl_move_is_legal(m, pinned))
|
return cur->move;
|
||||||
return m;
|
|
||||||
|
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal moves. We use a simple FSM to parse the san string.
|
// Normal moves. We use a simple FSM to parse the san string
|
||||||
enum { START, TO_FILE, TO_RANK, PROMOTION_OR_CHECK, PROMOTION, CHECK, END };
|
|
||||||
static const string pieceLetters = "KQRBN";
|
|
||||||
PieceType pt = PIECE_TYPE_NONE, promotion = PIECE_TYPE_NONE;
|
|
||||||
File fromFile = FILE_NONE, toFile = FILE_NONE;
|
|
||||||
Rank fromRank = RANK_NONE, toRank = RANK_NONE;
|
|
||||||
Square to;
|
|
||||||
int state = START;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < movestr.length(); i++)
|
for (size_t i = 0; i < movestr.length(); i++)
|
||||||
{
|
{
|
||||||
char type, c = movestr[i];
|
char type, c = movestr[i];
|
||||||
|
|
||||||
if (pieceLetters.find(c) != string::npos)
|
if (pieceLetters.find(c) != string::npos)
|
||||||
type = 'P';
|
type = 'P';
|
||||||
else if (c >= 'a' && c <= 'h')
|
else if (c >= 'a' && c <= 'h')
|
||||||
|
@ -192,7 +193,7 @@ Move move_from_san(const Position& pos, const string& movestr) {
|
||||||
else if (state == PROMOTION)
|
else if (state == PROMOTION)
|
||||||
{
|
{
|
||||||
promotion = piece_type_from_char(c);
|
promotion = piece_type_from_char(c);
|
||||||
state = (i < movestr.length() - 1) ? CHECK : END;
|
state = (i < movestr.length() - 1 ? CHECK : END);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
|
@ -232,7 +233,8 @@ Move move_from_san(const Position& pos, const string& movestr) {
|
||||||
else
|
else
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
break;
|
break;
|
||||||
case 'x': case 'X':
|
case 'x':
|
||||||
|
case 'X':
|
||||||
if (state == TO_RANK)
|
if (state == TO_RANK)
|
||||||
{
|
{
|
||||||
// Previous file was for disambiguation, or it's a pawn capture
|
// Previous file was for disambiguation, or it's a pawn capture
|
||||||
|
@ -248,7 +250,8 @@ Move move_from_san(const Position& pos, const string& movestr) {
|
||||||
else
|
else
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
break;
|
break;
|
||||||
case '+': case '#':
|
case '+':
|
||||||
|
case '#':
|
||||||
if (state == PROMOTION_OR_CHECK || state == CHECK)
|
if (state == PROMOTION_OR_CHECK || state == CHECK)
|
||||||
state = END;
|
state = END;
|
||||||
else
|
else
|
||||||
|
@ -263,22 +266,25 @@ Move move_from_san(const Position& pos, const string& movestr) {
|
||||||
if (state != END)
|
if (state != END)
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
|
|
||||||
// Look for a matching move
|
// Look for an unambiguous matching move
|
||||||
Move m, move = MOVE_NONE;
|
|
||||||
to = make_square(toFile, toRank);
|
to = make_square(toFile, toRank);
|
||||||
int matches = 0;
|
matches = 0;
|
||||||
|
|
||||||
while ((m = mp.get_next_move()) != MOVE_NONE)
|
for (MoveStack* cur = mlist; cur != last; cur++)
|
||||||
if ( pos.type_of_piece_on(move_from(m)) == pt
|
{
|
||||||
&& move_to(m) == to
|
from = move_from(cur->move);
|
||||||
&& move_promotion_piece(m) == promotion
|
|
||||||
&& (fromFile == FILE_NONE || fromFile == square_file(move_from(m)))
|
if ( pos.type_of_piece_on(from) == pt
|
||||||
&& (fromRank == RANK_NONE || fromRank == square_rank(move_from(m))))
|
&& move_to(cur->move) == to
|
||||||
|
&& move_promotion_piece(cur->move) == promotion
|
||||||
|
&& (fromFile == FILE_NONE || fromFile == square_file(from))
|
||||||
|
&& (fromRank == RANK_NONE || fromRank == square_rank(from)))
|
||||||
{
|
{
|
||||||
move = m;
|
move = cur->move;
|
||||||
matches++;
|
matches++;
|
||||||
}
|
}
|
||||||
return (matches == 1 ? move : MOVE_NONE);
|
}
|
||||||
|
return matches == 1 ? move : MOVE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -359,43 +365,36 @@ namespace {
|
||||||
|
|
||||||
Ambiguity move_ambiguity(const Position& pos, Move m) {
|
Ambiguity move_ambiguity(const Position& pos, Move m) {
|
||||||
|
|
||||||
|
MoveStack mlist[MOVES_MAX], *last;
|
||||||
|
Move candidates[8];
|
||||||
Square from = move_from(m);
|
Square from = move_from(m);
|
||||||
Square to = move_to(m);
|
Square to = move_to(m);
|
||||||
Piece pc = pos.piece_on(from);
|
Piece pc = pos.piece_on(from);
|
||||||
|
int matches = 0, f = 0, r = 0;
|
||||||
|
|
||||||
// King moves are never ambiguous, because there is never two kings of
|
// If there is only one piece 'pc' then move cannot be ambiguous
|
||||||
// the same color.
|
if (pos.piece_count(pos.side_to_move(), type_of_piece(pc)) == 1)
|
||||||
if (type_of_piece(pc) == KING)
|
|
||||||
return AMBIGUITY_NONE;
|
return AMBIGUITY_NONE;
|
||||||
|
|
||||||
MovePicker mp = MovePicker(pos, MOVE_NONE, ONE_PLY, H);
|
// Collect all legal moves of piece 'pc' with destination 'to'
|
||||||
Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
|
last = generate_moves(pos, mlist);
|
||||||
Move mv, moveList[8];
|
for (MoveStack* cur = mlist; cur != last; cur++)
|
||||||
|
if (move_to(cur->move) == to && pos.piece_on(move_from(cur->move)) == pc)
|
||||||
|
candidates[matches++] = cur->move;
|
||||||
|
|
||||||
int n = 0;
|
if (matches == 1)
|
||||||
while ((mv = mp.get_next_move()) != MOVE_NONE)
|
|
||||||
if (move_to(mv) == to && pos.piece_on(move_from(mv)) == pc && pos.pl_move_is_legal(mv, pinned))
|
|
||||||
moveList[n++] = mv;
|
|
||||||
|
|
||||||
if (n == 1)
|
|
||||||
return AMBIGUITY_NONE;
|
return AMBIGUITY_NONE;
|
||||||
|
|
||||||
int f = 0, r = 0;
|
for (int i = 0; i < matches; i++)
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
{
|
{
|
||||||
if (square_file(move_from(moveList[i])) == square_file(from))
|
if (square_file(move_from(candidates[i])) == square_file(from))
|
||||||
f++;
|
f++;
|
||||||
|
|
||||||
if (square_rank(move_from(moveList[i])) == square_rank(from))
|
if (square_rank(move_from(candidates[i])) == square_rank(from))
|
||||||
r++;
|
r++;
|
||||||
}
|
}
|
||||||
if (f == 1)
|
|
||||||
return AMBIGUITY_FILE;
|
|
||||||
|
|
||||||
if (r == 1)
|
return f == 1 ? AMBIGUITY_FILE : r == 1 ? AMBIGUITY_RANK : AMBIGUITY_BOTH;
|
||||||
return AMBIGUITY_RANK;
|
|
||||||
|
|
||||||
return AMBIGUITY_BOTH;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue