Console TicTacToe 만들기

Game Logic

public static class TicTacToe()
{
	private static char[,]? _board;
	private const int Size = 3;
	private static readonly Random Random = new Random();

	// TicTacToe 게임 실행
	public static void TicTacToeGame()
	{
		// 보드를 생성할 size의 보드 할당
		_board = new char[Size,Size];
		// 보드 초기화
		InitBoard();
		// Console에 Board를 표시하기
		DisplayBoard();
		// 플레이 하기
		Play();
	}
}

InitBoard()

  • 2차원 배열을 순회하여 보드 사이 사이에 빈 공백을 넣어 게임 보드를 초기화
  • 총 9칸의 공백이 생성 됨
1 2 3
4 5 6
7 8 9
private static void InitBoard()
{
	for(int i = 0; i < Size; i++)
	{
		for(int j = 0; j < Size; j++)
		{
			if (_board != null) 
			{
				_board[i,j] = ' ';
			}
		}
	}
}

DisplayBoard()

  • 플레이어가 보드를 볼 수 있도록 시각화하여 구분
private static void DisplayBoard()
{
	for (int i = 0; i < Size; i++)  
	{  
		for (int j = 0; j < Size; j++)  
		{  
			if (_board != null)  
			{  
				Console.Write(_board[i, j]);  
			}  
			if (j < Size - 1)  
			{  
				Console.Write("|");  
			}  
		}  
		Console.WriteLine();  
		if (i < Size - 1)  
		{  
			Console.WriteLine("-----");  
		}  
	}
}

Play()

  • 게임 플레이 로직
  • 유저턴과 컴퓨터 턴을 구분하여 번갈아 가면서 실행
  • Console.ReadLine 입력을 받아 디스플레이에 표시
private static void Play()  
{  
	bool isPlayerTurn = true; // 플레이어부터 시작  
	char winner = ' ';  
	while (true) // 또는 승리 조건이 충족될 때까지 루프  
	{  
		if (isPlayerTurn)  
		{  
			Console.Write("공격할 좌표 (예: 0,1) 
							\n[0~2]까지 입력 가능 Player 'X' 입니다.: ");  
			string input = Console.ReadLine();  
			string[] separate = input.Split(',');  
		  
			if (separate.Length != 2 || !int.TryParse(separate[0], out int row)
			|| !int.TryParse(separate[1], out int col)||row < 0||row >= Size
			||col < 0 || col >= Size ||_board[row, col] != ' ')  
			{  
				Console.WriteLine("잘못된 입력입니다. 다시 시도하세요.");  
				continue;  
			}  
		  
			_board[row, col] = 'X'; // 플레이어의 심볼을 'X'로 가정  
			DisplayBoard();  
			winner = CheckForWinner();  
			if (winner != ' ')  
			{  
				Console.WriteLine(winner + " 플레이어가 승리했습니다!");  
				break;  
			}  
			else if (IsBoardFull())  
			{  
				Console.WriteLine("무승부입니다!");  
				break;  
			}  
		}  
		else // 컴퓨터의 턴  
		{  
			TakeComputerTurn();  
			DisplayBoard();  
			winner = CheckForWinner();  
			if (winner != ' ')  
			{  
				Console.WriteLine(winner + " 컴퓨터가 승리했습니다!");  
				break;  
			}  
			else if (IsBoardFull())  
			{  
				Console.WriteLine("무승부입니다!");  
				break;  
			}  
		}  
	  
	// 턴 교대  
	isPlayerTurn = !isPlayerTurn;  
	}  
}
private static void TakeComputerTurn()  
{  
	while (true)  
	{  
		// Random한 ' ' 위치에 'O'표기
		int row = Random.Next(Size);  
		int col = Random.Next(Size);  
		  
		if (_board[row, col] != ' ') continue;  
		_board[row, col] = 'O';  
		break;  
	}  
}  
  
private static char CheckForWinner()  
{  
	// 행 검사  
	for (int row = 0; row < Size; row++)  
	{  
		if (_board[row, 0] != ' ' && _board[row, 0] == _board[row, 1] 
			&&  _board[row, 1] == _board[row, 2])  
		{  
			return _board[row, 0];  
		}  
	}  
	  
	// 열 검사  
	for (int col = 0; col < Size; col++)  
	{  
		if (_board[0, col] != ' ' && _board[0, col] == _board[1, col] 
			&&  _board[1, col] == _board[2, col])  
		{  
			return _board[0, col];  
		}  
	}  
	  
	// 대각선 검사  
	if (_board[0, 0] != ' ' && _board[0, 0] == _board[1, 1] && 
		_board[1, 1] == _board[2, 2])  
	{  
		return _board[0, 0];  
	}  
	  
	if (_board[0, 2] != ' ' &&  _board[0, 2] == _board[1, 1] &&  
		_board[1, 1] == _board[2, 0])  
	{  
		return _board[0, 2];  
	}  
	  
	// 승자가 없는 경우  
	return ' ';  
}  
  
private static bool IsBoardFull()  
{  
	for (int row = 0; row < Size; row++)  
	{  
		for (int col = 0; col < Size; col++)  
		{  
			if (_board[row, col] == ' ')  
			{  
				return false;  
			}  
		}  
	}  
	return true;  
}