본문 바로가기

프로그래밍/코딩 첫 걸음

21-05-07

1. Tic-Tac-Toe

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	char board[3][3];
	int x, y, k, i, m;
	int end = 0;  
	// 9번째 수를 두면서 승패가 결정나는 경우, 
   	// 무승부 메세지와 승리 메세지 둘 다 출력되는 경우를 방지하기 위해 설정
    
	// 보드를 초기화한다.
	for (x = 0; x < 3; x++)
		for (y = 0; y < 3; y++) board[x][y] = ' ';

	// 사용자로부터 위치를 받는다.
	for (k = 0; k < 9; k++) 
	{
		printf("(x, y) 좌표: ");
		scanf(" %d %d", &x, &y);

		// 이미 둔 곳에 다시 두려고 할 때 출력하는 메세지
		if (board[x][y] == 'O' || board[x][y] == 'X')
		{
			printf("이미 둔 곳입니다.\n\n");
			k -= 1;  // k에서 1을 빼주지 않으면 차례가 넘어가 버린다.
			continue;  // 기억해 내느라 고생했다.
		}

		// 둘 수 없는 곳에 두려고 할 때 출력하는 메세지
		if (x > 2 || y > 2 || x < -1 || y < -1)
		{
			printf("둘 수 없는 곳입니다.\n\n");
			k -= 1;
			continue;
		}
		if (x == -1 && y == -1) break;

		// 순번에 따라 'X', 'O'를 입력받은 위치에 저장
		board[x][y] = (k % 2 == 0) ? 'O' : 'X';  // O부터 시작하도록 설정

		// 보드를 화면에 그린다.
		for (i = 0; i < 3; i++) {
			printf("---|---|---\n");
			printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		}
		printf("---|---|---\n\n");

		// 전체적으로 엄청 난잡하다. 남에게 보여주기 부끄러운 코드.
		for (m = 0; m <= 2; m++)
		{
			if (board[m][0] == board[m][1] && board[m][1] == board[m][2] && board[m][0] != ' ')
			{
				printf("%c 가 이겼습니다.\n", board[m][0]);
				end = 1;
				goto EXIT;  // goto함수를 쓰고 싶진 않지만, 적절한 함수를 찾지 못하겠다.
			}
			if (board[0][m] == board[1][m] && board[1][m] == board[2][m] && board[0][m] != ' ')
			{
				printf("%c 가 이겼습니다.\n", board[0][m]);
				end = 1;
				goto EXIT;
			}
		}
		if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		{
			printf("%c 가 이겼습니다.\n", board[1][1]);
			end = 1;
			break;
		}
		if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
		{
			printf("%c 가 이겼습니다.\n", board[1][1]);
			end = 1;
			break;
		}
	}
	EXIT:
	if (k == 9 && end != 1)
		printf("비겼습니다.\n");

	else return 0;
}

 

5차 과제로 나온 문제.

틱택토 게임을 구현하되, 요구되는 규칙은 다음과 같다.

 

  • O부터 시작할 것
  • 보드 외의 영역에 착수 금지
  • 중복 착수 금지
  • 착수 금지인 곳에 두려고 하더라도 순서가 넘어가지 말 것
  • 무승부 시 무승부 메세지 출력
  • 승리할 경우 승리 메세지 출력 후 프로그램 종료
  • -1 -1 입력 시 프로그램 종료

틱택토는 코딩 문제로 자주 다뤄지는 주제인 듯하다.

원본보다 테이블을 더 가지런히 하고 줄바꿈을 넣어 더 깔끔하게 보이도록 했다. 

그럭저럭 완성한 것 같지만 채점을 돌려보지 못해 어디가 틀렸을지는 모르겠다.

전체적으로 너무 난잡한 코드라 보여주기 부끄럽지만 기록을 위해 남긴다.

 

'프로그래밍 > 코딩 첫 걸음' 카테고리의 다른 글

21-05-18  (0) 2021.05.18
21-05-17  (0) 2021.05.17
21-05-15  (0) 2021.05.15
21-05-06  (0) 2021.05.06
21-05-05  (0) 2021.05.05