[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언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 8.10장 줄다리기 게임 (0) | 2017.09.18 |
---|---|
C언어 주사위 말판 게임 (0) | 2017.09.16 |
명품 C언어 프로젝트 8.9장 주사위로 과자먹기 게임 (0) | 2017.09.13 |
C언어 간단한 숫자판 게임 (2) | 2017.09.12 |
명품 C언어 프로젝트 8.8장 슬롯 머신 응용문제 (7) | 2017.09.12 |