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