コード例 #1
0
ファイル: Mutare.cs プロジェクト: BogdanFi/Licenta
        public int MinMax(int depth, bool isMaximiser, int alpha, int beta, MainGame m)
        {
            //end of specified traversal length, evaluate board
            if (depth == 0)
            {
                int k = -EvaluateBoard(m);
                return(k);
            }

            List <Mutare> newGameMoves  = new List <Mutare>();
            List <Mutare> pnewGameMoves = new List <Mutare>();

            if (isMaximiser)
            {
                if (m.DatePartidaCastig.Culoare == CuloarePiesa.Negru)
                {
                    pnewGameMoves = m.GetToateMutarilePosibileWhite(m);
                }
                else
                {
                    pnewGameMoves = m.GetToateMutarilePosibileBlack(m);
                }
                newGameMoves = pnewGameMoves.OrderByDescending(o => o.Value).ToList();
                int bestMove = Int32.MinValue;
                for (int i = 0; i < newGameMoves.Count; i++)
                {
                    Mutare myMove        = newGameMoves[i];
                    string tempToName    = m.pieceIdBoard[myMove.To].PieceName;
                    int    tempToValue   = m.pieceIdBoard[myMove.To].PieceValue;
                    string tempFromName  = m.pieceIdBoard[myMove.From].PieceName;
                    int    tempFromValue = m.pieceIdBoard[myMove.From].PieceValue;
                    int    minValue      = m.pieceIdBoard[myMove.To].PieceValue;

                    ExecutaMutarea(m, myMove);

                    bestMove = Math.Max(bestMove, MinMax(depth - 1, false, alpha, beta, m));

                    UndoMove(m, myMove, tempToName, tempToValue, tempFromName, tempFromValue);

                    alpha = Math.Max(alpha, bestMove);
                    if (alpha >= beta)
                    {
                        break;
                    }
                }
                return(bestMove);
            }

            else
            {
                if (m.DatePartidaCastig.Culoare != CuloarePiesa.Negru)
                {
                    pnewGameMoves = m.GetToateMutarilePosibileWhite(m);
                }
                else
                {
                    pnewGameMoves = m.GetToateMutarilePosibileBlack(m);
                }
                newGameMoves = pnewGameMoves.OrderByDescending(o => o.Value).ToList();
                int bestMove = Int32.MaxValue;

                for (int i = 0; i < newGameMoves.Count; i++)
                {
                    Mutare myMove        = newGameMoves[i];
                    int    maxValue      = m.pieceIdBoard[myMove.To].PieceValue;
                    string tempToName    = m.pieceIdBoard[myMove.To].PieceName;
                    int    tempToValue   = m.pieceIdBoard[myMove.To].PieceValue;
                    string tempFromName  = m.pieceIdBoard[myMove.From].PieceName;
                    int    tempFromValue = m.pieceIdBoard[myMove.From].PieceValue;
                    int    minValue      = m.pieceIdBoard[myMove.To].PieceValue;

                    ExecutaMutarea(m, myMove);
                    bestMove = Math.Min(bestMove, MinMax(depth - 1, true, alpha, beta, m));
                    UndoMove(m, myMove, tempToName, tempToValue, tempFromName, tempFromValue);

                    beta = Math.Min(beta, bestMove);

                    if (alpha >= beta)
                    {
                        break;
                    }
                }
                return(bestMove);
            }
        }