|
@@ -74,14 +74,27 @@ std::pair<Move, MoveValue> chessy::miniMax(ChessGame& cg, int depth)
|
|
generateAllMoves<WHITE_SIDE>(cg, moves);
|
|
generateAllMoves<WHITE_SIDE>(cg, moves);
|
|
else
|
|
else
|
|
generateAllMoves<BLACK_SIDE>(cg, moves);
|
|
generateAllMoves<BLACK_SIDE>(cg, moves);
|
|
|
|
+
|
|
|
|
+ const Board& b = cg.getBoard();
|
|
|
|
+ auto isCheck = [&cg, &b] () {
|
|
|
|
+ return cg.getTurn() == BLACK_SIDE ? b.isCheck<WHITE_SIDE>() :
|
|
|
|
+ b.isCheck<BLACK_SIDE>();
|
|
|
|
+ };
|
|
|
|
+
|
|
Move bestMove{ 0, 0 };
|
|
Move bestMove{ 0, 0 };
|
|
- //MoveValue best = -1e+30;
|
|
|
|
MoveValue alpha = -1e+30;
|
|
MoveValue alpha = -1e+30;
|
|
MoveValue beta = 1e+30;
|
|
MoveValue beta = 1e+30;
|
|
for (Move move : moves) {
|
|
for (Move move : moves) {
|
|
MoveInfo mi{ move, cg };
|
|
MoveInfo mi{ move, cg };
|
|
UndoInfo ui = cg.doMove(mi);
|
|
UndoInfo ui = cg.doMove(mi);
|
|
- MoveValue val = -negamaxImplementation(cg, depth - 1, -beta, -alpha);
|
|
|
|
|
|
+ MoveValue val;
|
|
|
|
+ if (isCheck()) {
|
|
|
|
+ cg.undoMove(ui);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ val = -negamaxImplementation(cg, depth - 1, -beta, -alpha);
|
|
|
|
+ }
|
|
//cout << move.asString() << ": " << val << ", " << best << ((val > best) ? " good" : " bad") << endl;
|
|
//cout << move.asString() << ": " << val << ", " << best << ((val > best) ? " good" : " bad") << endl;
|
|
//MoveValue val = 0.0;
|
|
//MoveValue val = 0.0;
|
|
cg.undoMove(ui);
|
|
cg.undoMove(ui);
|
|
@@ -104,26 +117,26 @@ MoveValue chessy::negamaxImplementation(ChessGame& cg, int depth,
|
|
return evaluate<BLACK_SIDE>(cg);
|
|
return evaluate<BLACK_SIDE>(cg);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ const Board& b = cg.getBoard();
|
|
|
|
+ auto isCheck = [&cg, &b] () {
|
|
|
|
+ return cg.getTurn() == BLACK_SIDE ? b.isCheck<WHITE_SIDE>() :
|
|
|
|
+ b.isCheck<BLACK_SIDE>();
|
|
|
|
+ };
|
|
|
|
+
|
|
std::vector<Move> moves;
|
|
std::vector<Move> moves;
|
|
if (cg.getTurn() == WHITE_SIDE)
|
|
if (cg.getTurn() == WHITE_SIDE)
|
|
generateAllMoves<WHITE_SIDE>(cg, moves);
|
|
generateAllMoves<WHITE_SIDE>(cg, moves);
|
|
else
|
|
else
|
|
generateAllMoves<BLACK_SIDE>(cg, moves);
|
|
generateAllMoves<BLACK_SIDE>(cg, moves);
|
|
|
|
|
|
- const Board& b = cg.getBoard();
|
|
|
|
for (Move move : moves) {
|
|
for (Move move : moves) {
|
|
MoveInfo mi{ move, cg };
|
|
MoveInfo mi{ move, cg };
|
|
UndoInfo ui = cg.doMove(mi);
|
|
UndoInfo ui = cg.doMove(mi);
|
|
- /*Index king = b.getKing<side>().getLeastSignificantBit();
|
|
|
|
- if((KnightMoveGenerator{ king }.getBitboard() &
|
|
|
|
- b.getKnights<otherSide(side)>()) ||
|
|
|
|
- (PrimitiveBishopMoveGenerator{ king, b.get<otherSide(side)>(),
|
|
|
|
- b.get<side>() }.getBitboard() & (b.getBishops<otherSide(side)>() |
|
|
|
|
- b.getQueens<otherSide(side)>())) ||
|
|
|
|
- PrimitiveRookMoveGenerator{ king, b.get<otherSide(side)>(),
|
|
|
|
- b.get<side>() }.getBitboard() & (b.getRooks<otherSide(side)>() |
|
|
|
|
- b.getQueens<otherSide(side)>()))*/
|
|
|
|
- MoveValue val = -negamaxImplementation(cg, depth - 1, -beta, -alpha);
|
|
|
|
|
|
+ MoveValue val;
|
|
|
|
+ if (isCheck())
|
|
|
|
+ val = -1e+30;
|
|
|
|
+ else
|
|
|
|
+ val = -negamaxImplementation(cg, depth - 1, -beta, -alpha);
|
|
cg.undoMove(ui);
|
|
cg.undoMove(ui);
|
|
if(val >= beta)
|
|
if(val >= beta)
|
|
return beta;
|
|
return beta;
|