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