주말이라 복잡한 이론 보다는 재밌는 기초 게임을 만들어 보는 시간을 갖도록 하겠습니다. 가위바위보 게임을 구글 검색을 하시면 post가 엄청 많이 검색이 됩니다. 검색 한 post 소스를 따라 코딩해 보셔도 됩니다. 이 post는 기본 개념을 토대로 간단히 가위바위보 게임이 어떻게 만들어지는지 그 과정을 보여 드릴려고 작성한 post 입니다.
그럼 시작해 봅시다.
원리를 간단합니다. 상대가 가위를 내면 자신이 가위를 내면 비기고 주먹을 내면 이기고 보를 내면 집니다. 어려운 원리는 아니죠. 여기서, 가위, 바위, 보를 냈을 때 상대가 낼 수 있는 가위, 바위, 보의 경우의 수를 따지면 됩니다.
가위 - > 가위, 바위,보
바위 -> 가위, 바위, 보
보->가위, 바위, 보
내가 낼 수 있는 수는 3가지고 상대가 낼 수 있는 수는 3가지 입니다. 합쳐서 3x3으로 총 9가지의 경우의 수가 나옵니다.
(가위,가위) (가위,바위) (가위,보)
(바위,가위) (바위,바위) (바위,보)
(보,가위) (보,바위) (보,보)
이걸 다시 숫자로 가위(1), 바위(2), 보(3)로 보기 편하게 나열 할까요.
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
(3,1) (3,2) (3,3)
이제 승리, 패배, 무승부 조건으로 분류 해야 겠죠.
조건 : (상대, 본인)
승리 : (1,2) (2,3) (3,1)
패배 : (1,3) (2,1) (3,2)
무승부 : (1,1) (2,2) (3,3)
이걸 조건식으로 만들어 볼까요.
초기값 : com(상대), play(본인)
비기는 조건식 :
무승부 : (1,1) (2,2) (3,3)
(1,1) => com1 && play1
(2,2) => com2 && play2
(3,3) => com3 && play3
if((com1 && play1)||(com2 && play2)||(com3 && play3))
이기는 조건식 :
승리 : (1,2) (2,3) (3,1)
(1,2) => com1 && play2
(2,3) => com2 && play3
(3,1) => com3 && play1
if((com1 && play2)||(com2 && play3)||(com3 && play1))
지는 조건식 :
패배 : (1,3) (2,1) (3,2)
(1,3) => com1 && play3
(2,1) => com2 && play1
(3,2) => com3 && play2
if((com1 && play3)||(com2 && play1)||(com3 && play2))
3가지 형태로 분류 했습니다.
그러면 알고리즘을 만들어 볼까요.
if((com==1 && play==1)||(com==2 && play==2)||(com==3 && play==3)){
무승부!
}
else if((com==1 && play==2)||(com==2 && play==3)||(com==3 && play==1)){
승리!
}
else{
패배!
}
if문에서 무승부인지 체크하고 아니면 다음 else if문에서 승리했는지 체크합니다. 그러다 그것도 아니면 나머지 한가지는 패배뿐이겠죠. 이렇게 3가지 조건이 있지만 2가지 조건이 만족하는지만 체크해보고 만족안하면 자동으로 남은 한가지의 조건이 성립하게 됩니다.
알고리즘이 그렇게 복잡하지 않죠. 글자로 처음에 분류했을 때 좀 가독성이 떨어지지만 이렇게 숫자로 1,2,3으로 표현해서 코딩하니깐 보기도 편하고 코딩하기도 편해졌지요.
그럼 이게 정상적으로 돌아가는지 실제 코딩을 해봐야 겠죠.
게임을 실제 실행시킬려면 가위,바위,보라는 3가지 중 하나는 본인이 선택 할 수 있지만 상대는 컴퓨터가 랜덤으로 3가지중 하나를 선택해서 낼 수 있게 코딩을 해야 게임이 되겠죠.
예전에 랜덤함수인 rand()함수를 배웠습니다.
#include
srand(time(NULL)); //랜덤값 초기화
com=rand()%3+1; //1~3까지 랜덤수 추출
배웠던 내용이라 이렇게 해서 컴퓨터가 무자귀 가위(1), 바위(2), 보(3)라는 숫자를 만들어 내게 되었습니다.
play가 가위(1), 바위(2), 보(3)를 선택하면 되겠죠.
scanf("%d",&play);
이렇게 scanf()함수를 이용해서 1,2,3 중 하나를 입력받으면 됩니다. 이렇게해서 위해 가위바위보 알고리즘에 com, play의 값을 대입하여 적절하게 결과를 출력하면 가위바위보 게임이 완성 됩니다.
[소스]
#include
#include
#include
int main(int argc, char *argv[]) {
int play; //본인
int com; //상대
int cnt=0; //판수
int win=0, loss=0, draw=0; //승리, 패배, 무승부
char str[3][4]={"가위","바위","보"}; //출력 문자열
srand(time(NULL)); //랜덤값 초기화
while(1){
printf("가위(1), 바위(2), 보(3), 종료(0) 선택하시오? \n");
scanf("%d",&play); //선택
com=rand()%3+1; //랜덤1~3 추출
if(play==0) break; //종료할 것인가?
else if(play>3) printf("error!\n"); // 1~3사이 값에서 벗어 났는가?
else if((com==1 && play==1)||(com==2 && play==2)||(com==3 && play==3)){ //무승부조건식
printf("com %s play %s [비김]\n",str[com-1],str[play-1]);
draw++;
cnt++;
}
else if((com==1 && play==2)||(com==2 && play==3)||(com==3 && play==1)){ //승리조건식
printf("com %s play %s [승리]\n",str[com-1],str[play-1]);
win++;
cnt++;
}
else{ //나머지 패배조건이 되겠죠.
printf("com %s play %s [패배]\n",str[com-1],str[play-1]);
loss++;
cnt++;
}
}
system("cls"); //화면지우기
printf("%d판 %d승 %d무 %d패 \n",cnt,win,draw,loss); //결과 출력
system("pause"); //아무키입력 잠시 멈춤 효과
return 0;
}
가위바위보 알고리즘에서 2개의 if문을 더 추가했습니다.
if(play==0) break;
else(play>3)
play가 0을 입력하면 종료로 while(1)문을 탈출해야 합니다. break 명령어로 탈출이 이루어 집니다. 참고로 while(1)에서 1은 0이 아닌 값이기 때문에 무한 참이 됩니다. 조건식은 0 or 1로 거짓 or 참이 됩니다. 그런데 0이 아닌 값을 선언해놓으면 무조건 참이 됩니다. 무한 루프문이 되는 것이죠. 무한 루프문에서는 break문으로 탈출 한다는 것만 기억하시면 됩니다.
그리고 1~3외의 숫자를 입력 할 수 있으니 "error"라는 문자열을 출력하고 다시 재입력하도록 이 코딩에서는 간단히 표현 했습니다. 다른 방식도 있지만 그냥 보기 편하게 간단한 형태로 구현했으니 감안하시고 보시기 바랍니다.
탈출과 에러조건으로 2가지 if 조건을 먼저 체크하도록 한 뒤에 가위바위보 알고리즘을 체크하도록 코딩을 해 봤네요. 그냥 순간 증흥적으로 코딩한거라 조잡하니깐 감안하시고 보세요.
[결과]
요즘 C언어 문법 이론만 설명하니깐 재미 없을 것 같아서 간단히 구현해 볼 것이 없나 궁리하다가 누구나 다 아는 가위바위보 게임을 코딩해 보면 어떨지 해서 한번 구현해 보았네요. 가위바위보라는 원리를 기준으로 먼저 구상하고 그 구상된 형태에서 알고리즘을 만들고 그 알고리즘이 정상적으로 동작하는지 코딩해보는 과정을 보여드리고 싶어서 post로 작성해 보았습니다.