예제 #1
0
    Result MiniMax(ChessGameMgr.BoardState board, ChessGameMgr.EChessTeam team, int currentDepth, int alpha, int beta)
    {
        aiCount++;
        ChessGameMgr.EChessTeam otherTeam = (team == ChessGameMgr.EChessTeam.White) ? ChessGameMgr.EChessTeam.Black : ChessGameMgr.EChessTeam.White;
        if (board.DoesTeamLoseForCustomBoard(ChessGameMgr.EChessTeam.White, board) || board.DoesTeamLoseForCustomBoard(ChessGameMgr.EChessTeam.Black, board) || currentDepth == maxDepth)
        {
            Result res = new Result();
            res.score = ChessGameMgr.Instance.Evaluate(team, board);
            return(res);
        }

        ChessGameMgr.Move bestMove = new ChessGameMgr.Move();
        int bestScore = int.MaxValue;


        if (ChessGameMgr.Instance.TeamTurn == team)
        {
            bestScore = int.MinValue;
        }

        List <ChessGameMgr.Move> moves = new List <ChessGameMgr.Move>();

        ChessGameMgr.Instance.GetBoardState().GetValidMoves(team, moves);

        foreach (ChessGameMgr.Move move in moves)
        {
            ChessGameMgr.BoardState newBoard = board.Clone();

            ChessGameMgr.PieceData dataFrom = newBoard.bitBoard.GetPieceFromPos(move.From);
            ChessGameMgr.PieceData dataTo   = newBoard.bitBoard.GetPieceFromPos(move.To);

            ChessGameMgr.Instance.MakeMove(team, move, newBoard);
            ChessGameMgr.Instance.UpdatePieces(newBoard);

            // recurse MiniMax
            Result recursedRes = MiniMax(newBoard, otherTeam, currentDepth + 1, alpha, beta);

            ChessGameMgr.Move tmpMove = new ChessGameMgr.Move();
            tmpMove.From = move.To;
            tmpMove.To   = move.From;
            ChessGameMgr.Instance.MakeMove(team, tmpMove, newBoard);
            if (dataTo.piece != ChessGameMgr.EPieceType.None)
            {
                newBoard.SetPieceAtSquare(dataTo.pos, dataTo.team, dataTo.piece);
            }

            ChessGameMgr.Instance.UpdatePieces(newBoard);

            // update the best score
            if (ChessGameMgr.Instance.TeamTurn == team)
            {
                if (recursedRes.score > bestScore) // maximize score
                {
                    bestScore = recursedRes.score;
                    bestMove  = move;
                }
                alpha = Mathf.Max(alpha, bestScore);
            }
            else
            {
                if (recursedRes.score < bestScore) // minimize score
                {
                    bestScore = recursedRes.score;
                    bestMove  = move;
                }
                beta = Mathf.Min(beta, bestScore);
            }

            if (beta <= alpha)
            {
                break;
            }
        }
        Result bestRes = new Result();

        bestRes.move  = bestMove;
        bestRes.score = bestScore;

        return(bestRes);
    }
예제 #2
0
 public Result(ChessGameMgr.Move _move, int _score)
 {
     move  = _move;
     score = _score;
 }