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 입력 시 프로그램 종료
틱택토는 코딩 문제로 자주 다뤄지는 주제인 듯하다.
원본보다 테이블을 더 가지런히 하고 줄바꿈을 넣어 더 깔끔하게 보이도록 했다.
그럭저럭 완성한 것 같지만 채점을 돌려보지 못해 어디가 틀렸을지는 모르겠다.
전체적으로 너무 난잡한 코드라 보여주기 부끄럽지만 기록을 위해 남긴다.