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

C언어 간단한 숫자판 게임

꾸준함. 2017. 9. 12. 22:45

/*

다음과 같은 숫자판이 있다고 가정하고, 2명이 번갈아 숫자 판 위에 동전을 던져서

위치한 숫자만큼의 배수로 금액을 누적하는 게임 프로그램을 작성하시오.

동전의 위치는 난수로 결정하며, 숫자판의 숫자는 매 시행마다 임의로 배치하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <conio.h>

#include <Windows.h>

 

void instruction(void);

void gotoxy(int x, int y);

void draw_check02(int c, int r);

int *random_number(int *arr);

int throw_coin(int *arr);

void game_play(void);

void show_money(int *player[2][20], int player_money[2]);

void conclusion(int *player[2][20], int player_money[2]);

 

int main(void)

{

        srand((unsigned)time(NULL));

        instruction();

        game_play();

        return 0;

}

 

void instruction(void)

{

        printf("숫자판 게임\n\n");

        printf("3*3 숫자판에 동전을 던져 나온 숫자만큼의 배수로 금액을 누적하는 게임\n");

        printf("2명이 번갈아가면서 5번 던진 결과 더 높은 금액을 보유한 사람이 승리!\n");

        printf("동전을 던질 때마다 숫자판은 랜덤으로 생성됩니다\n");

        printf("인지하셨다면 키보드를 누르세요\n");

        getch();

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

확장된 바둑판 그리기 함수 draw_check02

*/

void draw_check02(int c, int r)

{

        int i, j;

        unsigned char a = 0xa6;

        unsigned char b[12];

        for (i = 1; i < 12; i++)

               b[i] = 0xa0 + i;

        printf("%c%c", a, b[3]);

        for (i = 0; i < c - 1; i++)

        {

               printf("%c%c", a, b[1]);

               printf("%c%c", a, b[8]);

        }

        printf("%c%c", a, b[1]);

        printf("%c%c", a, b[4]);

        printf("\n");

        for (i = 0; i < r - 1; i++)

        {

               printf("%c%c", a, b[2]);;

               for (j = 0; j < c; j++)

               {

                       printf("  ");

                       printf("%c%c", a, b[2]);

               }

               printf("\n");

               printf("%c%c", a, b[7]);

               for (j = 0; j < c - 1; j++)

               {

                       printf("%c%c", a, b[1]);

                       printf("%c%c", a, b[11]);

               }

               printf("%c%c", a, b[1]);

               printf("%c%c", a, b[9]);

               printf("\n");

        }

        printf("%c%c", a, b[2]);

        for (j = 0; j < c; j++)

        {

               printf("  ");

               printf("%c%c", a, b[2]);

        }

        printf("\n");

        printf("%c%c", a, b[6]);

        for (i = 0; i < c - 1; i++)

        {

               printf("%c%c", a, b[1]);

               printf("%c%c", a, b[10]);

        }

        printf("%c%c", a, b[1]);

        printf("%c%c", a, b[5]);

        printf("\n");

}

 

/*

숫자판에 랜덤으로 숫자 생성

*/

int *random_number(int *arr)

{

        int number[10] = { 0 }; //숫자가 만들어졌는지 여부

        int random; //랜덤으로 생성된 숫자

        int col = 3;

        int count = 0;

        for (int i = 0; i < 9; i++)

        {

               do

               {

                       random = rand() % 9 + 1;

               } while (number[random]);

               gotoxy(4 * ((i % 3) + 1) - 1, col);

               printf("%d", random);

               number[random] ++;

               arr[count++] = random;

               if (i % 3 == 2) //3*3

                       col += 2;

        }

        return arr;

}

 

/*

숫자판에 동전 던지고 해당 숫자 리턴

*/

int throw_coin(int *arr)

{

        int rand1 = rand() % 3, rand2 = rand() % 3;

        gotoxy(4 * (rand1 + 1) - 1, (rand2 + 1) * 2 + 1);

        printf("");

        switch (rand1)

        {

        case 0:

               if (rand2 == 0)

                       return arr[0];

               else if (rand2 == 1)

                       return arr[1];

               else if (rand2 == 2)

                       return arr[2];

        case 1:

               if (rand2 == 0)

                       return arr[3];

               else if (rand2 == 1)

                       return arr[4];

               else if (rand2 == 2)

                       return arr[5];

        case 2:

               if (rand2 == 0)

                       return arr[6];

               else if (rand2 == 1)

                       return arr[7];

               else if (rand2 == 2)

                       return arr[8];

        }

}

 

/*

게임 진행

*/

void game_play(void)

{

        char *player[2][20]; //사용자 두명

        int player_money[2] = { 10000, 10000 }; //둘다 만원씩 갖고 있었음

        int count = 0;

        int turn = 0; //사용자 순서

        int *arr=(int*)malloc(sizeof(int)*9); //생성된 숫자의 순서 저장하는 배열

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

        {

               printf("%d번째 선수 이름 입력: ", i + 1);

               scanf("%s", player[i]);

        }

        while (count < 5)

        {

               system("cls");

               printf("%s 순서\n", player[turn]);

               draw_check02(3, 3);

               arr = random_number(arr); //숫자판 순서 저장

               show_money(player, player_money);

               gotoxy(1, 10);

               printf("동전 던지려면 키보드를 누르세요");

               getch();

               gotoxy(1, 10);

               printf("                                                ");

               int multiply = throw_coin(arr);

               gotoxy(1, 10);

               printf("동전이 놓인 숫자: %d", multiply);

               Sleep(1000); //delay

               player_money[turn] *= multiply; //돈 계산

               show_money(player, player_money);

               if (turn == 1)

                       count++;

               turn = 1 - turn;

        }

        conclusion(player, player_money);

        free(arr);

}

 

/*

현재 가지고 있는 돈 출력

*/

void show_money(int *player[2][20], int player_money[2])

{

        gotoxy(20, 3);

        printf("보유하고 있는 돈");

        gotoxy(20, 4);

        printf("%s: %d", player[0], player_money[0]);

        gotoxy(20, 5);

        printf("%s: %d", player[1], player_money[1]);

}

/*

게임 승패 여부

*/

void conclusion(int *player[2][20], int player_money[2])

{

        gotoxy(1, 10);

        if (player_money[0] == player_money[1])

               printf("%s %s는 동일한 돈을 가지고 있습니다. 비겼습니다\n", player[0], player[1]);

        else if (player_money[0] > player_money[1])

               printf("%s %s보다 많은 돈을 가지고 있습니다. %s가 이겼습니다\n", player[0], player[1], player[0]);

        else

               printf("%s %s보다 많은 돈을 가지고 있습니다. %s가 이겼습니다\n", player[1], player[0], player[1]);

}


개발환경:Visual Studio 2017


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


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


반응형