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

명품 C언어 프로젝트 8.9장 주사위로 과자먹기 게임 응용문제

꾸준함. 2017. 9. 13. 23:56

[1번 문제]

/*

한번에 두개의 주사위를 동시에 던져서 그 차이만큼 과자를 먹게 하도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

#define cake_number 30 //과자의 개수

void intro_game(void);

void input_participant(char user_name[][8]);

void game_control(char name[][8], int condition[], int *left, int user, int *start, int *end);

void cake_display(char name[][8], int condition[], int left, int start, int end);

void gotoxy(int x, int y);

int main(void)

{

        int i, start, end, cake_left = cake_number, winner;

        int cake_condition[cake_number] = { 0 };

        char user_name[2][8];

        srand((unsigned)time(NULL));

        intro_game();

        input_participant(user_name);

        start = 0;

        end = cake_number - 1;

        system("cls");

        game_control(user_name, cake_condition, &cake_left, 2, &start, &end);

        //user의 값을 2로 하여 과자의 초기상태를 출력

        gotoxy(10, 12);

        printf("아무키나 누르면 다음 순서를 진행합니다. ");

        getch();

        do

        {

               for (i = 0; i < 2; i++)

               {

                       system("cls");

                       game_control(user_name, cake_condition, &cake_left, i, &start, &end);

                       if (cake_left < 1)

                       {

                              winner = i;

                              break;

                       }

                       gotoxy(10, 13);

                       printf("아무키나 누르면 다음 순서를 진행합니다. ");

                       getch();

               }

        } while (cake_left != 0);

        gotoxy(10, 14);

        printf("%s님이 이겼습니다. ", user_name[winner]);

        gotoxy(10, 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

*/

void intro_game(void)

{

        system("cls");

        printf("주사위로 과자먹기 게임 \n\n");

        printf("두 사람이 서로 주사위를 두번 던져서 그 차만큼 과자를 먹는 게임입니다. \n");

        printf("마지막 남은 과자를 먹는 사람이 이깁니다. \n\n");

        printf("인지하셨다면 키보드를 눌러주세요\n");

        getch();

}

/*

게임 참가자 2명의 이름을 입력받는 함수 input_participant

*/

void input_participant(char user_name[][8])

{

        system("cls");

        printf("1번 참가자의 이름을 입력하고 Enter>");

        scanf("%s", user_name[0]);

        printf("2번 참가자의 이름을 입려갛고 Enter>");

        scanf("%s", user_name[1]);

        printf("아무키나 누르면 게임을 시작합니다...");

        getch();

}

/*

주사위로 과자 먹기 게임을 제어하는 함수 game_control

*/

void game_control(char name[][8], int condition[], int *left, int user, int *start, int *end)

{

        int i, dice_number[2];

        int dice_result;

        cake_display(name, condition, *left, *start, *end);

        if (user == 2)

               return; //user 2가 되는 경우는 main으로 복귀

        for (i = 0; i < 2; i++)

               dice_number[i] = rand() % 6 + 1; //주사위 난수 생성

        if (dice_number[0]>dice_number[1])

               dice_result = dice_number[0] - dice_number[1];

        else

               dice_result = dice_number[1] - dice_number[0];

        *left -= dice_result;

        gotoxy(10, 11);

        printf("%s님의 주사위 숫자는 %d %d입니다.", name[user], dice_number[0], dice_number[1]);

        gotoxy(10, 12);

        if (dice_result)

               printf("%s %d만큼 움직입니다.", name[user], dice_result);

        else

               printf("%s는 가만히 있습니다.", name[user]);

        if (user == 0)

        {

               for (i = *start; i < dice_result + *start; i++)

                       condition[i] = 1;

               *start += dice_result;

        }

        else

        {

               for (i = *end; i >(*end - dice_result); i--)

                       condition[i] = 1;

               *end -= dice_result;

        }

        cake_display(name, condition, *left, *start, *end);

}

/*

과자의 상태를 출력하는 함수 cake_display

*/

void cake_display(char name[][8], int condition[], int left, int start, int end)

{

        int i;

        char *eat_cake = "", *remain_cake = "";

        gotoxy(30, 5);

        if (left < 0)

               left = 0;

        printf("남은 과자의 수:%2d", left);

        for (i = 0; i < 2; i++)

        {

               gotoxy(i * 50 + 10, 6);

               printf("%s", name[i]);

        }

        for (i = 0; i < 30; i++)

        {

               if (condition[i] == 1)

               {

                       gotoxy(10 + i * 2, 8);

                       printf("%s", eat_cake);

               }

               else

               {

                       gotoxy(10 + i * 2, 8);

                       printf("%s", remain_cake);

               }

        }

        gotoxy(10, 9);

        printf("먹은 과자 수:%2d", start);

        gotoxy(52, 9);

        printf("먹은 과자 수:%2d", 29 - end);

}


