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

명품 C언어 프로젝트 8.10장 줄다리기 게임

꾸준함. 2017. 9. 18. 00:23

/*

줄다리기 게임 프로그램

*/

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

반응형