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(); } } }
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); }
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); }