logic
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
namespace CheckersSpielBot
|
||||
{
|
||||
public static class BoardEvaluator
|
||||
{
|
||||
private const int PieceValue = 100;
|
||||
private const int KingValue = 160;
|
||||
|
||||
//Weights (Musst be Balanced To have a good Ai)
|
||||
private const int AdvancementWeight = 5;
|
||||
private const int BackRowWeight = 15;
|
||||
private const int CenterWeight = 10;
|
||||
private const int MobilityWeight = 8;
|
||||
|
||||
public static int Evaluate(int[,] board, int aiPlayer)
|
||||
{
|
||||
int score = 0;
|
||||
int humanPlayer = aiPlayer == 1 ? 2 : 1;
|
||||
|
||||
MoveGeneratorService moveGen = new MoveGeneratorService(board);
|
||||
|
||||
int aiMobility = 0;
|
||||
int humanMobility = 0;
|
||||
|
||||
for (int row = 0; row < 8; row++)
|
||||
{
|
||||
for (int col = 0; col < 8; col++)
|
||||
{
|
||||
int piece = board[row, col];
|
||||
if (piece == 0) continue;
|
||||
|
||||
//Reward For who will play first
|
||||
bool isAi = BoardHelper.BelongsToPlayer(piece, aiPlayer);
|
||||
bool isKing = BoardHelper.IsKing(piece);
|
||||
|
||||
int sign = isAi ? 1 : -1;
|
||||
|
||||
// Material
|
||||
score += sign * (isKing ? KingValue : PieceValue);
|
||||
|
||||
// Advancement — how far the piece has advanced toward promotion
|
||||
int advancement = isAi ? (aiPlayer == 1 ? 7 - row : row) : (aiPlayer == 1 ? row : 7 - row); // Red moves up, Blue moves down
|
||||
|
||||
score += sign * advancement * AdvancementWeight;
|
||||
|
||||
// Back row protection — pieces on starting back row
|
||||
bool onBackRow = isAi ? (aiPlayer == 1 && row == 7) || (aiPlayer == 2 && row == 0) : (aiPlayer == 1 && row == 0) || (aiPlayer == 2 && row == 7);
|
||||
if (onBackRow && !isKing) { score += sign * BackRowWeight; }
|
||||
|
||||
// Center control — [columns:2,3,4,5 && rows:2,3,4,5]
|
||||
if (col >= 2 && col <= 5 && row >= 2 && row <= 5) { score += sign * CenterWeight; }
|
||||
|
||||
// Mobility
|
||||
int moves = moveGen.GetLegalMoves(row, col, capturesOnly: false).Count;
|
||||
|
||||
if (isAi) { aiMobility += moves; }
|
||||
else { humanMobility += moves; }
|
||||
}
|
||||
}
|
||||
|
||||
// Mobility difference
|
||||
score += (aiMobility - humanMobility) * MobilityWeight;
|
||||
|
||||
return score;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user