[밥통이와 겜 만들기 2탄] 가위 바위 보 겜을 만들자

무슨 게임을 만들까?  일단 처음이니 아주 간단한 방식의 "가위 바위 보"게임을 만들어 보자!
손모양의 그림이 나오면서 음악도 나오고 멋진 효과음에 멀티 플레이를 지원하는 게임을
대부분의 사람들이 원하겠지만, 난 못 만든다. -_-;; 하지만 언젠간 만들겠지. 그냥
도스창에서 글자만 출력하는 형식으로 만들기로 하자!!

"가위 바위 보" 게임의 규칙을 보도록 하자!!

가위 = 1
바위 = 2
보   = 3

이제부터 "가위 바위 보"를 각각 1, 2, 3이라 하겠다.

두명의 숫자가 같으면 무승부가 된다.

0 = 1 - 1
0 = 2 - 2
0 = 3 - 3

위의 내용은 무승부를 수학?적으로 풀이 한것이다. (^^;;)


그럼 첫번째 사람이 이긴 경우를 보자.

-2 = 1 - 3 (가위 > 보)
1 = 2 - 1 (주먹 > 가위)
1 = 3 - 2 (보 > 주먹)

결국 1이나 -2가 되면 첫번째 사람이 승리한 경우이다. 그럼 두번째 사람이 이긴 경우는
위에 숫자를 반대로 바꾸면 된다.

2 = 3 - 1
-1 = 1 - 2
-1 = 2 - 3

2나 -1은 두번째 사람의 승리가 되겠다.


이제 위의 내용을 C언어 함수로 작성해 보자.
[code]
//
// 플레이어의 숫자와 컴퓨터의 숫자를 비교해 게임 결과를 출력함
// 리턴값: 0=무승부, 1=플레이어승리, 2=컴퓨터승리
//
int YouWinTest(int playerKey, int comKey)
{
   int test = playerKey - comKey;
   switch(test)
   {
      //case  0: return 0;
      case -1: return 2;
      case -2: return 1;
      case  1: return 1;
      case  2: return 2;
      default: return 0;
   }
}
[/code]

함수의 첫번째 인자는 플레이어1이며, 두번째 인자는 컴퓨터가 되겠다. 그리고 누가
이겼는지 0, 1, 2 중에 하나의 값을 돌려준다.

그럼 플레이어2는 컴퓨터라 했는데, 컴퓨터는 어떻게 가위 바위 보를 할 수있을까? 간단하게 난수를
이용해 인공지능 루틴을 만들도록 하자!!
[code]
int GetRand(int low, int max)
{
   // %은 나누고 나머지 값을 의미함 (1 = 5 % 2)
   return (rand()%(max+1-low))+low;
}
[/code]

위의 함수는 low, max 안의 수를 리턴하게 되어있다. 아까 1, 2, 3이 "가위 바위 보"라고
정했으니

int com = GetRand(1, 3);

처럼 사용하면 com에 1, 2, 3중에 하나가 들어가게 된다.

이제 중요한 부분은 다 만들어졌다. 나머지는 플레이어1의 가위 바위 보를 입력받고,
컴퓨터의 숫자와 비교해서 승리자가 누구인지 보여주기만 하면된다.

[code]
//
// "가위 바위 보" 게임 소스
//

#include <stdio.h>
#include <stdlib.h>

int g_PlayerKey = 0;  // 플레이어가 입력한 수(1=가위, 2=바위, 3=보)
int g_ComKey = 0;     // 컴퓨터의 가위 바위 보
int g_PlayerWin = 0;  // 플레이어가 승리한 수
int g_ComWin = 0;     // 컴퓨터가 승리한 수

//
// 플레이어의 키를 입력 받음
//
int Input()
{
   int key;
   printf("\n1:가위, 2:바위, 3:보, (0:종료) :");
   scanf("%d",&key);

   return (key<4 ? key:1);
}

//
// low와 max의 사이의 난수를 생성해 돌려줌
//
int GetRand(int low, int max)
{
   return (rand()%(max+1-low))+low;
}

//
// 숫자를 문자열로 돌려줌
//
const char* InputToStr(int key)
{
   switch (key)
   {
      case 1: return "가위";
      case 2: return "바위";
      case 3: return "보";
      default: return "";
   }
}

//
// 플레이어의 숫자와 컴퓨터의 숫자를 비교해 게임 결과를 출력함
// 리턴값: 0=무승부, 1=플레이어승리, 2=컴퓨터승리
//
int YouWinTest(int playerKey, int comKey)
{
   int test = playerKey - comKey;
   switch(test)
   {
      //case  0: return 0;
      case -1: return 2;
      case -2: return 1;
      case  1: return 1;
      case  2: return 2;
      default: return 0;
   }
}

//
// 게임의 메인 부분
//
void GameProcess()
{
   int win;
   while (true)
   {
      g_PlayerKey = Input();
      if (g_PlayerKey == 0)
      {
         // 0이면 게임이 종료됨
         break;
      }

      g_ComKey = GetRand(1, 3);

      printf("당신:%s\n", InputToStr(g_PlayerKey));
      printf("컴퓨터:%s\n", InputToStr(g_ComKey));

      win = YouWinTest(g_PlayerKey, g_ComKey);
      if (win == 1)
      {
         g_PlayerWin++;
         printf("**당신이 이겼음**\n");
      }
      else if (win == 2)
      {
         g_ComWin++;
         printf("**컴퓨터가 이겼음**\n");
      }
      else
      {
         printf("**무승부**\n");
      }
      printf("(당신 승리:%d) (컴퓨터 승리:%d)\n", g_PlayerWin, g_ComWin);
   }
}

int main()
{
   printf("======================================\n");
   printf("     가위 바위 보 게임 시작합니다.\n");
   printf("======================================\n");

   GameProcess();

   return 0;
}
[/code]

ps. 이번에 가위바위보 게임은 예전에 만들어놓은 걸 조금 고쳐서 다시 만들었는데, 다음에는 무슨
게임을 만들어 보는게 좋을까요? 알려주세요!! (3d rpg 게임 이런거 말고요 -_-;;;;;)


------------------------
저자:밥통
MSN :textout@msn.com
------------------------