[2번 문제]

/*

과자를 많이 먹은 참가자를 승자로 하도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

#define cake_number 30 //과자의 개수

void intro_game(void);

void input_participant(char user_name[][8]);

int game_control(char name[][8], int condition[], int *left, int user, int *start, int *end);

int cake_display(char name[][8], int condition[], int left, int start, int end);

void gotoxy(int x, int y);

int main(void)

{

        int i, start, end, cake_left = cake_number, winner = 0;

        int cake_condition[cake_number] = { 0 };

        char user_name[2][8];

        srand((unsigned)time(NULL));

        intro_game();

        input_participant(user_name);

        start = 0;

        end = cake_number - 1;

        system("cls");

        winner = game_control(user_name, cake_condition, &cake_left, 2, &start, &end);

        //user의 값을 2로 하여 과자의 초기상태를 출력

        gotoxy(10, 12);

        printf("아무키나 누르면 다음 순서를 진행합니다. ");

        getch();

        while (!winner)

        {

               for (i = 0; i < 2; i++)

               {

                       system("cls");

                       winner = game_control(user_name, cake_condition, &cake_left, i, &start, &end);

                       if (winner)

                              break;

                       gotoxy(10, 12);

                       printf("아무키나 누르면 다음 순서를 진행합니다. ");

                       getch();

               }

        }

        gotoxy(10, 12);

        if (winner)

               printf("%s님이 이겼습니다. ", user_name[winner - 1]);

        else

               printf("%s님과 %s님은 비겼습니다. ", user_name[0], user_name[1]);

        gotoxy(10, 13);

        printf("게임을 종료합니다. \n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

/*

게임 규칙을 출력하는 함수 intro_game

*/

void intro_game(void)

{

        system("cls");

        printf("주사위로 과자먹기 게임 \n\n");

        printf("두사람이 서로 양끝의 주사위 숫자만큼\n");

        printf("과자를 먹는 게임입니다. \n");

        printf("더 많은 과자를 먹는 사람이 이깁니다. \n\n");

        printf("인지하셨다면 키보드를 눌러주세요\n");

        getch();

}

/*

게임 참가자 2명의 이름을 입력받는 함수 input_participant

*/

void input_participant(char user_name[][8])

{

        system("cls");

        printf("1번 참가자의 이름을 입력하고 Enter>");

        scanf("%s", user_name[0]);

        printf("2번 참가자의 이름을 입려갛고 Enter>");

        scanf("%s", user_name[1]);

        printf("아무키나 누르면 게임을 시작합니다...");

        getch();

}

/*

주사위로 과자 먹기 게임을 제어하는 함수 game_control

*/

int game_control(char name[][8], int condition[], int *left, int user, int *start, int *end)

{

        int i, dice_number;

        int result;

        cake_display(name, condition, *left, *start, *end);

        if (user == 2)

               return 0; //user 2가 되는 경우는 main으로 복귀.

        dice_number = rand() % 6 + 1; //주사위 난수 생성

        *left -= dice_number;

        gotoxy(10, 11);

        printf("%s님의 주사위 숫자는 %d입니다.", name[user], dice_number);

        if (user == 0)

        {

               for (i = *start; i < dice_number + *start; i++)

                       condition[i] = 1;

               *start += dice_number;

        }

        else

        {

               for (i = *end; i >(*end - dice_number); i--)

                       condition[i] = 1;

               *end -= dice_number;

        }

        result = cake_display(name, condition, *left, *start, *end);

        return result;

}

/*

과자의 상태를 출력하는 함수 cake_display

*/

int cake_display(char name[][8], int condition[], int left, int start, int end)

{

        int i;

        char *eat_cake = "", *remain_cake = "";

        gotoxy(30, 5);

        if (left < 0)

               left = 0;

        printf("남은 과자의 수:%2d", left);

        for (i = 0; i < 2; i++)

        {

               gotoxy(i * 50 + 10, 6);

               printf("%s", name[i]);

        }

        for (i = 0; i < 30; i++)

        {

               if (condition[i] == 1)

               {

                       gotoxy(10 + i * 2, 8);

                       printf("%s", eat_cake);

               }

               else

               {

                       gotoxy(10 + i * 2, 8);

                       printf("%s", remain_cake);

               }

        }

        gotoxy(10, 9);

        printf("먹은 과자 수:%2d", start);

        gotoxy(52, 9);

        printf("먹은 과자 수:%2d", 29 - end);

        if (start > 15)

               return 1;

        if (end < 15)

               return 2;

        return 0;

}


[4번 문제]

