#include "bot.hpp" #include "board.hpp" #include "moves.hpp" #include #include int PAWN_VALUE = 100; int KNIGHT_VALUE = 200; int BISHOP_VALUE = 300; int ROOK_VALUE = 400; int QUEEN_VALUE = 900; Move EngineGetBestMove(Board *b) { auto moves = GetLegalMoves(b); std::srand(std::time(0)); // use current time as seed for random generator int random_pos = std::rand() % moves.size(); Move move = moves[random_pos]; return move; } float EvaluateBoard(Board *b) { float score = 0; Board BoardCopy = *b; bool isStaleMate = false; auto legalMoves = GetLegalMoves(&BoardCopy); if (b->state == WHITE_WON) { score = INFINITY; } if (b->state == BLACK_WON) { score = INFINITY * -1; } if (b->state == STALEMATE || b->state == DRAW) { isStaleMate = true; } int white_pawn_count = 0; int white_knight_count = 0; int white_bishop_count = 0; int white_rook_count = 0; int white_queen_count = 0; int black_pawn_count = 0; int black_knight_count = 0; int black_bishop_count = 0; int black_rook_count = 0; int black_queen_count = 0; for (Piece piece : b->pieces) { if (piece.type == NONE) { continue; } if (piece.color) { // white if (piece.type == PAWN) { white_pawn_count++; } if (piece.type == KNIGHT) { white_knight_count++; } if (piece.type == BISHOP) { white_bishop_count++; } if (piece.type == ROOK) { white_rook_count++; } if (piece.type == QUEEN) { white_queen_count++; } continue; } // black if (piece.type == PAWN) { black_pawn_count++; } if (piece.type == KNIGHT) { black_knight_count++; } if (piece.type == BISHOP) { black_bishop_count++; } if (piece.type == ROOK) { black_rook_count++; } if (piece.type == QUEEN) { black_queen_count++; } } score += white_pawn_count * PAWN_VALUE; score += white_knight_count * KNIGHT_VALUE; score += white_bishop_count * BISHOP_VALUE; score += white_rook_count * ROOK; score += white_queen_count * QUEEN_VALUE; score -= black_pawn_count * PAWN_VALUE; score -= black_knight_count * KNIGHT_VALUE; score -= black_bishop_count * BISHOP_VALUE; score -= black_rook_count * ROOK; score -= black_queen_count * QUEEN_VALUE; if (isStaleMate) { return 0; } return score; }