public int MakeMoveRandom(Game currentGame)
        {
            Move nextMove;
            int  outcome;
            BSTNode <GameState> currentNode = finalTree.Find(currentGame.GetStateId());
            GameState           currentState;

            if (currentNode == finalTree.NullNode)
            {
                currentState = new GameState(currentGame.GetStateId(), currentGame.FindPossibleMoves(), currentGame.IsPlayer1Turn(), -101, -101, ref finalTree);
                currentNode  = new BSTNode <GameState>(currentState.Id, currentState);
                finalTree.Insert(currentNode);
            }
            else
            {
                currentState = currentNode.Value;
            }
            nextMove = FindRandomMove(currentGame);
            currentGame.MakeMove(nextMove);


            if (currentGame.CheckForWin())
            {
                outcome = -1;
                currentState.WinProbability1 = currentGame.IsPlayer1Turn() ? -1 : 1;
                currentState.WinProbability2 = -1 * currentState.WinProbability1;
            }
            else if (currentGame.CheckForDraw())
            {
                outcome = 0;
                currentState.WinProbability1 = currentGame.IsPlayer1Turn() ? -1 : 1;
                currentState.WinProbability2 = currentState.WinProbability1;
            }
            else
            {
                outcome = -1 * MakeMoveRandom(currentGame);
            }
            currentState.AddGame(outcome);
            return(outcome);
        }
        private static bool  InputNode(StreamReader streamReader, ref BST <GameState> tree)
        {
            string nodeKeyString   = streamReader.ReadLine();
            string nodeValueString = streamReader.ReadLine();

            if (nodeValueString == null)
            {
                return(false);
            }
            if (nodeValueString.Length >= 27)
            {
                int nodeKey = int.Parse(nodeKeyString);

                GameState           nodeValue = new GameState(nodeValueString, ref tree);
                BSTNode <GameState> node      = new BSTNode <GameState>(nodeKey, nodeValue);
                tree.Insert(node);
            }
            return(true);
        }
Exemple #3
0
        public bool makeMove(Game currentGame, Move move, int level)
        {
            //Console.WriteLine("Level:" + level);
            if (!currentGame.MakeMove(move))
            {
                return(false);
            }

            int id = currentGame.GetStateId();

            //Console.WriteLine("Id: " + id);
            if (stateTree.Find(id) == stateTree.NullNode)
            {
                moveCount++;
                //Console.WriteLine(moveCount);
                if (currentGame.CheckForWin())
                {
                    Move[] moves = new Move[0];
                    //Console.WriteLine("Level " + level);
                    //Console.WriteLine("Id: " + id);
                    //Console.WriteLine("Move: " + moveCount);
                    //Console.WriteLine(currentGame.GameBoard.BoardState.RenderAsString());

                    if (currentGame.IsPlayer1Turn())
                    {
                        GameState           winState = new GameState(id, moves, true, -100, 100, ref stateTree);
                        BSTNode <GameState> winNode  = new BSTNode <GameState>(id, winState);
                        stateTree.Insert(winNode);
                    }
                    else
                    {
                        GameState           winState = new GameState(id, moves, false, 100, -100, ref stateTree);
                        BSTNode <GameState> winNode  = new BSTNode <GameState>(id, winState);
                        stateTree.Insert(winNode);
                    }
                }
                else if (currentGame.CheckForDraw())
                {
                    //Console.WriteLine("Level: " + level);
                    //Console.WriteLine("Id: " + id);
                    //Console.WriteLine("Move: " + moveCount);
                    //Console.WriteLine(currentGame.GameBoard.BoardState.RenderAsString());

                    Move[]              moves     = new Move[0];
                    GameState           drawState = new GameState(id, moves, currentGame.IsPlayer1Turn(), 0, 0, ref stateTree);
                    BSTNode <GameState> drawNode  = new BSTNode <GameState>(id, drawState);
                    stateTree.Insert(drawNode);
                }
                else
                {
                    Move[] possibleMoves = currentGame.FindPossibleMoves();

                    GameState           newState = new GameState(id, possibleMoves, currentGame.IsPlayer1Turn(), -101, -101, ref stateTree);
                    BSTNode <GameState> newNode  = new BSTNode <GameState>(id, newState);
                    stateTree.Insert(newNode);
                    foreach (Move currentMove in possibleMoves)
                    {
                        makeMove(currentGame.Copy(), currentMove, level + 1);
                    }
                }
            }
            return(true);
        }