/*

특정한 주사위 눈금이 나오거나 과자 중에서 못 먹는 과자(함정)를 먹었을 경우에 다음 참가자로 순서가 돌아가도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

#define cake_number 30 //과자의 개수

void intro_game(void);

void input_participant(char user_name[][8]);

void game_control(char name[][8], int condition[], int *left, int user, int *start, int *end);

void cake_display(char name[][8], int condition[], int left, int start, int end);

void gotoxy(int x, int y);

int main(void)

{

        int i, start, end, cake_left = cake_number, winner;

        int cake_condition[cake_number] = { 0 };

        char user_name[2][8];

        srand((unsigned)time(NULL));

        intro_game();

        input_participant(user_name);

        start = 0;

        end = cake_number - 1;

        system("cls");

        game_control(user_name, cake_condition, &cake_left, 2, &start, &end);

        //user의 값을 2로 하여 과자의 초기상태를 출력

        gotoxy(10, 12);

        printf("아무키나 누르면 다음 순서를 진행합니다. ");

        getch();

        do

        {

               for (i = 0; i < 2; i++)

               {

                       system("cls");

                       game_control(user_name, cake_condition, &cake_left, i, &start, &end);

                       if (cake_left == 1) //하나 남을 경우 상대방이 이긴다

                       {

                              winner = 1 - i;

                              break;

                       }

                       else if (cake_left < 1)

                       {

                              winner = i;

                              break;

                       }

                       gotoxy(10, 12);

                       printf("아무키나 누르면 다음 순서를 진행합니다. ");

                       getch();

               }

        } while (cake_left >= 2);

        gotoxy(10, 12);

        printf("%s님이 이겼습니다. ", user_name[winner]);

        gotoxy(10, 13);

        printf("게임을 종료합니다. \n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

/*

게임 규칙을 출력하는 함수 intro_game

*/

void intro_game(void)

{

        system("cls");

        printf("주사위로 과자먹기 게임 \n\n");

        printf("두사람이 서로 양끝의 주사위 숫자만큼\n");

        printf("과자를 먹는 게임입니다. \n");

        printf("마지막 남은 과자를 먹는 사람이 이깁니다. \n\n");

        printf(", 주사위 숫자가 4가 나오면 턴을 넘깁니다. \n\n");

        printf("인지하셨다면 키보드를 눌러주세요\n");

        getch();

}

/*

게임 참가자 2명의 이름을 입력받는 함수 input_participant

*/

void input_participant(char user_name[][8])

{

        system("cls");

        printf("1번 참가자의 이름을 입력하고 Enter>");

        scanf("%s", user_name[0]);

        printf("2번 참가자의 이름을 입려갛고 Enter>");

        scanf("%s", user_name[1]);

        printf("아무키나 누르면 게임을 시작합니다...");

        getch();

}

/*

주사위로 과자 먹기 게임을 제어하는 함수 game_control

*/

void game_control(char name[][8], int condition[], int *left, int user, int *start, int *end)

{

        int i, dice_number;

        cake_display(name, condition, *left, *start, *end);

        if (user == 2)

               return; //user 2가 되는 경우는 main으로 복귀

        dice_number = rand() % 6 + 1; //주사위 난수 생성

        if (dice_number == 4)

        {

               gotoxy(10, 13);

               printf("%s님의 주사위 숫자는 %d입니다.", name[user], dice_number);

               gotoxy(10, 14);

               printf("저주 받은 숫자이기 때문에 턴을 넘깁니다 ㅠㅠ", name[user], dice_number);

               return;

        }

        *left -= dice_number;

        gotoxy(10, 11);

        printf("%s님의 주사위 숫자는 %d입니다.", name[user], dice_number);

        if (user == 0)

        {

               for (i = *start; i < dice_number + *start; i++)

                       condition[i] = 1;

               *start += dice_number;

        }

        else

        {

               for (i = *end; i >(*end - dice_number); i--)

                       condition[i] = 1;

               *end -= dice_number;

        }

        cake_display(name, condition, *left, *start, *end);

}

/*

과자의 상태를 출력하는 함수 cake_display

*/

void cake_display(char name[][8], int condition[], int left, int start, int end)

{

        int i;

        char *eat_cake = "", *remain_cake = "";

        gotoxy(30, 5);

        if (left < 0)

               left = 0;

        printf("남은 과자의 수:%2d", left);

        for (i = 0; i < 2; i++)

        {

               gotoxy(i * 50 + 10, 6);

               printf("%s", name[i]);

        }

        for (i = 0; i < 30; i++)

        {

               if (condition[i] == 1)

               {

                       gotoxy(10 + i * 2, 8);

                       printf("%s", eat_cake);

               }

               else

               {

                       gotoxy(10 + i * 2, 8);

                       printf("%s", remain_cake);

               }

        }

        gotoxy(10, 9);

        printf("먹은 과자 수:%2d", start);

        gotoxy(52, 9);

        printf("먹은 과자 수:%2d", 29 - end);

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저

반응형