private static INode <ITicTacToeGame> KeepPlayingUntilEndOfGame(MinMaxAlgorithm <ITicTacToeGame> engine, INode <ITicTacToeGame> gamePosition) { while (true) { var currentPositionEvaluation = engine.Evaluate(gamePosition); PrintGame(gamePosition.Value, currentPositionEvaluation.Score); if (currentPositionEvaluation.BestNode == null) { break; } var positionToPlay = ReadNumber(); if (positionToPlay != -1) { var row = Convert.ToInt32(Math.Floor((double)(positionToPlay / BOARD_SIZE))); var column = positionToPlay % BOARD_SIZE; gamePosition = new TicTacToeNode(gamePosition.Value.PlayAt(row, column)); continue; } gamePosition = currentPositionEvaluation.BestNode; } return(gamePosition); }
public static void Main(string[] args) { var engine = new MinMaxAlgorithm <ITicTacToeGame>(new TicTacToeHeuristic(), 5); while (true) { var gamePosition = GenerateEmptyGame(); gamePosition = KeepPlayingUntilEndOfGame(engine, gamePosition); Console.ReadLine(); } }
private void InitAI() { MoveMaker myStrategy = null; EvaluationFunction eval = null; UtilityFunction ufunc = null; //////////////// // your code here to initialize the MinMax algorithm // 1. Evaluation function // 2. Utility function // 3. Strategy (MinMax and MinMax Alpha Beta) /////////////// switch (evalfunc) { case EvaluatationFunc.Eval: eval = new EvaluationFunction(); break; default: Debug.Log("Not an option"); break; } switch (utilfunc) { case UtilityFunc.Util: ufunc = new UtilityFunction(); break; default: Debug.Log("Not an option"); break; } switch (strategy) { case TypeStrategy.RandomStrategy: myStrategy = new RandomSolution(this, GameManager.instance.GetAdversary(this)); break; case TypeStrategy.MinMax: myStrategy = new MinMaxAlgorithm(this, eval, ufunc, GameManager.instance.GetAdversary(this)); break; default: Debug.Log("Not an option"); break; } moveMaker = myStrategy; }
// private variables // Start is called before the first frame update void Start() { minmax = transform.gameObject.AddComponent <MinMaxAlgorithm>(); minmax.ttt = this; //minmax.ttt = this; StartNewGame(); float scale = 2.5f; physicalBoard = new GameObject[3, 3]; Vector3 offset = new Vector3(-2.5f, 0, 0); for (ushort x = 0; x < 3; x++) { for (ushort y = 0; y < 3; y++) { physicalBoard[x, y] = Instantiate(boardTile, transform); physicalBoard[x, y].transform.position = offset + new Vector3(x * scale, 0, y * scale); } } transform.Rotate(new Vector3(180, 0, 0)); peices = new List <GameObject>(); }
public void Setup(BoardManager board, MinMaxAlgorithm algorithm) { this.board = board; this.algorithm = algorithm; CheckFirstPlayer(); }