메뉴
Rock-paper-scissors Game (가위바위보 게임)

2011. 3. 20. 15:39

알고리즘

사실 알고리즘이라고 표현할만한 대단한 알고리즘이 있는 것이 아니다.
누구나 알고 있는 그 룰, 바위는 가위를 이기고, 보는 바위를 이기며, 가위는 보를 이긴다는 것만 기억하면 된다.
가위바위보를 짜기 위한 가장 기본적인 아이디어는, 이런 관계를 숫자로 나타내보자는 데에서 출발한다. 
'바위는 가위를 이긴다' 라는 명제를 숫자로 가장 간단히 표현해보자면,
바위를 1이라는 숫자로, 가위를 0이라는 숫자로 바꿔 놓으면 되는 것이다.

즉, A가 바위를 냈다면 A = 1, B가 가위를 냈다면 B = 0 이라고 놓으면
단지 A와 B의 숫자 크기를 비교하는 것으로 누가 이겼는지 판단이 가능하다.

그렇다면 보는 바위보다 상위에 있으므로 2라는 숫자로 대체할 수 있다.
문제는 다시 가위는 보의 상위에 있다는 것이다. 하지만 0과 2를 무턱대고 비교하면 0이 더 작다는 결과만 나온다.
즉, 보가 가위에 이긴다는 엉뚱한 결과를 얻게된다는 것이다.
따라서 보통의 경우에는 if문을 하나 더 쓰는 방법으로, 바위의 경우에 대해서만 특별한 부등식을 쓸 수도 있겠다.

하지만 좀 더 간단한 방법이 있다.
숫자의 크기를 부등호가 아닌 등호로 해결하는 것이다.
어차피 이기고 지는 경우의 수가 한정되어 있기 때문이다.

예를 들어보자. 나는 보를 냈고, 상대방은 가위를 냈다면,
나는 2에 해당하고, 상대방은 0에 해당된다.

단순히 비교하면 당연히 내가 이기게 되는 말도 안되는 상황이 되지만,
나의 결과에 +1 을 하고 그것을 다시 3으로 나눈 나머지를 보자. 0이 된다.
이 값은 상대방이 낸 숫자와 같게 된다.
이런 경우를 만족하는 경우 '나는 상대방에게 졌다'는 결과를 표시하면 되는 것이다.




코드

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

void main() {
    int i,j,u;
    char rpsArr[] = "SRP";
    char ch;
    double seed = time(NULL);
    srand(seed);

    printf("<Rock-paper-scissors Game>\ninput 'R' or 'P' or 'S' > ");
    scanf_s("%c",&ch,sizeof(ch)); // User

    for (i=0; i<3; i++) if (ch == rpsArr[i]) {j=i; break;}        

    u = rand()%3; // Computer

    printf("COM: %c, USER: %c > ",rpsArr[u], rpsArr[j]);
    (j == u) ? printf("Draw") : (((j+1)%3 == u) ? printf("You Lose!") : printf("You Win!"));
    printf("\n");
}




결과




분석 

사용자로 부터 R(Rock), P(Paper), S(Scissors) 중 하나를 입력 받고,
컴퓨터의 입력과 비교해서 결과를 나타낸다.
비교하는 식은 위 코드에서 20번째 줄에 해당한다.