static void Main(string[] args) { TicTacToeGame game = new TicTacToeGame(); Console.WriteLine("Winning positions for playerO:"); List <Board> history = new List <Board>(); Queue <Board> q = new Queue <Board>(); q.Enqueue(game.GetInitNode()); int total = 0; while (q.Count > 0) { Board b = q.Dequeue(); Board next = b.FindNextMove(9); if (Math.Abs(b.RecursiveScore) >= 200 && next != null) { if (b.RecursiveScore < 0 && !next.GameOver && history.Find(x => Board.IsSimilarBoard(x, b)) == null) { history.Add(b); Console.WriteLine("[{0}] Winner is {1}:\n{2}, next move is:\n{3}", total, b.RecursiveScore < 0 ? "PlayerO" : "PlayerX", b, next); total++; } } else { foreach (Board c in b.GetChildren()) { q.Enqueue(c); } } } bool stop = false; while (!stop) { bool userFirst = false; game = new TicTacToeGame(); Console.WriteLine("User play against computer, Do you place the first step?[y/n]"); if (Console.ReadLine().StartsWith("y", StringComparison.InvariantCultureIgnoreCase)) { userFirst = true; } int depth = 8; Console.WriteLine("Please select level:[1..8]. 1 is easiet, 8 is hardest"); int.TryParse(Console.ReadLine(), out depth); Console.WriteLine("{0} play first, level={1}", userFirst ? "User" : "Computer", depth); while (!game.Current.IsTerminalNode()) { if (userFirst) { game.GetNextMoveFromUser(); game.ComputerMakeMove(depth); } else { game.ComputerMakeMove(depth); game.GetNextMoveFromUser(); } } Console.WriteLine("The final result is \n" + game.Current); if (game.Current.RecursiveScore < -200) { Console.WriteLine("PlayerO has won."); } else if (game.Current.RecursiveScore > 200) { Console.WriteLine("PlayerX has won."); } else { Console.WriteLine("It is a tie."); } Console.WriteLine("Try again?[y/n]"); if (!Console.ReadLine().StartsWith("y", StringComparison.InvariantCultureIgnoreCase)) { stop = true; } } Console.WriteLine("bye"); }