티스토리 뷰

반응형

C언어 가위바위보 게임

안녕하세요! 이번에는 C언어를 통해서 컴퓨터와 대결하는 가위바위보 게임을 만들어보는 시간을 갖도록 하겠습니다. 코드를 설명하기 전에 가위바위보 게임을 어떻게 표현하였는지를 간단하게 말씀드리면 가위와 바위, 보를 숫자 0과 1, 2로 변환시켜 숫자를 서로 비교시킨 결과를 출력할 것입니다. 컴퓨터가 낸 수를 rand() 함수를 사용해서 임의의 수로 표현하였구요. 


사용자가 한글(가위, 바위, 보)과 영문자(scissor, rock, paper, 앞 글자 대문자 포함)를 모두 입력할 수 있도록 하였고 사용자와 컴퓨터가 낸 수들에 인덱스를 붙여서 가위에 0을 바위에 1을 그리고 보에 2를 붙여서 코드를 만들어보았는데 문자열을 사용해서 인덱스 값을 배출하는 과정은 1개의 함수로 구성하였습니다. 그럼 이제부터 코드를 살펴보도록 하겠습니다.



제가 추가한 헤더파일은 3개로 C언어에서 기본적으로 사용되는 "<stdio.h>"와 랜덤함수를 위한 "<stdlib.h>" 그리고 문자열들을 비교하는 함수를 사용하기 위해 "<string.h>"을 추가하였습니다. 헤더파일 아래의 변수는 열거형 변수로 이번 문제를 열거형 데이터를 사용해서 해결해야만 해서 사용하였습니다. (Rock=0, Scissor=1, Paper=2, Fail=3)



다음으로 보실 코드는 main 함수로 변수를 선언한 영역과 반복문 영역으로 나뉘는데 변수를 살펴보면 먼저 사용자로부터 입력받은 문자열을 저장하기 위한 char형 배열인 "user_input"과 사용자의 선택을 표현한 열거형 변수인 "user_choice", 컴퓨터의 선택을 정수형 변수로 표현한 "computer_choice"가 선언된 모습을 볼 수 있습니다.


그리고 반복문으로는 조건을 검사하지 않고 먼저 실행하는 "do while" 문을 사용했고 그 내용을 보면 먼저 "computer_choice"에 랜덤함수를 실행한 랜덤 값을 3으로 나눈 나머지 값을 대입하는데 그 이유는 컴퓨터의 선택 값 범위를 숫자 0과 1, 2 사이로 지정하기 위해서입니다. 다음으로 "scanf" 함수를 사용해서 사용자가 입력한 문자열을 저장하고 입력한 값이 'q' 아닌지를 "if"문을 통해서 검사합니다.


'q'가 아닐 경우에는 "convert_enum" 함수에 사용자가 입력한 문자열 변수의 주소을 입력하여 실행하고 반환된 값을 "user_choice"에 대입하는데 이 함수가 문자열을 인덱스 값으로 바꿔주는 역할이라고 보시면됩니다.



"convert_enum" 함수가 정의된 영역으로 이동하면 char형 포인터 변수를 매개변수로 삼은 것을 볼 수 있는데 이는 배열의 주소를 받기 위하여 사용한 것입니다. 그 아래는 char형 포인터 배열로 배열의 인덱스 0에서 2까지는 가위이고 3부터 5까지는 바위 그리고 나머지 범위는 보를 나타내기 위한 것입니다.


"for" 반복문은 총 9번 반복되고 내용은 "int"형 변수인 "result"에 "strcmp" 문자열 함수로 사용자가 입력한 문자열 변수의 주소와 아까의 포인터 배열의 값을 비교한 결과를 대입하게 됩니다.(char형 포인터 배열의 값은 문자열이 아니라 주소입니다.) "strcmp" 함수는 두 문자열이 같은 경우에만 0을 반환하니 값이 0이 나왔을 때 사용자가 입력한 문자열이 무엇인지를 반복문에 사용한 인덱스 역할을 수행하는 "i" 변수를 통해서 검사합니다. 


"*RSP_str[i]"에서 i가 0에서 2 사이라면 가위를 의미하는 문자열을 가리키는 것이니 "i"가 0과 1, 2일 경우 가위를 표현한 숫자 0을 반환시킵니다. 바위와 보의 경우도 위와 같이 이해하시면 되고 맨 아래의 "if" 문은 두 문자열이 같지 않은 경우로 3을 반환시키는 것입니다.



다시 반복문 영역으로 이동하면 "convert_enum" 함수를 통해서 전달받은 값이 3일 경우 사용자가 입력한 문자열이 가위와 바위, 보에 해당하지 않는 것이므로 경고문을 출력하고 "continue" 문을 실행해서 반복문을 다시 실행하도록 합니다.


이제는 사용자가 낸 수와 컴퓨터가 낸 수를 비교해서 승자를 판가름을 내야합니다. 사용자의 수와 컴퓨터의 수는 0과 1, 2로 수렴하니 "if" 문을 사용해서 비교보았습니다. 사용자와 컴퓨터의 수가 일치하면 당연히 무승부로 "비겼습니다."라는 문구를 출력하고 사용자의 수에서 컴퓨터의 수를 뺀 값이 1일 경우 또는 -2일 경우에는 사용자의 승리로 "이겼습니다.(졌습니다)"라는 문구를 출력하고 그 외의 경우는 "졌습니다."를 출력하게 됩니다. 


여기서 사용자의 수에서 컴퓨터의 수를 뺀 값이 1과 -2일 경우에 사용자의 승리로 인정되는 이유는 사용자가 낸 수가 만약 가위라면 0으로 바뀌고 상대가 보를 냈을 경우에만 승리할 것입니다. 상대는 즉, 컴퓨터로 보가 2이니 뺀 값은 -2가 나오게 됩니다. 바위에 가위를 빼면 1이 나오고 보에 바위를 빼는 경우도 1이 나오게 됩니다. 이상으로 C언어로 간단하게 만들어본 가위바위보 게임이었습니다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함