본문 바로가기

개발/C

C 가위바위보 게임 만들기

안녕하세요 DevStone입니다.

 

이번에 친구 부탁으로 거의 3년 만에 c언어를 잡아서 만들었는데

역시 예전이나 지금이나 c언어는 어렵네요 ㅠㅠ 효율 생각 안 하고 만들어서

소스가 많이 지저분하기는 하지만 공유드립니다!

 

 

요구사항

1) 컴퓨터와 게임

2) 삼세판 설정

3) 통계 (몇 승)

4) 승률 보기

5) 게임 머니 기능

 a) 시작하자마자 게임머니 설정

 b) 게임할 때마다 자신이 보유한 게임을 판돈으로 건다.

 c) 이길 경우 2배 또는 3배 수로 받는다.

 d) 둘 중 게임머니가 한쪽이라도 0이면 종료

6) 게임 이어서 하기 기능

7) 현재 승패 및 게임머니 파일로 저장, 불러오기

 

 

소스(c)

변수 모음

전역변수

전역 변수 선언으로 사용할 변수들을 우선 선언해 주었습니다.

(최상단에 c 표준 라이브러리를 선언해 줍니다)

 

 

Main 영역

 

Main_1

fopen 사용법 : FILE *fp = fopen(파일명, 파일모드); // 파일 열기

 

우선 세이브 기능을 이용하기 위해 fopen을 사용하며 세이브 파일을 열어 줍니다.

이때 옵션에 b를 붙이는 걸 볼 수 있는데 바이너리 코드로 기록을 하겠다는 의미입니다.

 

평문 내용이 그대로 입력되게 되면 데이터 조작이 너무 쉬워지기 때문입니다.

물론 별도 뷰어를 사용하면 데이터 조작은 충분히 가능합니다.

파일 모드 기능 설명
r 읽기 전용 파일을 읽기 전용으로 엽니다. ! 파일이 반드시 있어야 합니다.
w 쓰기 전용 새 파일을 생성합니다. 파일이 있으면 내용을 덮어씁니다.
a 추가 파일 끝에 값을 이어 씁니다. 파일이 없으면 파일을 생성 합니다.
r+ 읽기/쓰기 파일을 읽기/쓰기용으로 엽니다. 단, 파일이 반드시 있어야 하며 파일이 없으면 NULL을 반환합니다.
w+ 읽기/쓰기 파일을 읽기/쓰기용으로 엽니다. 파일이 없으면 파일을 생성하고, 파일이 있으면 내용을 덮어씁니다.
a+ 추가(읽기/쓰기) 파일을 열어 파일 끝에 값을 이어 씁니다. 만약 파일이 없으면 파일을 생성합니다. 읽기는 파일의 모든 구간에서 가능하지만, 쓰기는 파일의 끝에서만 가능합니다.
t 텍스트 모드 파일을 읽거나 쓸 때 개행문자 \n \r\n을 서로 변환합니다. ^Z를 파일의 끝으로 인식하므로 ^Z까지만 파일을 읽습니다(^Z는 Ctrl+Z 입력을 뜻합니다).
b 바이너리 모드 파일의 내용을 그대로 읽고, 값을 그대로 씁니다.

fopen에서 옵션으로 r+b를 사용하여 파일이 없으면 NULL을 반환받습니다.

if문을 사용하며 NULL을 반환받으면 wb 를사용하여 새 파일을 생성함과 동시에 신규로 작성합니다.

scanf를 이용하여 초기 자본을 입력 후

fwrite를 사용하여 모두 초기값을 기록해 줍니다.

그 후 fclose를 사용하여 해당 파일을 닫아줍니다.

Main_2

최초 실행이 아니면 NULL을 반환하지 않기 때문에 if문을 지나 fread를 이용하여 내부 내용을 읽어 옵니다.

단 최초실행이 아니더라고 만약 파산한 경우면 새로운 게임머니를 입력합니다.

 

printf를 이용하여 현재 소지금, 판수, 전체 승률, 가위, 바위, 보 비율별 승률 , 승리 횟수, 패배 횟수, 무승부 횟수를 출력 후

게임 모드를 선택할 수 있는 Mode() 함수를 호출합니다.

 

Mode()

Mode 함수는 간단하게 구성되어 있습니다.

잘못 입력했을 경우 다시 입력받기 위하여 while문을 사용하여 무한 반복을 진행합니다.

GameMode를 입력받아

Y -> 삼세판 모드

N -> 단판 모드

로 이동합니다. 이때 컴퓨터 돈을 rand를 사용하여 정해줍니다. 범위는 10000~1000000 사이의 금액입니다.

 

