using System.Collections.Generic;
using System.Security.Cryptography;
public static void Main()
var games = new List<Player>();
for(var i = 0; i < 1000; i++)
var ttt = new TicTacToe();
(state, winner) = ttt.GetWinner();
ttt.CurrentPlayer = ttt.CurrentPlayer == Player.X ? Player.O : Player.X;
} while (state == GameState.Running);
Console.Write("Game over... ");
Console.WriteLine((state == GameState.Tie) ? "it was a tie" : $"{winner} wins!");
Console.WriteLine($"Ties: {games.Count(o => o == Player.None)} / {games.Count}");
Console.WriteLine($"X Wins: {games.Count(o => o == Player.X)} / {games.Count}");
Console.WriteLine($"O Wins: {games.Count(o => o == Player.O)} / {games.Count}");
public enum Player { None, X, O }
public enum GameState { Running, Winner, Tie }
private readonly Player[] _board = new[]
Player.None, Player.None, Player.None,
Player.None, Player.None, Player.None,
Player.None, Player.None, Player.None
public int Moves { get; set; } = 0;
public Player CurrentPlayer { get; set; } = Player.X;
if (!TryGetMove(CurrentPlayer, out int move))
_board[move] = CurrentPlayer;
public bool TryGetMove(Player p, out int move)
if (!_board.Any(o => o == Player.None))
m = RandomNumberGenerator.GetInt32(9);
} while (_board[m] != Player.None);
public (GameState, Player) GetWinner()
for (var i = 0; i < 3; i++)
if (_board[i * 3] != Player.None && _board[i * 3] == _board[i * 3 + 1] && _board[i * 3 + 1] == _board[i * 3 + 2])
return (GameState.Winner, _board[i * 3]);
if (_board[i] != Player.None && _board[i] == _board[i + 3] && _board[i + 3] == _board[i + 6])
return (GameState.Winner, _board[i]);
if (_board[0] != Player.None && _board[0] == _board[4] && _board[4] == _board[8])
return (GameState.Winner, _board[0]);
if (_board[6] != Player.None && _board[6] == _board[4] && _board[4] == _board[2])
return (GameState.Winner, _board[6]);
return _board.Any(o => o == Player.None) ? (GameState.Running, Player.None) : (GameState.Tie, Player.None);
private string GetCh(int move) => _board[move] == Player.None ? " " : _board[move].ToString();
Console.WriteLine($"{GetCh(0)}|{GetCh(1)}|{GetCh(2)}");
Console.WriteLine("-+-+-");
Console.WriteLine($"{GetCh(3)}|{GetCh(4)}|{GetCh(5)}");
Console.WriteLine("-+-+-");
Console.WriteLine($"{GetCh(6)}|{GetCh(7)}|{GetCh(8)}");
Console.WriteLine($"{Moves} move{(Moves == 1 ? "" : "s")}");