C/명품 C언어 프로젝트(안기수 저)

C언어 청기백기 게임(간단한 애니메이션)

꾸준함. 2017. 9. 18. 20:43

/*

청기백기 게임

*/

#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언어 프로젝트 안기수 저

반응형