⚙️ 알고리즘/기타 문제 & 풀이

[C] 3X3 게임판의 Tic-Tac-Toe

dev_zoe 2020. 7. 17. 22:51
반응형

Tic-Tac-Toe : 3x3으로 이루어진 게임판에서의 오목게임

O와 X를 번갈아 그리며 가로, 세로, 대각선에서 심볼 3개가 먼저 만들어지면 우승한다.

 

입력: Tic-Tac-Toe에 입력할 심볼의 좌표값을 번갈아 입력한다.

출력: O 혹은 X가 그려진 게임판이 출력되며 둘 중에 한명이 우승한 경우 누가 우승했는지 출력하고 종료한다.

입력 프롬트

입력값

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

Player X(행 열):

1 1

0 0

0 1

1 0

2 1

입력 프롬트

입력값

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

Player X(행 열):

2 2

1 1

2 1

1 2

2 0

입력 프롬트

입력값

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

1 2

1 1

2 2

0 2

0 0

2 0

입력 프롬트

입력값

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

1 2

1 1

0 2

0 0

2 0

2 2

입력 프롬트

입력값

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

Player X(행 열):

Player O(행 열):

Player X(행 열):

1 1

0 0

0 1

2 1

2 0

0 2

1 2

1 0

2 2

#include <stdio.h>
#define WIDTH 3
#define HEIGHT 3

int winCheck(int sum)
{
	if (sum == 3)
	{
		printf("Player X wins!\n");
		return 1;
	}
	else if (sum == -3)
	{
		printf("Player O wins!\n");
		return 1;
	}

	return 0; //아무도 안이김
}

int win(int b[][HEIGHT])
{
	int i, j;
	int sum;
	// 가로로 세개씩 체크
	for (i = 0; i < WIDTH; i++)
	{
		sum = 0; //각각 체크해야하므로 매번 초기화
		for (j = 0; j < HEIGHT; j++)
			sum += b[i][j];

		if (winCheck(sum)) return 1;
	}

	// 세로로 세개씩 체크
	for (j = 0; j< HEIGHT; j++)
	{
		sum = 0;
		for (i = 0; i < WIDTH; i++)
			sum += b[i][j];
		if (winCheck(sum)) return 1;
	}
	// 대각선 체크
	sum = 0;
	for (i = 0; i < WIDTH; i++)
	{
		sum += b[i][i];
	}
	if (winCheck(sum)) return 1;

	// 역대각선 체크
	sum = 0;
	for (i = 0; i < WIDTH; i++) 
	{
		sum += b[i][WIDTH-1- i];
	}
	if (winCheck(sum)) return 1;

	return 0;
}

void display(int b[][HEIGHT])
{
	char ch;
	int i, j;

	printf("    0 1 2\n");
	printf("   ------\n");
	for (i = 0; i < WIDTH; i++) 
	{
		printf("%d |", i);
		for (j = 0; j < HEIGHT; j++) 
		{
			if (b[i][j] == 1)
				ch = 'X';
			else if (b[i][j] == -1)
				ch = 'O';
			else
				ch = ' ';
			printf(" %c", ch);
		}
		printf("\n");
	}
}

int main(void)
{
	int board[3][3];
	char turn = 'X'; //처음 turn을 X로 시작

	int r, c;
	int i, j;
	int count;
	int lose;

	for (i = 0; i < WIDTH; i++)
		for (j = 0; j < HEIGHT; j++)
			board[i][j] = 0;

	count = 0;
	display(board);

	do
	{
		printf("Player %c(행 열):", turn);
		scanf("%d %d", &r, &c);
		printf("\n");

		if (board[r][c]) //이미 채워져있으면 다시 입력 프롬프트 실행
			continue;		//코드 이전부분으로 돌아감
			
		count++; //심볼이 입력된 횟수 증가

		if (turn == 'X') {

			board[r][c] = 1;
			turn = 'O'; //턴을 바꿔줌
		}
		else {
			board[r][c] = -1;
			turn = 'X';
		}
		display(board);

	} while ((lose = !win(board)) && count < 9); //count가 9 미만이면 3x3 판 기준으로 다 채워지지 않은 상태

	if (lose && count == 9)
		printf("Nobody wins!\n");
}
반응형