/*
주사위로 과자 먹기 게임
*/
#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, 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");
printf("마지막 남은 과자를 먹는 사람이 이깁니다. \n\n");
printf("아무키나 누르면 게임참가자를\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; //주사위 난수 생성
*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언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
C언어 주사위 말판 게임 (0) | 2017.09.16 |
---|---|
명품 C언어 프로젝트 8.9장 주사위로 과자먹기 게임 응용문제 (9) | 2017.09.13 |
C언어 간단한 숫자판 게임 (2) | 2017.09.12 |
명품 C언어 프로젝트 8.8장 슬롯 머신 응용문제 (7) | 2017.09.12 |
명품 C언어 프로젝트 8.8장 슬롯 머신 (0) | 2017.09.11 |