2010. 3. 15. 14:34

C 언어로 만든 숫자 맞추기 일명 야구게임

학창시절에 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 클래스`로 구현한 숫자 맞추기 야구 게임