refactor: Rename to potential_mills_count()
This commit is contained in:
parent
90ca5f0e49
commit
410435278e
|
@ -107,7 +107,7 @@ ExtMove *generate<REMOVE>(Position &pos, ExtMove *moveList)
|
||||||
for (auto i = EFFECTIVE_SQUARE_NB - 1; i >= 0; i--) {
|
for (auto i = EFFECTIVE_SQUARE_NB - 1; i >= 0; i--) {
|
||||||
s = MoveList<LEGAL>::movePriorityList[i];
|
s = MoveList<LEGAL>::movePriorityList[i];
|
||||||
if (pos.get_board()[s] & make_piece(them)) {
|
if (pos.get_board()[s] & make_piece(them)) {
|
||||||
if (rule.mayTakeFromMillsAlways || !pos.in_how_many_mills(s, NOBODY)) {
|
if (rule.mayTakeFromMillsAlways || !pos.potential_mills_count(s, NOBODY)) {
|
||||||
*cur++ = (Move)-s;
|
*cur++ = (Move)-s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,11 +57,11 @@ void MovePicker::score()
|
||||||
while (cur++->move != MOVE_NONE) {
|
while (cur++->move != MOVE_NONE) {
|
||||||
Move m = cur->move;
|
Move m = cur->move;
|
||||||
|
|
||||||
Square sq = to_sq(m);
|
Square to = to_sq(m);
|
||||||
Square sqsrc = from_sq(m);
|
Square from = from_sq(m);
|
||||||
|
|
||||||
// if stat before moving, moving phrase maybe from @-0-@ to 0-@-@, but no mill, so need sqsrc to judge
|
// if stat before moving, moving phrase maybe from @-0-@ to 0-@-@, but no mill, so need sqsrc to judge
|
||||||
int nOurMills = pos.in_how_many_mills(sq, pos.side_to_move(), sqsrc);
|
int nOurMills = pos.potential_mills_count(to, pos.side_to_move(), from);
|
||||||
int nTheirMills = 0;
|
int nTheirMills = 0;
|
||||||
|
|
||||||
#ifndef SORT_MOVE_WITHOUT_HUMAN_KNOWLEDGES
|
#ifndef SORT_MOVE_WITHOUT_HUMAN_KNOWLEDGES
|
||||||
|
@ -72,13 +72,13 @@ void MovePicker::score()
|
||||||
cur->value += RATING_ONE_MILL * nOurMills;
|
cur->value += RATING_ONE_MILL * nOurMills;
|
||||||
} else if (pos.get_phase() == Phase::placing) {
|
} else if (pos.get_phase() == Phase::placing) {
|
||||||
// placing phrase, check if place sq can block their close mill
|
// placing phrase, check if place sq can block their close mill
|
||||||
nTheirMills = pos.in_how_many_mills(sq, ~pos.side_to_move());
|
nTheirMills = pos.potential_mills_count(to, ~pos.side_to_move());
|
||||||
cur->value += RATING_BLOCK_ONE_MILL * nTheirMills;
|
cur->value += RATING_BLOCK_ONE_MILL * nTheirMills;
|
||||||
}
|
}
|
||||||
#if 1
|
#if 1
|
||||||
else if (pos.get_phase() == Phase::moving) {
|
else if (pos.get_phase() == Phase::moving) {
|
||||||
// moving phrase, check if place sq can block their close mill
|
// moving phrase, check if place sq can block their close mill
|
||||||
nTheirMills = pos.in_how_many_mills(sq, ~pos.side_to_move());
|
nTheirMills = pos.potential_mills_count(to, ~pos.side_to_move());
|
||||||
|
|
||||||
if (nTheirMills) {
|
if (nTheirMills) {
|
||||||
int nOurPieces = 0;
|
int nOurPieces = 0;
|
||||||
|
@ -86,11 +86,11 @@ void MovePicker::score()
|
||||||
int nBanned = 0;
|
int nBanned = 0;
|
||||||
int nEmpty = 0;
|
int nEmpty = 0;
|
||||||
|
|
||||||
pos.surrounded_pieces_count(sq, nOurPieces, nTheirPieces, nBanned, nEmpty);
|
pos.surrounded_pieces_count(to, nOurPieces, nTheirPieces, nBanned, nEmpty);
|
||||||
|
|
||||||
if (sq % 2 == 0 && nTheirPieces == 3) {
|
if (to % 2 == 0 && nTheirPieces == 3) {
|
||||||
cur->value += RATING_BLOCK_ONE_MILL * nTheirMills;
|
cur->value += RATING_BLOCK_ONE_MILL * nTheirMills;
|
||||||
} else if (sq % 2 == 1 && nTheirPieces == 2 && rule.piecesCount == 12) {
|
} else if (to % 2 == 1 && nTheirPieces == 2 && rule.piecesCount == 12) {
|
||||||
cur->value += RATING_BLOCK_ONE_MILL * nTheirMills;
|
cur->value += RATING_BLOCK_ONE_MILL * nTheirMills;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ void MovePicker::score()
|
||||||
int nBanned = 0;
|
int nBanned = 0;
|
||||||
int nEmpty = 0;
|
int nEmpty = 0;
|
||||||
|
|
||||||
pos.surrounded_pieces_count(sq, nOurPieces, nTheirPieces, nBanned, nEmpty);
|
pos.surrounded_pieces_count(to, nOurPieces, nTheirPieces, nBanned, nEmpty);
|
||||||
|
|
||||||
if (nOurMills > 0) {
|
if (nOurMills > 0) {
|
||||||
// remove point is in our mill
|
// remove point is in our mill
|
||||||
|
@ -128,7 +128,7 @@ void MovePicker::score()
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove point is in their mill
|
// remove point is in their mill
|
||||||
nTheirMills = pos.in_how_many_mills(sq, ~pos.side_to_move());
|
nTheirMills = pos.potential_mills_count(to, ~pos.side_to_move());
|
||||||
if (nTheirMills) {
|
if (nTheirMills) {
|
||||||
if (nTheirPieces >= 2) {
|
if (nTheirPieces >= 2) {
|
||||||
// if nearby their piece, prefer do not remove
|
// if nearby their piece, prefer do not remove
|
||||||
|
|
|
@ -917,7 +917,7 @@ bool Position::remove_piece(Square s, bool updateCmdlist)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!rule.mayTakeFromMillsAlways &&
|
if (!rule.mayTakeFromMillsAlways &&
|
||||||
in_how_many_mills(s, NOBODY) &&
|
potential_mills_count(s, NOBODY) &&
|
||||||
!is_all_in_mills(~sideToMove)) {
|
!is_all_in_mills(~sideToMove)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1410,28 +1410,28 @@ bool Position::bitboard_is_ok()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Position::in_how_many_mills(Square s, Color c, Square squareSelected)
|
int Position::potential_mills_count(Square to, Color c, Square from)
|
||||||
{
|
{
|
||||||
int n = 0;
|
int n = 0;
|
||||||
Piece locbak = NO_PIECE;
|
Piece locbak = NO_PIECE;
|
||||||
|
|
||||||
assert(SQ_0 <= squareSelected && squareSelected < SQUARE_NB);
|
assert(SQ_0 <= from && from < SQUARE_NB);
|
||||||
|
|
||||||
if (c == NOBODY) {
|
if (c == NOBODY) {
|
||||||
c = color_on(s);
|
c = color_on(to);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (squareSelected != SQ_0) {
|
if (from != SQ_0) {
|
||||||
locbak = board[squareSelected];
|
locbak = board[from];
|
||||||
board[squareSelected] = NO_PIECE;
|
board[from] = NO_PIECE;
|
||||||
|
|
||||||
CLEAR_BIT(byTypeBB[ALL_PIECES], squareSelected);
|
CLEAR_BIT(byTypeBB[ALL_PIECES], from);
|
||||||
CLEAR_BIT(byTypeBB[type_of(locbak)], squareSelected);
|
CLEAR_BIT(byTypeBB[type_of(locbak)], from);
|
||||||
CLEAR_BIT(byColorBB[color_of(locbak)], squareSelected);
|
CLEAR_BIT(byColorBB[color_of(locbak)], from);
|
||||||
}
|
}
|
||||||
|
|
||||||
Bitboard bc = byColorBB[c];
|
Bitboard bc = byColorBB[c];
|
||||||
Bitboard *mt = millTableBB[s];
|
Bitboard *mt = millTableBB[to];
|
||||||
|
|
||||||
for (int l = 0; l < LD_NB; l++) {
|
for (int l = 0; l < LD_NB; l++) {
|
||||||
if ((bc & mt[l]) == mt[l]) {
|
if ((bc & mt[l]) == mt[l]) {
|
||||||
|
@ -1439,12 +1439,12 @@ int Position::in_how_many_mills(Square s, Color c, Square squareSelected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (squareSelected != SQ_0) {
|
if (from != SQ_0) {
|
||||||
board[squareSelected] = locbak;
|
board[from] = locbak;
|
||||||
|
|
||||||
SET_BIT(byTypeBB[ALL_PIECES], squareSelected);
|
SET_BIT(byTypeBB[ALL_PIECES], from);
|
||||||
SET_BIT(byTypeBB[type_of(locbak)], squareSelected);
|
SET_BIT(byTypeBB[type_of(locbak)], from);
|
||||||
SET_BIT(byColorBB[color_of(locbak)], squareSelected);
|
SET_BIT(byColorBB[color_of(locbak)], from);
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
|
@ -1470,7 +1470,7 @@ bool Position::is_all_in_mills(Color c)
|
||||||
{
|
{
|
||||||
for (Square i = SQ_BEGIN; i < SQ_END; ++i) {
|
for (Square i = SQ_BEGIN; i < SQ_END; ++i) {
|
||||||
if (board[i] & ((uint8_t)make_piece(c))) {
|
if (board[i] & ((uint8_t)make_piece(c))) {
|
||||||
if (!in_how_many_mills(i, NOBODY)) {
|
if (!potential_mills_count(i, NOBODY)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,7 +133,9 @@ public:
|
||||||
|
|
||||||
void create_mill_table();
|
void create_mill_table();
|
||||||
int add_mills(Square s);
|
int add_mills(Square s);
|
||||||
int in_how_many_mills(Square s, Color c, Square squareSelected = SQ_0);
|
|
||||||
|
// The number of mills that would be closed by the given move.
|
||||||
|
int potential_mills_count(Square to, Color c, Square from = SQ_0);
|
||||||
bool is_all_in_mills(Color c);
|
bool is_all_in_mills(Color c);
|
||||||
|
|
||||||
int surrounded_empty_squares_count(Square s, bool includeFobidden);
|
int surrounded_empty_squares_count(Square s, bool includeFobidden);
|
||||||
|
|
|
@ -626,7 +626,7 @@ class Position {
|
||||||
if (!(Color.opponent(sideToMove()) == board[s])) return false;
|
if (!(Color.opponent(sideToMove()) == board[s])) return false;
|
||||||
|
|
||||||
if (!rule.mayTakeFromMillsAlways &&
|
if (!rule.mayTakeFromMillsAlways &&
|
||||||
inHowManyMills(s, Color.nobody) > 0 &&
|
potentialMillsCount(s, Color.nobody) > 0 &&
|
||||||
!isAllInMills(Color.opponent(sideToMove()))) {
|
!isAllInMills(Color.opponent(sideToMove()))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1323,30 +1323,29 @@ class Position {
|
||||||
return board[sq];
|
return board[sq];
|
||||||
}
|
}
|
||||||
|
|
||||||
int inHowManyMills(int s, String c, {int squareSelected = 0}) {
|
int potentialMillsCount(int to, String c, {int from = 0}) {
|
||||||
int n = 0;
|
int n = 0;
|
||||||
String ptBak = Piece.noPiece;
|
String ptBak = Piece.noPiece;
|
||||||
|
|
||||||
assert(0 <= squareSelected && squareSelected < sqNumber);
|
assert(0 <= from && from < sqNumber);
|
||||||
|
|
||||||
if (c == Color.nobody) {
|
if (c == Color.nobody) {
|
||||||
c = colorOn(s);
|
c = colorOn(to);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (squareSelected != 0) {
|
if (from != 0) {
|
||||||
ptBak = board[squareSelected];
|
ptBak = board[from];
|
||||||
board[squareSelected] =
|
board[from] = _grid[squareToIndex[from]] = Piece.noPiece;
|
||||||
_grid[squareToIndex[squareSelected]] = Piece.noPiece;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int l = 0; l < lineDirectionNumber; l++) {
|
for (int l = 0; l < lineDirectionNumber; l++) {
|
||||||
if (c == board[millTable[s][l][0]] && c == board[millTable[s][l][1]]) {
|
if (c == board[millTable[to][l][0]] && c == board[millTable[to][l][1]]) {
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (squareSelected != 0) {
|
if (from != 0) {
|
||||||
board[squareSelected] = _grid[squareToIndex[squareSelected]] = ptBak;
|
board[from] = _grid[squareToIndex[from]] = ptBak;
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
|
@ -1397,7 +1396,7 @@ class Position {
|
||||||
bool isAllInMills(String c) {
|
bool isAllInMills(String c) {
|
||||||
for (int i = sqBegin; i < sqEnd; i++) {
|
for (int i = sqBegin; i < sqEnd; i++) {
|
||||||
if (board[i] == c) {
|
if (board[i] == c) {
|
||||||
if (inHowManyMills(i, Color.nobody) == 0) {
|
if (potentialMillsCount(i, Color.nobody) == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue