Exemple #1
0
    Move MaxPlay(Connect4Board board, int depth, int alpha = int.MinValue, int beta = int.MaxValue)
    {
        if (depth == 0 || board.Done)
        {
            return new Move {
                       Column = -1, Score = board.EvalScore()
            }
        }
        ;

        var maxMove = new Move {
            Column = -1, Score = int.MinValue
        };
        var possibleColumns = board.GetAvailableColumns();

        for (var i = 0; i < possibleColumns.Count; i++)
        {
            var col      = possibleColumns[i];
            var newBoard = board.GetNewState(BoardTile.CPU, col);

            var nextMove = MinPlay(newBoard, depth - 1, alpha, beta);

            if (maxMove.Column == -1 || nextMove.Score > maxMove.Score)
            {
                maxMove.Column = col;
                maxMove.Score  = nextMove.Score;
                alpha          = nextMove.Score;
            }

            if (alpha >= beta)
            {
                return(maxMove);
            }
        }

        return(maxMove);
    }

    Move MinPlay(Connect4Board board, int depth, int alpha = int.MinValue, int beta = int.MaxValue)
    {
        if (depth == 0 || board.Done)
        {
            return new Move {
                       Column = -1, Score = board.EvalScore()
            }
        }
        ;

        var minMove = new Move {
            Column = -1, Score = int.MaxValue
        };
        var possibleColumns = board.GetAvailableColumns();

        for (var i = 0; i < possibleColumns.Count; i++)
        {
            var col      = possibleColumns[i];
            var newBoard = board.GetNewState(BoardTile.Player, col);

            var nextMove = MaxPlay(newBoard, depth - 1, alpha, beta);

            if (minMove.Column == -1 || nextMove.Score < minMove.Score)
            {
                minMove.Column = col;
                minMove.Score  = nextMove.Score;
                beta           = nextMove.Score;
            }

            if (alpha >= beta)
            {
                return(minMove);
            }
        }

        return(minMove);
    }
}