C언어 가위바위보 게임(결과가 두 개로 집중되는 현상 문제)

조회수 3004회

안녕하세요! 열거형을 사용해서 컴퓨터와 사람 사이의 가위바위보 게임을 구현하라는 문제를 구현해보았는데요. 컴퓨터의 입장을 랜덤 함수를 사용해서 표현했는데 가위를 입력했을 때 "이겼습니다"와 "졌습니다", "비겼습니다"의 경우가 골고루 퍼져서 출력되지만 바위와 보를 입력했을 때는 결과가 두 개로 집중되는 현상이 일어납니다. (아래의 이미지와 같이)

과연 이 현상이 원래 것인지 rand() 랜덤함수가 제대로 실행되지 않아서 인지 아니면 코드가 이상한건지 궁금합니다.

이미지

이미지

이미지

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

enum RSP_game{Rock, Scissor, Paper, Fail};

int convert_enum(char *input) {
    char *RSP_str[] = {
        "Rock",
        "rock",
        "바위",
        "Scissor",
        "scissor",
        "가위",
        "Paper",
        "paper",
        "보"
    };

    int result;

    for (int i = 0; i < 9; i++) {
        result = strcmp(input, RSP_str[i]);
        if (result == 0) {
            if (i == 0 || i == 1 || i == 2)
                return 0;
            else if (i == 3 || i == 4 || i == 5)
                return 1;
            else if (i == 6 || i == 7 || i == 8)
                return 2;
        }
    }

    if (result > 0 || result < 0)
        return 3;
}

int main(void)
{
    char user_input[10];
    enum RSP_game user_choice;
    int computer_choice = 0;

    do {
        computer_choice = rand()%3;
        printf("가위, 바위, 보 중에서 하나를 선택하세요(종료:q): ");
        scanf("%s", &user_input);

        if (user_input[0] != 'q') {
            user_choice = convert_enum(user_input);

            if (user_choice == 3) {
                printf("값이 올바르지 않습니다.\n");
                continue;
            }

            if (user_choice == computer_choice)
                printf("비겼습니다.\n");
            else if (user_choice > computer_choice)
                printf("이겼습니다.(졌습니다)\n");
            else
                printf("졌습니다.(이겼습니다)\n");
        }
    } while (user_input[0] != 'q');

    return 0;
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 가위바위보 게임을 JS버전으로 직접 만들어보니 가위바위보 결과를 처리하는 로직이 문제가 있을 수 있겠더군요. user_choice > computer_choice를 사용자가 "이긴" 것으로 처리하면 정확히 스샷에서 보여 주신 현상이 일어납니다(묵을 내면 잘 지고 빠를 내면 잘 이김). 왜냐면... 예컨대 "Rock"의 경우 인덱스 값이 0이므로 이 숫자값만 비교하자면 사용자가 이길 수가 없는 거죠. "묵:찌"는 분명 이기는 경우지만 판단은 0 < 1로 진 것이 되어버리니 ㅡㅡ;;;

    결국 종이에 펜으로 전체 경우의 수를 늘어놓고 나서야 결론이 났는데... (링크한 데모를 보면 아시겠지만) 값이 묵 = 0, 찌 = 1, 빠 = 2 셋 중 하나라고 가정했을 때 그 차가 -1이거나 2면 이긴 것으로 계산했습니다. 0-1, 1-2, 2-0의 3가지가 이기는 경우니까요. 우연인지 필연인지는 아직 증명못하긴 했는데…

    C와 전혀 관계없는 자바스크립트 코드인데 참고가 될런지 모르겠네요.

    • 아.. 제가 바보 같은 짓을 한 것이었네요. 사용자와 컴퓨터의 값을 비교하여서 결과를 출력할 조건으로 비기는 경우는 알맞게 했지만 이기는 경우와 지는 경우의 조건을 단순히 '크다', '작다'라는 조건을 주어서 값이 그렇게 나왔던 거군요. convert_enum 함수에서 char *RSP_str[] = { "Scissor", "scissor", "가위", "Rock", "rock", "바위", "Paper", "paper", "보" };로 수정하고 조건을 if (user_choice == computer_choice) printf("비겼습니다.\n"); else if ((user_choice - computer_choice) == 1 || (user_choice - computer_choice) == -2) printf("이겼습니다.(졌습니다)\n"); else printf("졌습니다.(이겼습니다)\n");와 같이 수정하니 똑바로 출력되네요. 감사합니다. 알 수 없는 사용자 2018.10.5 13:08
  • 아마도 rand 함수만 사용하면 랜덤하지 않고 규칙적으로 같은 값을 받게 됩니다.

    올바르게 처리하려면 rand 함수를 사용하기 전에 srand 함수를 사용해주면 됩니다.

    #include <time.h>
    ...
    ...
    time_t t;
    srand((unsigned) time(&t));
    ...
    ...
    rand();
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)