/*
응용 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언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
C언어 청기백기 게임(간단한 애니메이션) (10) | 2017.09.18 |
---|---|
명품 C언어 프로젝트 8.10장 줄다리기 게임 (0) | 2017.09.18 |
명품 C언어 프로젝트 8.9장 주사위로 과자먹기 게임 응용문제 (9) | 2017.09.13 |
명품 C언어 프로젝트 8.9장 주사위로 과자먹기 게임 (0) | 2017.09.13 |
C언어 간단한 숫자판 게임 (2) | 2017.09.12 |