This commit is contained in:
abdelaziz
2026-03-30 07:49:37 +02:00
parent 9440351bc0
commit bc4118704e
21 changed files with 1785 additions and 124 deletions
+66
View File
@@ -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;
}
}
}