using OECS; namespace TicTacToe; /// /// Prints the board to the console. /// public class RenderSystem : ISystem { public void Run(World world) { var state = world.ReadSingleton(); // Build a 3×3 grid. var grid = new char[3, 3]; for (int r = 0; r < 3; r++) for (int c = 0; c < 3; c++) grid[r, c] = '.'; // Fill in placed marks using the iterator API. using var markIter = world.Select(); while (markIter.MoveNext()) { grid[markIter.Current1.Row, markIter.Current1.Col] = markIter.Current2.Player == Player.X ? 'X' : 'O'; } Console.WriteLine(); Console.WriteLine(" Tic-Tac-Toe"); Console.WriteLine(" ═══════════"); Console.WriteLine(); Console.WriteLine(" 0 1 2"); Console.WriteLine(" ┌───┬───┬───┐"); for (int r = 0; r < 3; r++) { Console.Write($"{r} │"); for (int c = 0; c < 3; c++) { Console.Write($" {grid[r, c]} "); if (c < 2) Console.Write("│"); } Console.WriteLine("│"); if (r < 2) Console.WriteLine(" ├───┼───┼───┤"); } Console.WriteLine(" └───┴───┴───┘"); Console.WriteLine(); // Status line. var statusText = state.Status switch { GameStatus.Playing => $"{(state.CurrentPlayer == Player.X ? 'X' : 'O')}'s turn (move {state.MoveCount + 1})", GameStatus.XWon => "X wins!", GameStatus.OWon => "O wins!", GameStatus.Draw => "It's a draw!", _ => "" }; Console.WriteLine($" {statusText}"); Console.WriteLine(); Console.Write(" Enter row col (e.g. \"1 2\"): "); } }