public void EnterState() { enabled = true; Simulator currentTable = new Simulator(GameManager.instance.pieces, GameManager.instance.movedPawns, GameManager.instance.currentPlayer, GameManager.instance.otherPlayer); AIEvaluation MiniMaxEval = MiniMax(currentTable, 3, null, Vector2Int.zero); GameManager.instance.Move(MiniMaxEval.piece, MiniMaxEval.move); // Se termina functia in ExistState pentru a continua jocul ExitState(); }
private AIEvaluation MiniMax(Simulator table, int depth, GameObject parentPiece, Vector2Int parentMove) { if (depth == 0) { AIEvaluation retObj = new AIEvaluation(TableEvaluation(table), parentPiece, parentMove); return(retObj); } if (table.currentPlayer.AI) { // Maximizer is the Bot AIEvaluation evaluation = new AIEvaluation(-10000); foreach (GameObject piece in table.currentPlayer.pieces) { foreach (Vector2Int move in table.MovesForPiece(piece)) { Simulator childTable = new Simulator(table.pieces, table.movedPawns, table.currentPlayer, table.otherPlayer); childTable.Move(piece, move); childTable.NextPlayer(); if (depth == 3) { evaluation = AIEvaluation.Max(evaluation, MiniMax(childTable, depth - 1, piece, move)); } else { evaluation = AIEvaluation.Max(evaluation, MiniMax(childTable, depth - 1, parentPiece, parentMove)); } } } return(evaluation); } else { // Minimizer is the Human AIEvaluation evaluation = new AIEvaluation(10000); foreach (GameObject piece in table.currentPlayer.pieces) { foreach (Vector2Int move in table.MovesForPiece(piece)) { Simulator childTable = new Simulator(table.pieces, table.movedPawns, table.currentPlayer, table.otherPlayer); childTable.Move(piece, move); childTable.NextPlayer(); if (depth == 3) { evaluation = AIEvaluation.Min(evaluation, MiniMax(childTable, depth - 1, piece, move)); } else { evaluation = AIEvaluation.Min(evaluation, MiniMax(childTable, depth - 1, parentPiece, parentMove)); } } } return(evaluation); } }
static public AIEvaluation Max(AIEvaluation e1, AIEvaluation e2) { return((e1.value > e2.value) ? e1 : e2); }