public int Minimax(Field field, Cell cell, int depth = 1) { if (field.GameOver) { var eval = field.Evaluate(depth); return eval; } var moves = new List<EvaluatedMove>(); foreach (var move in field.AvailableMoves) { var clone = field.Clone().Set(move, cell); var evaluation = new EvaluatedMove() { Move = move, Score = Minimax(clone, cell.Reverse(), depth + 1) }; moves.Add(evaluation); } { } if (cell == Cell.O) { var move = moves.Max(); _move = move.Move; return move.Score; } if (cell == Cell.X) { var move = moves.Min(); _move = move.Move; return move.Score; } throw new Exception("cant evaluate empty cell"); }