이때 위에 srand((unsigned) time(NULL)); 를 사용한 걸 보실 수 있습니다.

간단하게 설명하자면 C언어에서의 여러 개의 난수표를 가지고 있습니다.

이 난수는 임의로 나열되어 있는데 거기서 난수를 하나 가져오는 방식입니다.

이때 항상 동일한 위치의 난수를 가져온다면 결국 난수가 아닌 고정된 숫자가 되어 버립니다.

 

그래서 항상 난수표와 위치를 변경해 줘야 하는데 이때 srand() 함수를 사용합니다. srand파라미터에 숫자를 넣어주면 난수표와 위치가 변경됩니다. 근데 이 마저도 다른 숫자로 변경해 주어야 하는데 이때 시간을 사용하면 매번 바뀐 숫자를 입력할 수 있습니다.

 

Game1_Betting 영역

드디어 메인인 Game 영역입니다!

Game1은 삼세판 모드로 3판 2선 승제로 진행됩니다.

루프가 돌 때마다 Total++을 해줘서 전체 판수를 늘려 줍니다.

또한 이번 함수에서만 사용할 변수를 상단에 선언해 줍니다.

 

게임 진입 시 배팅 금액을 먼저 입력받습니다. 여기서 현재 본인이 소유한 돈보다 높은 금액을

배팅하려 하면 오류가 안내 문구가 출력됩니다.

이 또한 다시 입력받기 위해 while문을 사용하여 무한 루프를 돌려줍니다.

Game1_Start 영역

가위바위보 시작을 위해 컴퓨터의 값을 랜덤으로 가위 or 바위 or 보를 내도록 합니다.

이때 본인도 0,1,2중 하나의 값을 입력하여 가위 or 바위 or 보를 냅니다.

 

Game1_Scissors 영역
Game1_Rock 영역
Game1_Paper 영역

가위바위보 같은 경우는 3가지의 경우의 수가 있습니다.

이기거나 비기거나 지거나 컴퓨터와 본인의 숫자를 비교하여 결과를 출력해 줍니다.

이때 각 경우에 맞춰 변수에 ++를 해주어 기록을 합니다.

 

Game1_Win 영역

게임을 반복하여 진행할 때 ++해준 변수중 GameWin 변수가 2번이 되면

위에 if문에 걸리도록 설정해 주었습니다. 삼세판은 두 번이기면 승리이기 때문입니다!

 

게임 승리에 대한 안내문구 출력 후 Win(승리) 카운트를 추가해 줍니다.

또한 배팅 정산을 위해 승리한 경우이기 때문에 소지금에 배팅금 3배를 추가해 줍니다.

 

승리에 경우에서 그럴 일은 없지만 본인이 파산하거나 컴퓨터가 파산하게 되면 게임을 종료합니다.

게임 종료 시 꼭 GameSave 함수로 이동하여 데이터를 저장해 줘야 합니다.

 

Game1_Win_Continue 영역

게임이 종료되었으므로 현재 모드를 한번 더 반복해서 할 건지 입력받습니다.

Game1_Win_Continue_Y 영역

Y를 입력하면 Game1() 함수를 재호 출하여 처음부터 재실행하도록 합니다.

처음으로 돌아가 배팅금부터 다시 반복됩니다.

Game1_Win_Continue_N 영역

N 클릭 시 게임을 종료하시겠습니까? 를 표시하며 다시 한 번 더 입력을 받습니다.

Y를 입력하면 게임을 종료하며 GameSave 함수를 호출합니다.

N을 입력하면 Mode 함수를 호출하여 게임모드 선택창으로 돌아갑니다.

 

이하 패배 영역은  win 영역과 동일하게 구성되어 있습니다.

또한 단판 모드는 위에 소스와 동일하며 GameWin or GameLose if문을 ==1로 변경해 주었습니다.

원래는 좋지 않은 코딩 방법입니다. 쓸데없이 소스가 길어질 수 있기 때문입니다.

 

 

전체 소스는 git에서 확인하실 수 있습니다. ( git 주소가 기존에서 변경되었습니다.)

https://github.com/Maker-Kim/Study/blob/master/C/%EA%B0%80%EC%9C%84%EB%B0%94%EC%9C%84%EB%B3%B4.c

 

Maker-Kim/Study

Contribute to Maker-Kim/Study development by creating an account on GitHub.

github.com

 

-------------------------

c언어 아직도 엄청 쓰기 어렵네요.. 파이썬이었으면 되게 짧게 잘 구성할 수 있었을 거 같은데

아쉽습니다 ㅋㅋㅋ 본문에도 적었지만 깔끔하게 만들지 않아 소스가 많이 지저분합니다. 양해 부탁드립니다!