2010. 3. 15. 14:34
C 언어로 만든 숫자 맞추기 일명 야구게임
2010. 3. 15. 14:34 in ICT와 AI 정보
학창시절에 3자리 숫자를 적어 놓고 상대방의 숫자 3개를 예상해서 위치까지 맞으면 '스트라이크', 자리는 틀려도 숫자만 맞으면 '볼'이라고 말해줘서 3개의 숫자를 먼저 맞추는 게임을 해 본 적이 있을 겁니다.
이제 컴퓨터와 한 번 해봅시다. 원래 사람끼리 해야 정이 들고(?) 내기를 할 수 있어 재미있지만 프로그래밍 언어의 문법과 논리 흐름을 배우기 위해 한 번 시도해보는 것도 재미있습니다. 여기서는 컴퓨터가 숫자 3개를 만들고, 사람이 제한된 횟수 내에 맞추어야 합니다.
C언어를 사용하였고, 같은 공부를 해도 흥미있게 하는 것이 더 좋은 학습결과를 가져오는데 여기에 나온 문법과 로직을 이해한다면 C언어의 문법과 프로그래밍의 흐름에 대한 기초는 다져졌다고 봐도 무방합니다. 일부 알고리즘은 다분히 수학적이므로 그냥 그런게 있구나하고 넘어가면 됩니다. 사실... 머리 좀 아픕니다.
한 가지 덧붙이자면 do~while문이 중첩된 상태로 크게 돌아가니 눈은 같이 돌아도 머리는 안 돌기를 바라... 컴파일하고, 실행하면 게임을 할 수 있습니다. 숫자를 입력할 때에는 '3 6 9 '의 형태로 입력하고 엔터키를 치면 됩니다. 먼저 표준함수를 인클루드 하고, 변수에 대한 정의와 선언을 해줍니다.
1: #include <stdio.h>
2: #include <stdlib.h>
3:
4: int main(void)
5: {
6: int i = 0, count, gamePlay = 0 ;
7: int strike = 0, ball = 0, scoreCheck = 0 ;
8:
9: int seed = time(NULL), totalGameScore = 0 ;
10:
11: int problem[3], guess[3] ; //problem:컴퓨터가 만든 숫자, guess:본인이 생각한 숫자
12:
13: double gameAverage = 0.0 ; // 평균 점수를 내기 위한 변수
14:
15: //system("cls") ;
16: printf("\n이건 야구 게임이야. 내가 생각한 숫자를 맞추는 거지.\n") ;
17: printf("1~9까지 세자리 숫자를 불러봐. 기회는 11번이야. 0하고 중복은 안돼~\n") ;
18:
19: srand(seed) ;
20:
21: // 난수 발생. 1~9까지 중복없는 숫자 3개 생성
22: do {
23: problem[0] = rand() % 10 ;
24: if(problem[0] == 0) {
25: problem[0] += 1 ;
26: }
27:
28: do {
29: problem[1] = rand() % 10 ;
30: if(problem[1] == 0) {
31: problem[1] += 1 ;
32: }
33: } while (problem[1] == problem[0]);
34:
35: do {
36: problem[2] = rand() % 10 ;
37: if(problem[2] == 0) {
38: problem[2] += 1 ;
39: }
40: } while (problem[2] == problem[0] || problem[2] == problem[1]) ;
41:
42: //시도 횟수를 초기화 한다.
43: count = 0 ;
44:
45: gamePlay++ ;
46:
47: do {
48: count++ ;
49:
50: do {
51: printf("\n\n게임:%d회, 시도:%d회 -> 생각한 3자리 숫자 불러봐 : ",
52: gamePlay, count) ;
53:
54: //숫자 3개를 입력받는다.
55: scanf("%d %d %d", &guess[0], &guess[1], &guess[2]) ;
56:
57: if (guess[0] == 0 || guess[1] == 0 || guess[2] == 0)
58: printf("\n0은 안된다고 했잖아요. 다시!") ;
59:
60: else if (guess[0] == guess[1] || guess[1] == guess[2] ||
61: guess[2] == guess[0])
62: printf("\n중복 안된다니깐요. 다시!") ;
63:
64: else if (guess[0] > 9 || guess[1] > 9 || guess[2] > 9)
65: printf("\n1~9까지랬잖아요. 다시!") ;
66: } while (guess[0] == guess[1] || guess[1] == guess[2] ||
67: guess[2] == guess[0] || guess[0] == 0 || guess[1] == 0 ||
68: guess[2] == 0 || guess[0] > 9 || guess[0] > 9 || guess[0] > 9);
69:
70: i = strike = ball = 0 ;
71:
72: //스트라이크와 볼을 판별하는 알고리즘 부분.
73: while (i < 3) {
74: if(guess[i] == problem[i]) strike++ ;
75: else if (guess[(i + 1) % 3] == problem[i]) ball++ ;
76: else if (guess[(i + 2) % 3] == problem[i]) ball++ ;
77: i++ ;
78: }
79:
80: //플레이어에게 알려준다.
81: printf("\n[%d Strike %d Ball]", strike, ball) ;
82: } while (strike < 3 && count < 11) ;
83:
84: //시도횟수에 따라 성적이 나온다. 3항 연산자를 사용했다.
85: printf("\n\n") ;
86:
87: (count <= 2) ? printf("대단해요~~ !!") :
88: (count <= 5) ? printf("아주 좋아요 !") :
89: (count <= 9) ? printf("굿~.") :
90: (strike == 3) ? printf("스트라이크 3개") : 0 ;
91:
92: //뭐, 아래는 별 설명이 없어도...
93: if (strike == 3)
94: printf("\n자긴 내가 생각한 수를 %d번 만에 맞췄어, 베이비~ 쪽\n", count) ;
95: else
96: printf("오, 예~ 자긴 내가 생각한 수를 맞추지 못했어, 내가 이겼어.\n"
97: "내가 생각한 수는 %d %d %d야.\n"
98: "자기 ..... 못맞췄구나~ 이걸 어째...원래는 0점이지만,\n"
99: "그래도 내가 인정이 있자나~, 기본점수는 줄께 너무 걱정마....\n",
100: problem[0], problem[1], problem[2]) ;
101:
102: totalGameScore += scoreCheck = 100 - --count * 8 ; //.... ?? 걍~ 패쑤~~.
103:
104: printf("자기 점수는 %d점이야. 우~\n", scoreCheck) ;
105: printf("\n게임 또 할꺼야 자기? (Y/N) ") ;
106: } while (getche() == 'y') ;
107:
108: gameAverage = totalGameScore / gamePlay ;
109:
110: printf("\n\n자기 평균점수 나왔다. %.1f점이네.\n"
111: "자기 내 생각 많이 하고 행복해~.", gameAverage) ;
112:
113: return 0 ;
114: }
자바(Java)의 `Random 클래스`로 구현한 숫자 맞추기 야구 게임
'ICT와 AI 정보' 카테고리의 다른 글
중국발 해킹 피해 (0) | 2010.03.27 |
---|---|
자바로 MAC address 구해보기 (0) | 2010.03.18 |
자바(Java) 파일 입출력 스트림(File I/O Stream) (0) | 2010.03.17 |
Java로 윤년 알아보는 프로그램 (0) | 2010.03.16 |
매개변수와 리턴 값이 있는 함수, 없는 함수 (0) | 2010.03.14 |
매개변수 전달방식 (0) | 2010.03.13 |
SQL 명령어 구문들 (Statements) (0) | 2010.03.12 |
SQL 명령어 뷰(view), 트랜잭션(Transaction) 구문 (0) | 2010.03.10 |