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

C언어 주사위 말판 게임

꾸준함. 2017. 9. 16. 20:25

/*

응용 8.9.1을 응용하여 아래의 그림과 같이 함정(□ 표시부분)이 있는 주사위 말판 게임을 작성하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

typedef struct _player

{

        char name[20]; //이름

        int location; //위치

        char shape[3]; //모양

}Player;

 

void intro_game(void);

void initialize(Player *p1, Player *p2);

void board_display(Player *p1, Player *p2);

void gotoxy(int x, int y);

void print_shape(Player p1, Player p2);

int game_play(Player *p1, Player *p2);

void trap(Player *p);

int conclusion(Player *p);

 

int main(void)

{

        Player p1, p2;

        int end_game = 0;

        initialize(&p1, &p2);

        srand((unsigned)time(NULL));

        while (!(end_game))

        {

               end_game = game_play(&p1, &p2);

        }

        gotoxy(1, 24);

        return 0;

}

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

선수 정보 초기화

*/

void initialize(Player *p1, Player *p2)

{

        //참가자 입력

        int number;

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

        scanf("%s", p1->name);

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

        scanf("%s", p2->name);

        p1->location = p2->location = 1;

        number = rand() % 2;

        if (number)

        {

               strcpy(p1->shape, "");

               strcpy(p2->shape, "");

               printf("%s님의 말은 %s입니다\n", p1->name, p1->shape);

               printf("%s님의 말은 %s입니다\n", p2->name, p2->shape);

        }

        else

        {

               strcpy(p1->shape, "");

               strcpy(p2->shape, "");

               printf("%s님의 말은 %s입니다\n", p1->name, p1->shape);

               printf("%s님의 말은 %s입니다\n", p2->name, p2->shape);

        }

        printf("키보드를 눌러 게임을 진행해주세요\n");

        getch();

        system("cls");

}

 

/*

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

*/

void intro_game(void)

{

        system("cls");

        printf("주사위 말판 게임\n");

        printf("2명의 선수(, )가 함정을 피해");

        printf("끝 지점까지 도달하는 게임\n");

        printf("♠ 선수가 먼저 시작합니다\n");

        printf("먼저 끝으로 도달하는 사람이 이깁니다!\n");

        getch();

}

 

/*

board 상태를 출력하는

*/

void board_display(Player *p1, Player *p2)

{

        system("cls");

        printf("게임 순서는 다음과 같습니다. 괄호는 말기호\n");

        printf("1:%s(), 2:%s()\n\n", p1->name, p2->name);

        printf(": 함정, 위치: 7 16 26\n\n");

        printf("시작");

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

               printf("  ");

        printf("\n");

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

        {

               if (i == 6 || i == 15 || i == 25)

                       printf("");

               else

                       printf("");

        }

        print_shape(*p1, *p2);

}

 

/*

선수들의 말 출력

*/

void print_shape(Player p1, Player p2)

{

        if (p1.location >= 71)

               p1.location = 71;

        if (p2.location >= 71)

               p2.location = 71;

        gotoxy(p1.location, 8);

        printf("%s", p1.shape);

        if (p1.location == p2.location)

        {

               gotoxy(p2.location, 9);

               printf("%s", p2.shape);

        }

        else

        {

               gotoxy(p2.location, 8);

               printf("%s", p2.shape);

        }

}

 

/*

실제 게임 진행 상황

*/

int game_play(Player *p1, Player *p2)

{

        int dice; //주사위

        system("cls");

        board_display(p1, p2);

        gotoxy(1, 11);

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

        {

               if (i == 0)

               {

                       gotoxy(1, 11);

                       printf("%s님이 주사위를 돌릴 차례입니다. 키보드를 눌러 주사위를 돌려주세요", p1->name);

                       getch();

                       dice = rand() % 6 + 1;

                       p1->location += dice * 2;

                       gotoxy(1, 12);

                       printf("주사위의 숫자가 %d이므로 %s님의 위치는 %d입니다", dice, p1->name, p1->location / 2 + 1);

                       trap(p1);

                       Sleep(1000);

                       board_display(p1, p2);

                       if (conclusion(p1))

                       {

                              gotoxy(1, 15);

                              printf("%s님이 이기셨습니다", p1->name);

                              return 1;

                       }

               }

               else

               {

                       gotoxy(1, 11);

                       printf("%s님이 주사위를 돌릴 차례입니다. 키보드를 눌러 주사위를 돌려주세요", p2->name);

                       getch();

                       dice = rand() % 6 + 1;

                       p2->location += dice * 2;

                       gotoxy(1, 12);

                       printf("주사위의 숫자가 %d이므로 %s님의 위치는 %d입니다", dice, p2->name, p2->location / 2 + 1);

                       trap(p2);

                       Sleep(1000);

                       board_display(p1, p2);

                       if (conclusion(p2))

                       {

                              gotoxy(1, 15);

                              printf("%s님이 이기셨습니다", p2->name);

                              return 2;

                       }

               }

        }

        return 0;

}

 

/*

함정 발동

*/

void trap(Player *p)

{

        if (p->location == 13 || p->location == 31 || p->location == 51)

        {

               gotoxy(1, 13);

               printf("함정 발동!! 초기 위치로 돌아가시오");

               p->location = 1; //초기화

        }

}

 

/*

승패 여부

*/

int conclusion(Player *p)

{

        if (p->location >= 69)

        {

               return 1;

        }

        return 0;

}



개발환경:Visual Studio 2017


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


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

반응형