/*
줄다리기 게임 프로그램
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
void gotoxy(int x, int y);
double intro_game(char team_name[][7]);
void display_line(int rand);
void display_start(char t_name[][7], int s_win[], int s_lose[]);
void display_win(char t_name[][7], int s_win[], int s_lose[]);
void make_decision(int r_start, int s_win[], int s_lose[], char t_name[][7], int *result1, int *result2);
void game_control(int *r_start, clock_t start, double *pst);
int conclusion(char t_name[][7], int *result1, int *result2);
int main(void)
{
int score_win[2] = { 0 }, score_lose[2] = { 0 }, r_start;
int result1=0, result2=0;
char team_name[2][7];
double pst, game_time;
clock_t start;
srand((unsigned)time(NULL));
game_time = intro_game(team_name);
do
{
display_start(team_name, score_win, score_lose);
r_start = 20;
start = clock();
pst = 0;
do
{
game_control(&r_start, start, &pst);
} while (pst < game_time && ((8 < r_start) && (r_start < 32))); //한곳으로 치우쳐 있지 않고 제한 시간 내라면 while문 반복
make_decision(r_start, score_win, score_lose, team_name, &result1, &result2);
display_win(team_name, score_win, score_lose);
} while (!conclusion(team_name, &result1, &result2)); //3판 2선승제
gotoxy(1, 15);
printf("게임을 종료합니다. \n");
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
게임에 대한 설명, 참가자와 제한시간을 입력받는 함수 intro_game
*/
double intro_game(char team_name[][7])
{
double game_time;
int i;
printf("줄다리기 게임\n\n");
printf("3번 싸워서 2번 먼저 이긴 팀이 승자입니다.\n\n");
printf("참가자는 두 팀입니다. \n");
for (i = 0; i < 2; i++)
{
printf("%d번 참가팀의 이름을 입력하고 Enter>", i + 1);
scanf("%s", &team_name[i]);
}
printf("\n");
printf("줄다리기 게임의 제한 시간(초 단위)을 입력하고 Enter>");
scanf("%lf", &game_time);
system("cls");
gotoxy(1, 1);
printf("제한시간:%5.1f 초", game_time);
gotoxy(30, 1);
printf("경과시간:%4.1F 초", 0);
gotoxy(38, 6);
printf("기준점");
gotoxy(40, 7);
printf("▼");
gotoxy(40, 9);
printf("▲");
return game_time;
}
/*
줄다리기 줄을 출력하는 함수 display_line
*/
void display_line(int rnd)
{
int i, line[21] = { 0 };
line[10] = 1;
line[4] = 2;
line[16] = 2;
gotoxy(1, 8);
for (i = 0; i < 78; i++)
printf(" ");
gotoxy(rnd, 8);
for (i = 0; i < 21; i++)
if (line[i] == 0)
printf("□");
else if (line[i] == 1)
printf("■");
else
printf("◆");
}
/*
줄다리기 게임 시작의 초기화면 표시 함수 display_start
*/
void display_start(char t_name[][7], int s_win[], int s_lose[])
{
int i, r_start = 20;
display_line(r_start);
for (i = 0; i < 2; i++)
{
gotoxy(i * 55 + 10, 6);
printf("%s", t_name[i]);
gotoxy(i * 55 + 10, 7);
printf("%d승, %d패", s_win[i], s_lose[i]);
}
gotoxy(1, 13);
printf("아무키나 누르면 경기를 시작합니다. ");
getch();
gotoxy(1, 12);
printf(" ");
gotoxy(1, 13);
printf(" ");
}
/*
줄다리기 승패 출력
*/
void display_win(char t_name[][7], int s_win[], int s_lose[])
{
for (int i = 0; i < 2; i++)
{
gotoxy(i * 55 + 10, 6);
printf("%s", t_name[i]);
gotoxy(i * 55 + 10, 7);
printf("%d승, %d패", s_win[i], s_lose[i]);
}
}
/*
우승팀을 구분 및 경기 결과를 출력하는 함수 make_decision
*/
void make_decision(int r_start, int s_win[], int s_lose[], char t_name[][7], int *result1, int *result2)
{
int win;
if (20 < r_start)
{
s_win[1] += 1;
s_lose[0] += 1;
win = 2;
*result2 += 1;
}
else if (r_start < 20)
{
win = 1;
s_win[0] += 1;
s_lose[1] += 1;
*result1 += 1;
}
else
win = 0;
gotoxy(1, 12);
if (win)
printf("%s팀이 이겼습니다. ", t_name[win - 1]);
else
printf("비겼습니다.");
gotoxy(1, 13);
printf("아무키나 누르세요. ");
getch();
}
/*
줄다리기 게임을 제어하는 함수 game_control
*/
void game_control(int *r_start, clock_t start, double *pst)
{
int rnd, i;
clock_t end;
rnd = rand() % 100;
if (rnd % 2)
rnd = rnd % 4; //rnd가 짝수
else
rnd = -rnd % 4; //rnd가 홀수
if (rnd < 0)
{
for (i = *r_start; i >(*r_start + rnd); i--) //왼쪽으로
{
display_line(i);
Sleep(100);
}
}
else
{
for (i = *r_start; i < (*r_start + rnd); i++) //오른쪽으로
{
display_line(i);
Sleep(100);
}
}
//시작점 재설정
if (rnd < 0)
*r_start = i + 1;
else
*r_start = i - 1;
end = clock();
*pst = (double)(end - start) / CLK_TCK;
gotoxy(30, 1);
printf("경과시간:%4.1f초", *pst);
}
/*
승패 가르기
*/
int conclusion(char t_name[][7], int *result1, int* result2)
{
gotoxy(1, 14);
if (*result1 == 2)
{
printf("%s팀이 최종우승했습니다", t_name[0]);
return 1;
}
else if(*result2 == 2)
{
printf("%s팀이 최종우승했습니다", t_name[1]);
return 2;
}
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 9.1장 디지털 피아노 (0) | 2017.09.22 |
---|---|
C언어 청기백기 게임(간단한 애니메이션) (10) | 2017.09.18 |
C언어 주사위 말판 게임 (0) | 2017.09.16 |
명품 C언어 프로젝트 8.9장 주사위로 과자먹기 게임 응용문제 (9) | 2017.09.13 |
명품 C언어 프로젝트 8.9장 주사위로 과자먹기 게임 (0) | 2017.09.13 |