private GameValue Solve(GameStateT state) { bool winFlag = false; var serialized = Game.SerializeState(state); if (Memory.ContainsKey(serialized)) { return(Memory[serialized]); } var primitive = Game.PrimitiveValue(state); if (primitive != GameValue.Undecided) { Memory[serialized] = primitive; return(primitive); } foreach (var move in Game.GenerateMoves(state)) { var newState = Game.DoMoveOnState(state, move); if (Solve(newState) == GameValue.Lose) { Memory[serialized] = GameValue.Win; winFlag = true; } } if (!winFlag) { Memory[serialized] = GameValue.Lose; } return(winFlag ? GameValue.Win : GameValue.Lose); }
public override AbstractGameMove GetMove(AbstractGameState gameState) { var moveList = Game.GenerateMoves(gameState); foreach (var move in moveList) { var newState = Game.DoMoveOnState(gameState, move); if (Memory[Game.SerializeState(newState)] == GameValue.Win) { return(move); } } return(moveList[0]); }
private GameValue Solve(GameStateT state) { bool winFlag = false; bool tieFlag = false; var serialized = Game.SerializeState(state); if (Memory.ContainsKey(serialized)) { return(Memory[serialized]); } var primitive = Game.PrimitiveValue(state); if (primitive != GameValue.Undecided) { SetMemoryForAllSymmetry(primitive, Game.SerializeStateList(state)); return(primitive); } var moveList = Game.GenerateMoves(state); foreach (var move in moveList) { var newState = Game.DoMoveOnState(state, move); var result = Solve(newState); if (result == GameValue.Lose) { winFlag = true; //break; } else if (result == GameValue.Tie) { tieFlag = true; } } if (!winFlag) { if (tieFlag) { SetMemoryForAllSymmetry(GameValue.Tie, Game.SerializeStateList(state)); return(GameValue.Tie); } else { SetMemoryForAllSymmetry(GameValue.Lose, Game.SerializeStateList(state)); return(GameValue.Lose); } } SetMemoryForAllSymmetry(GameValue.Win, Game.SerializeStateList(state)); return(GameValue.Win); }
public override GameMoveT GetMove(GameStateT gameState) { var moveList = Game.GenerateMoves(gameState); return(moveList[37 % moveList.Count]); }