private static float StaticEvaluation(Chessboard board, int depth) { if (board.CurrentState == GameState.Checkmate) { // note: the turn is updated even after checkmate return((depth + 1) * ((board.CurrentTeamTurn == TeamColor.Black ? float.MaxValue : float.MinValue) / 100)); } if (board.CurrentState == GameState.Stalemate) { return(0); } float centipawns = 0; foreach ((Pawn, Coordinate)item in board.GetPieces <Pawn>()) { int dangerzoneSum = board.GetDangerSquareSum(item.Item2); if (item.Item1.Color == TeamColor.White) { if (dangerzoneSum <= 0) { continue; } centipawns += 0.05f * (item.Item2.Rank - 1); } else { if (dangerzoneSum >= 0) { continue; } centipawns -= 0.05f * (7 - item.Item2.Rank); } } foreach (var item in board.Dangerzone) { if (item.Key.Rank < 3 || item.Key.Rank > 4) { continue; } if (item.Key.File < 2 || item.Key.File > 5) { continue; } if (item.Value is null) { continue; } int round = board.Moves.Count + 1; foreach (var piece in item.Value) { if (piece is Queen) { continue; } if (piece.Color == TeamColor.White) { centipawns += CenterSquareRawValue / (round * CenterSquareModifier); } else { centipawns -= CenterSquareRawValue / (round * CenterSquareModifier); } } } return(board.MaterialSum + centipawns); }