C언어로 만든 간단한 가위바위보 게임 소스입니다.
포트폴리오를 전시하기 위한 프로젝트의 일환으로, 워밍업 차원에서 C언어 콘솔 게임을 간단하게 만들어 본 것입니다.
게임을 세팅, 진행, 종료의 세 부분으로 나눠서 각 부분에 함수를 하나씩 선언하였고, 게임 진행에 필요한 변수는 구조체 형태로 선언한 후 포인터를 이용해 각 게임 함수를 넘나들며 해당 변수에 접근할 수 있도록 하였습니다.
게임 방법은 먼저 몇 승을 하면 게임에서 승리하는지(1-100)를 숫자로 입력 후 게임이 시작되면 가위는 1번, 바위는 2번, 보는 3번을 선택해서 해당 숫자를 입력하는 방식입니다.
이 코드는 MinGW(윈도우용 GCC 컴파일러) 및 repl.it에서 테스트한 코드입니다.
코드는 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
struct GameData {
int win;
int lose;
int victory;
bool playing;
};
void game_setting(struct GameData *gd);
void ingame(struct GameData *gd);
void game_over(struct GameData *gd);
char *gbb_flag[3] = {"가위", "바위", "보"};
int main()
{
// Init
struct GameData gd;
gd.playing = true;
srand(time(NULL)); // Init random seed
while(gd.playing) {
// Setting and Start
game_setting(&gd);
while(gd.win < gd.victory && gd.lose < gd.victory && gd.playing)
ingame(&gd);
// End of Game
game_over(&gd);
}
// Quit
return 0;
}
void game_setting(struct GameData *gd)
{
int v;
printf("***********************\n");
printf("*** 가위바위보 게임 ***\n");
printf("***********************\n\n");
printf("몇 판 이기면 승리할지 선택하세요. (최대=100): ");
scanf("%d", &v);
if (v <= 0) gd->victory = 3;
else if (v > 100) gd->victory = 100;
else gd->victory = v;
gd->win = 0; gd->lose = 0;
printf("\n** 게임을 시작합니다. **\n");
}
void ingame(struct GameData *gd)
{
int man_flag, cpu_flag;
printf("\n현재 %d승 %d패입니다. (%d판 이기면 승리)\n", gd->win, gd->lose, gd->victory);
printf("선택하세요. (1=가위, 2=바위, 3=보, -1=중지): ");
scanf("%d", &man_flag);
switch (man_flag) {
case 1: case 2: case 3:
cpu_flag = rand() % 3 + 1;
printf("[당신] %s - ", gbb_flag[man_flag - 1] );
printf("%s [CPU]\n", gbb_flag[cpu_flag - 1] );
switch (man_flag - cpu_flag) {
case -2: // Gawi(1) v Bo(3)
case 1: // Bawi(2) v Gawi(1), Bo(3) v Bawi(2)
printf("▷ :) 당신이 이겼습니다.\n");
gd->win++;
break;
case -1: // Gawi(1) v Bawi(2), Bawi(2) v Bo(3)
case 2: // Bo(3) v Gawi(1)
printf("▷ :( 당신이 졌습니다.\n");
gd->lose++;
break;
case 0:
printf("▷ 비겼습니다.\n");
}
break;
case -1:
printf("현재 게임을 중지합니다.\n");
gd->playing = false;
break;
default:
printf("다시 입력하세요.\n");
}
}
void game_over(struct GameData *gd)
{
char yn_flag;
printf("\n결과: %d승 %d패\n", gd->win, gd->lose);
if (gd->win >= gd->victory)
printf("*** 축하합니다! 당신이 승리했습니다! ***\n");
else if (gd->lose >= gd->victory)
printf("*** 안타깝게도 당신은 패배했습니다. ***\n");
printf("게임을 다시 하시겠습니까? (Y/N): ");
scanf(" %c", &yn_flag);
if (yn_flag == 'Y' || yn_flag == 'y')
gd->playing = true; // Continue
else gd->playing = false; // Quit
}
이 코드에 대한 해석을 더 세세하게 알고싶어유 ㅠ.ㅠ