글수 39

[밥통이와 겜 만들기 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
------------------------
2003.12.27 02:48:26 (*.72.67.20)
^^현암군님말씀을 부정할수 없습니다.
준비물에서 확실히 프로그래밍을 언급했지만, 단순히 문자열출력으로 끝..
프로그램의 순서라든지..
알고리즘이라든지..
적어도 게임에 필요한 함수등 언급하셨음^^;;
준비물에서 확실히 프로그래밍을 언급했지만, 단순히 문자열출력으로 끝..
프로그램의 순서라든지..
알고리즘이라든지..
적어도 게임에 필요한 함수등 언급하셨음^^;;
2003.12.27 06:25:12 (*.50.244.199)
앗. 안녕하세요.. 포마스님.. 당연히 기억하죠.. 포마스님은 제 아이디만 보고 아는군요 감사 T.T
그랬군요.. T.T 그럼 앞으로 좀더 쉽게 강좌를 진행하겠습니다. 역시 갑자기 가위바위보 게임을 완성한다는게 무리였네요..
앞으로도 계속 조언 부탁드립니다..
그랬군요.. T.T 그럼 앞으로 좀더 쉽게 강좌를 진행하겠습니다. 역시 갑자기 가위바위보 게임을 완성한다는게 무리였네요..
앞으로도 계속 조언 부탁드립니다..
2003.12.27 23:45:58 (*.249.175.69)
밥통님 조금 번거로우시겠습니다만, 프로그램을 만들기 전에 계획을 먼저 세울거 아닙니까??
그런쪽도 조금 올려주시면 더욱 감사하겠습니다^^
그런쪽도 조금 올려주시면 더욱 감사하겠습니다^^
2003.12.28 02:28:45 (*.152.43.137)
Tasin님: 설계같은건 UML으로 하면 됩니다. 그러나 그 수준은 단순한 가위바위보게임을 설계하려고 UML부터 공부를 시작한다면, 어쩌면 프로그래밍을 멀리 할수 있을..최악의 사태가..발생할수..x.x;;

scanf 나.. 다른 함수에 대한 설명을 들어간 후에 ( 함수 만드는 법 같은것들.. )
이런 간단한 게임 설명을 해주는 것이 좋을... ( 니가 해봐!! -_-;; 아.. 죄송 )
그래도 ㅠ_ㅠ 멋져요!