/*
청기백기 게임
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
void erase_animation(void);
void gotoxy(int x, int y);
void game_control(int order, char name[7], char sol[][10], double check[][10], int quest);
void display_result(int user, int order[], double check[][10], char name[][7], char sol[][10], int quest);
void display_rule(void);
void display_flag(char key);
int main(void)
{
int i, user_number, quest_number, rnd, temp;
int order[4] = { 0, 1, 2, 3 };
char solution[4][10] = { 0 };
double time_check[4][10] = { 0 };
char user_name[4][7];
srand((unsigned)time(NULL));
printf("청기/백기 게임\n\n");
printf("게임에 참가할 인원수를 입력하고 Enter>");
scanf("%d", &user_number);
printf("\n문제의 개수를 입력하고 Enter>");
scanf("%d", &quest_number);
for (i = 0; i < user_number; i++)
{
printf("%d번 참가자의 이름을 입력하고 Enter>", i + 1);
scanf("%s", &user_name[i]);
}
printf("만약 한글을 사용하였다면 영문키로 바꾸십시오.\n");
printf("아무키나 누르시오.\n");
getch();
printf("\n게임의 순서는 다음과 같습니다. \n");
for (i = 0; i < user_number; i++)
{
rnd = rand() % user_number;
temp = order[i];
order[i] = order[rnd];
order[rnd] = temp;
}
for (i = 0; i < user_number; i++)
{
printf("%d번: %s\n", i + 1, user_name[order[i]]);
}
printf("아무키나 누르시오.\n");
getch();
for (i = 0; i < user_number; i++)
game_control(order[i], user_name[order[i]], solution, time_check, quest_number);
printf("\n\n");
printf("모든 게임이 끝났습니다. \n");
printf("아무키나 누르면 결과를 표시합니다. \n");
getch();
display_result(user_number, order, time_check, user_name, solution, quest_number);
getch();
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
청기 백기 게임을 제어하는 함수 game_control
*/
void game_control(int order, char name[7], char sol[][10], double check[][10], int quest)
{
char *flag[] = { "청기", "백기" };
char *question[] = { "내려!", "올려!", "내리지말고", "올리지말고" };
clock_t start, end;
int i, rnd[4];
char key;
system("cls");
gotoxy(1, 3);
printf("%s님 순서입니다. 키 조작은 다음과 같습니다.", name);
display_flag(0);
display_rule();
for (i = 0; i < quest; i++)
{
system("cls");
display_flag(0);
rnd[0] = rand() % 2;
rnd[1] = rand() % 4;
start = clock();
gotoxy(5, 10);
if (rnd[1]>1)
{
rnd[2] = rand() % 2;
rnd[3] = rand() % 2;
printf("%d: %s %s %s %s", i + 1, flag[rnd[0]], question[rnd[1]], flag[rnd[2]], question[rnd[3]]);
}
else
printf("%d: %s %s", i + 1, flag[rnd[0]], question[rnd[1]]);
while (!kbhit());
key = getch();
switch (key)
{
case 'a':
display_flag(key);
Sleep(500);
break;
case 'z':
display_flag(key);
Sleep(500);
break;
case 'k':
display_flag(key);
Sleep(500);
break;
case 'm':
display_flag(key);
Sleep(500);
}
end = clock();
check[order][i] = (double)(end - start) / CLK_TCK;
if (rnd[1] > 1)
{
if ((rnd[2] == 0) && (rnd[3] == 0) && (key == 'z'))
sol[order][i] = 1;
else if ((rnd[2] == 0) && (rnd[3] == 1) && (key == 'a'))
sol[order][i] = 1;
else if ((rnd[2] == 1) && (rnd[3] == 0) && (key == 'm'))
sol[order][i] = 1;
else if ((rnd[2] == 1) && (rnd[3] == 1) && (key == 'k'))
sol[order][i] = 1;
else
sol[order][i] = 0;
}
else
{
if ((rnd[0] == 0) && (rnd[1] == 0) && (key == 'z'))
sol[order][i] = 1;
else if ((rnd[0] == 0) && (rnd[1] == 1) && (key == 'a'))
sol[order][i] = 1;
else if ((rnd[0] == 1) && (rnd[1] == 0) && (key == 'm'))
sol[order][i] = 1;
else if ((rnd[0] == 1) && (rnd[1] == 1) && (key == 'k'))
sol[order][i] = 1;
else
sol[order][i] = 0;
}
}
}
/*
게임결과를 출력하는 함수 display_result
*/
void display_result(int user, int order[], double check[][10], char name[][7], char sol[][10], int quest)
{
int i, j, result[4] = { 0 };
double min_time[4] = { 0 };
system("cls");
printf(" ");
for (i = 0; i < user; i++)
printf("%8s\t", name[order[i]]);
printf("\n");
for (j = 0; j < quest; j++)
{
printf("\t %d번: ", j + 1);
for (i = 0; i < user; i++)
{
if (sol[order[i]][j] && check[order[i]][j] < 1.5) //animation delay 시간 500 포함
{
printf("O");
result[order[i]] += 1;
}
else
printf("X");
printf("%5.2f\t", check[order[i]][j] - 0.5);
if ((sol[order[i]][j] == 1) && (check[order[i]][j] < 1.5))
min_time[order[i]] += check[order[i]][j] - 0.5;
}
printf("\n");
}
printf("\n");
printf("맞은개수:");
for (i = 0; i < user; i++)
printf("%7d\t", result[order[i]]);
printf("\n");
printf("소요시간(틀린 문제는 포함X):");
for (i = 0; i < user; i++)
printf("%7.2f\t", min_time[order[i]]);
printf("\n");
}
/*
게임규칙을 출력하는 함수 display_rule
*/
void display_rule(void)
{
gotoxy(1, 4);
printf("게임시작전까지 키를 누르지 마세요!");
gotoxy(1, 6);
printf("청기 올려:a\t백기 올려:k");
gotoxy(1, 7);
printf("청기 내려:z\t백기 내려:m");
Sleep(2000);
gotoxy(1, 8);
printf("5초 후에 게임을 시작합니다. 준비하세요.");
Sleep(5000);
}
/*
간단한 애니메이션
*/
void display_flag(char key)
{
erase_animation();
switch (key)
{
case 'a':
gotoxy(58, 5);
printf("○");
gotoxy(54, 6);
printf("└─");
gotoxy(54, 5);
printf("■");
gotoxy(60, 6);
printf("─");
gotoxy(62, 6);
printf("□");
gotoxy(58, 6);
printf("│");
gotoxy(58, 7);
printf("│");
gotoxy(58, 8);
printf("┴");
gotoxy(57, 9);
printf("│");
gotoxy(59, 9);
printf("│");
gotoxy(1, 24);
break;
case 'z':
gotoxy(58, 5);
printf("○");
gotoxy(54, 6);
printf("┌─");
gotoxy(54, 7);
printf("■");
gotoxy(60, 6);
printf("─");
gotoxy(62, 6);
printf("□");
gotoxy(58, 6);
printf("│");
gotoxy(58, 7);
printf("│");
gotoxy(58, 8);
printf("┴");
gotoxy(57, 9);
printf("│");
gotoxy(59, 9);
printf("│");
gotoxy(1, 24);
break;
case 'k':
gotoxy(58, 5);
printf("○");
gotoxy(56, 6);
printf("─");
gotoxy(54, 6);
printf("■");
gotoxy(60, 6);
printf("─┘");
gotoxy(62, 5);
printf("□");
gotoxy(58, 6);
printf("│");
gotoxy(58, 7);
printf("│");
gotoxy(58, 8);
printf("┴");
gotoxy(57, 9);
printf("│");
gotoxy(59, 9);
printf("│");
gotoxy(1, 24);
break;
case 'm':
gotoxy(58, 5);
printf("○");
gotoxy(56, 6);
printf("─");
gotoxy(54, 6);
printf("■");
gotoxy(60, 6);
printf("─┐");
gotoxy(62, 7);
printf("□");
gotoxy(58, 6);
printf("│");
gotoxy(58, 7);
printf("│");
gotoxy(58, 8);
printf("┴");
gotoxy(57, 9);
printf("│");
gotoxy(59, 9);
printf("│");
gotoxy(1, 24);
break;
default:
gotoxy(58, 5);
printf("○");
gotoxy(56, 6);
printf("─");
gotoxy(54, 6);
printf("■");
gotoxy(60, 6);
printf("─");
gotoxy(62, 6);
printf("□");
gotoxy(58, 6);
printf("│");
gotoxy(58, 7);
printf("│");
gotoxy(58, 8);
printf("┴");
gotoxy(57, 9);
printf("│");
gotoxy(59, 9);
printf("│");
gotoxy(1, 24);
}
}
/*
애니메이션 지우기
*/
void erase_animation(void)
{
gotoxy(58, 5);
printf(" ");
gotoxy(56, 6);
printf(" ");
gotoxy(54, 6);
printf(" ");
gotoxy(59, 6);
printf(" ");
gotoxy(61, 6);
printf(" ");
gotoxy(58, 6);
printf(" ");
gotoxy(58, 7);
printf(" ");
gotoxy(58, 8);
printf(" ");
gotoxy(57, 9);
printf(" ");
gotoxy(59, 9);
printf(" ");
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 9.2장 디지털 레시피 (0) | 2017.09.24 |
---|---|
명품 C언어 프로젝트 9.1장 디지털 피아노 (0) | 2017.09.22 |
명품 C언어 프로젝트 8.10장 줄다리기 게임 (0) | 2017.09.18 |
C언어 주사위 말판 게임 (0) | 2017.09.16 |
명품 C언어 프로젝트 8.9장 주사위로 과자먹기 게임 응용문제 (9) | 2017.09.13 |