示例#1
0
        //MiniMax base on number of moves
        static List<int> MiniMaxMove(Board board, int player, int callingPlayer, int maxDepth, int currentDepth)
        {
            // This array contains: bestScore, bestMoveX, bestMoveY in that order
            List<int> miniMaxReturn = new List<int>();
            // This array contains: bestScore, bestMoveX, bestMoveY in that order
            List<int> currentReturn = new List<int>();

            // Check for recursion end
            if (board.IsGameOver(player) || currentDepth == maxDepth)
            {
                miniMaxReturn.Add(board.GetPossibleMoves(callingPlayer).Count);
                miniMaxReturn.Add(-1);
                miniMaxReturn.Add(-1);
                miniMaxReturn.Add(-1);
                miniMaxReturn.Add(-1);

                return miniMaxReturn;
            }

            // Depending on the player we choose a starting bestScore
            // Negative if currentPlayer so we always chose a higher scored board
            if (board.GetCurrentPlayer() == player)
                miniMaxReturn.Add(-int.MaxValue);
            // Positive for opponent so that they always choose a lower scored
            // board
            else
                miniMaxReturn.Add(int.MaxValue);

            // Contains default moveX, moveY
            miniMaxReturn.Add(-1);
            miniMaxReturn.Add(-1);
            miniMaxReturn.Add(-1);
            miniMaxReturn.Add(-1);

            Board newBoard;
            // Recurse for each move
            foreach (List<int> move in board.GetPossibleMoves(player))
            {
                // Get new board configuration
                newBoard = board.MakeMove(move, player);

                // Recurse till return
                currentReturn = MiniMaxMove(newBoard, 1 - player, callingPlayer, maxDepth, currentDepth + 1);

                // Update the best score based on which player is playing
                if (board.GetCurrentPlayer() == player)
                {
                    if (currentReturn[0] > miniMaxReturn[0])
                    {
                        miniMaxReturn.Clear();
                        miniMaxReturn.Add(currentReturn[0]);
                        //miniMaxReturn[0] = currentReturn[0];
                        foreach(int val in move)
                            miniMaxReturn.Add(val);
                    }
                }
                else
                {
                    if (currentReturn[0] < miniMaxReturn[0])
                    {
                        miniMaxReturn.Clear();
                        miniMaxReturn.Add(currentReturn[0]);
                        //miniMaxReturn[0] = currentReturn[0];
                        foreach (int val in move)
                            miniMaxReturn.Add(val);
                    }
                }
            }

            return miniMaxReturn;
        }