Ejemplo n.º 1
0
        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);
        }