public Field Clone() { var temp = new Field(); for (var i=0;i<TOTAL;i++) { temp._cells[i] = _cells[i]; } return temp; }
static void Main(string[] args) { var field = new Field(); while (!field.GameOver) { Console.WriteLine(field.ToString()); field.UserMove(); field.CPUMove(); } Console.WriteLine(field.ToString()); }
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"); }