U E D R , A S I H C RSS

최다인/TicTacTok (rev. 1.1)

최다인/Tic Tac Tok

  • 2013년 8월 23일 개발

#include <stdio.h>
#include <stdlib.h> //srand 사용을 위한 헤더
#include <time.h>
#include <Windows.h> //커서의 위치를 바꾸는 함수를 위한 헤더

void gotoxy(int x, int y); //커서의 위치를 바꾸는 함수
void tictacMain(char mark[3][3]); //tic-tac-tok 게임의 판을 출력하는 함수
void UserInput(char mark[3][3]); //User가 말을 놓을 자리를 입력받는 함수
void ComInput(char mark[3][3]); //Computer가 말을 놓는 자리를 결정하는 함수
int End(char mark[3][3]); //승패를 판별하는 함수

int main()
{
	char mark[3][3] = {{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}}; //배열을 선언, 초기화
	int i;

	srand(time(NULL)); //rand함수를 좀 더 완전하게 사용하기 위해 seed 초기화

	for(i=0;i<5;i++)  //무승부를 판별하기 위해 유저의 말 입력 횟수를 5번으로 한정
	{
		gotoxy(1,1); //커서가 처음으로 돌아감
		tictacMain(mark);
		UserInput(mark);
		
		if(End(mark)==0)
		{
			tictacMain(mark);
			gotoxy(1,16);
			system("pause");
			return 0;
		}	//승패를 판별하여 게임이 끝난 경우 종료

		if(i==4)
			break; //유저가 5번째 말을 놓았을 때, 승패가 판별되지 않은 경우 반복문을 빠져나간다.

		ComInput(mark);

		if(End(mark)==0)
		{	
			tictacMain(mark);
			gotoxy(1,16);
			system("pause");
			return 0;
		}	//승패를 판별하여 게임이 끝난 경우 종료
	}

	gotoxy(1,13);
	printf("무승부입니다.");	//반복문에서 빠져나왔을 때 무승부임을 출력한다.

	system("pause");
	return 0;
}

void gotoxy(int x, int y)
{
	COORD Pos = {x-1,y-1};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Pos);
}	//커서의 위치를 옮기는 함수

void tictacMain(char mark[3][3])	//각 말의 위치를 저장하는 배열을 입력받아 게임판의 형태로 출력하는 함수
{
	gotoxy(1,1);
	printf("    1   2   3\n");
	printf("  +---+---+---+\n");
	printf("1 | %c | %c | %c |\n",mark[0][0],mark[0][1],mark[0][2]);
	printf("  +---+---+---+\n");
	printf("2 | %c | %c | %c |\n",mark[1][0],mark[1][1],mark[1][2]);
	printf("  +---+---+---+\n");
	printf("3 | %c | %c | %c |\n",mark[2][0],mark[2][1],mark[2][2]);
	printf("  +---+---+---+\n\n");
}

void UserInput(char mark[3][3])
{
	int row, column;	//행과 열의 변수

	gotoxy(1,10);
	printf("                                                     ");
	gotoxy(1,10);
	printf("사용자 : (");
	scanf("%d",&row);
	gotoxy(12,10);
	printf(",");
	scanf("%d",&column);
	gotoxy(14,10);
	printf(")\n");	//행과 열을 입력받는다.

	if(mark[row-1][column-1]!=' ')
		UserInput(mark);	//만약 입력받은 자리가 NULL값이 아니라면(==이미 말이 있다면) 다시 입력받는다.
	else if(mark[row-1][column-1]==' ')
		mark[row-1][column-1]='O';	//입력받은 자리가 NULL값이라면 O를 저장한다.
}

void ComInput(char mark[3][3])
{
	int row, column;	//행과 열의 변수

	row = rand()%3;		//row변수에 0~2 사이의 랜덤한 값을 저장한다.
	column = rand()%3;	//column변수에 0~2 사이의 랜덤한 값을 저장한다.

	if(mark[row][column]!=' ')
		ComInput(mark);	//만약 저장된 자리가 NULL값이 아니라면(==이미 말이 있다면) 다시 값을 랜덤하게 돌린다.
	else if(mark[row][column]==' ')
	{
		mark[row][column]='X';
		printf("컴퓨터 : (%d,%d)\n",row+1,column+1);	//입력받은 자리가 NULL값이라면 X를 저장한다.
	}
}

int End(char mark[3][3])
{
	int i,k;

	for(i=0;i<3;i++)	//세로로 한 줄을 완성한 경우 승패를 판별하기 위해 3번 반복한다.
	{
		if(mark[0][i]!=' ' && mark[1][i]==mark[0][i] && mark[2][i]==mark[1][i])	//세로로 한 줄이 전부 같은 문자인 경우,
		{
			gotoxy(1,13);
			
			if(mark[0][i]=='O')
				printf("축하합니다! 승리하셨습니다.");	//그 문자가 O 이면 승리 출력
			if(mark[0][i]=='X')
				printf("아쉽습니다, 패배하셨습니다.");	//그 문자가 X 이면 패배 출력

			return 0;
		}
	}

	for(k=0;k<3;k++)	//가로로 한 줄을 완성한 경우 승패를 판별하기 위해 3번 반복한다.
	{
		if(mark[k][0]!=' ' && mark[k][1]==mark[k][0] && mark[k][2]==mark[k][1])	//가로로 한 줄이 전부 같은 문자인 경우,
		{
			gotoxy(1,13);
			
			if(mark[k][0]=='O')
				printf("축하합니다! 승리하셨습니다.");	//그 문자가 O이면 승리 출력
			if(mark[k][0]=='X')
				printf("아쉽습니다, 패배하셨습니다.");	//그 문자가 X이면 패배 출력

			return 0;
		}
	}

	if(mark[0][0]!=' ' && mark[1][1]==mark[0][0] && mark[2][2]==mark[1][1])	//대각선으로 한 줄을 완성한 경우
		{
			gotoxy(1,13);
			
			if(mark[0][0]=='O')
				printf("축하합니다! 승리하셨습니다.");
			if(mark[0][0]=='X')
				printf("아쉽습니다, 패배하셨습니다.");	//같은 방식으로 승패판별

			return 0;
		}

	if(mark[2][0]!=' ' && mark[1][1]==mark[2][0] && mark[0][2]==mark[1][1])	//반대쪽 대각선으로 한 줄을 완성한 경우
		{
			gotoxy(1,13);
			
			if(mark[2][0]=='O')
				printf("축하합니다! 승리하셨습니다.");
			if(mark[2][0]=='X')
				printf("아쉽습니다, 패배하셨습니다.");	//같은 방식으로 승패판별

			return 0;
		}

	return 1;	//승패가 판별되지 않는 경우, 0가 아닌 다른 값으로 return한다.
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
Processing time 0.0174 sec