public void Start() { // Determine startig player var players = new Player[2]; players[0] = new Player(Mark.O); players[1] = new Player(Mark.X); Console.WriteLine($"Two players crated with Marks {players[0].Mark} and {players[1].Mark}."); // Get random Index of starting Player int playerIx = new Random().Next(0, 1); Console.WriteLine($"Player with Mark {players[playerIx].Mark} starts."); var gameFinnished = false; while (!gameFinnished) { int?freeColumnIx = null; while (!freeColumnIx.HasValue) { int randomVal = new Random().Next(0, 3); freeColumnIx = _grid.checkIfColumnIsFree(randomVal); } // player in term makes the move on the free column Console.WriteLine($"Player {players[playerIx].Mark} adds a Mark to Column {freeColumnIx.Value}"); doTheMove(players[playerIx], freeColumnIx.Value); // check if finnished 'cause of roules var winnerMark = _grid.FindWinnerMark(); gameFinnished = winnerMark != Mark.Empty; // double check if no cheating happens if (gameFinnished && winnerMark != players[playerIx].Mark) { throw new TicTacToeException("Cheating happens!!"); } if (gameFinnished) { Console.WriteLine($"Player {players[playerIx].Mark} won!!!!"); break; } var freeColumn = _grid.FindFreeColumn(); // check if game finnished 'cause its filled gameFinnished = !freeColumn.HasValue; if (gameFinnished) { Console.WriteLine($"Game finnished without a winner."); break; } playerIx = playerIx == 0 ? 1 : 0; // Superquick, superdirty } // _grid.Print(); }