Пример #1
0
 public void setWinProbabilities()
 {
     if (gameCount < 1000 && !IsOver)
     {
         int count = 0;
         int tempKey;
         BSTNode <GameState> tempNode;
         winProbability1 = 0;
         winProbability2 = 0;
         foreach (Move move in statePossibleMoves)
         {
             tempKey  = CalculateChildId(move.DestinationTile.TileNum);
             tempNode = stateTree.Find(tempKey);
             double tempWinProbability1 = tempNode.Value.WinProbability1;
             double tempWinProbability2 = tempNode.Value.winProbability2;
             winProbability1 += tempWinProbability1;
             winProbability2 += tempWinProbability2;
             count++;
         }
         winProbability1 /= count;
         winProbability2 /= count;
         if (stateTree.Count == 2706)
         {
             setBestMove();
         }
     }
     else
     {
         if (player1Turn)
         {
             if (winCount > 0)
             {
                 winProbability1 = (winCount - lossCount) * 100 / (winCount + lossCount);
             }
             else
             {
                 winProbability1 = 0;
             }
         }
         else
         {
             if (lossCount > 0)
             {
                 winProbability1 = (lossCount - winCount) * 100 / (winCount + lossCount);
             }
             else
             {
                 winProbability1 = 0;
             }
         }
         if (winProbability1 > 0)
         {
             winProbability2 = -winProbability1;
         }
         if (stateTree.Count == 2706)
         {
             setBestMove();
         }
     }
 }
Пример #2
0
        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);
        }
Пример #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);
        }