* 2013년 8월 23일 개발 {{{ #include #include //srand 사용을 위한 헤더 #include #include //커서의 위치를 바꾸는 함수를 위한 헤더 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한다. } }}} ----- [최다인]