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 }
이 코드에 대한 해석을 더 세세하게 알고싶어유 ㅠ.ㅠ