imported>miura0806 |
|
| Line 1: |
Line 1: |
| * 2013년 8월 23일 개발
| | DeleteThisPage |
| #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한다.
| |
| }
| |
| -----
| |
| [[최다인]]
| |
|
| |
|