훈, IT 공부/C,C++,MFC

[프로그램]숫자 야구 게임

IT훈이 2018. 1. 24.
반응형

숫자야구 게임

 
숫자야구는 쉽게 접할 수 있는 놀이 중 한가지입니다.
 

무한도전을 통하여서도 한번 방영이 되었었죠???? 

 

시간 잘가고 재미있는 킬링타임 두뇌 게임입니다 ㅎㅎ

 
 
 
저는 숫자야구 게임을 프로그램으로 작성하는데 앞서서 
구조체를 사용하고 매개변수 전달법을 "Call By Reference"를 최대한 활용하여 진행해보려 합니다.
 

숫자야구 룰

일방적으로 상대방의 숫자 3개를 추측하는 방식으로 진행됩니다. ( 숫자의 개수는 전역변수 num의 값을 변경하면 됩니다. )

 

1. 상대방의 숫자를 선정합니다.

2. 사용자가 숫자를 선정합니다. ( 상대방의 숫자 예측할 것 )

- 위치가 같고 숫자가 같을경우에는 스트라이크 판정

- 위치가 다르고 숫자가 같을 경우에는 볼 판정

- 위치도 다르고 숫자도 다를 경우에는 아웃 판정

- 스트라이크가 3개일 경우 홈런 판정이 발생하며 게임종료

 

기능 1. 사용자가 입력하는 숫자의 오류를 판단하여 재입력 받음.

기능 2. 몇 번만에 성공을 하였는지 알려줌

#include<stdio.h>
#include<stdlib.h>    // rand 함수 사용을 위하여
#include<time.h>    // 랜덤함 숫자를 주기위해 

typedef struct s_b_o {
    int strike;
    int ball;
    int out;
}sbo;

int SettingFunc(int *s_com);
void StatusFunc(sbo *sbo_UI);
void CheckFunc(int *c_user, int *c_comm ,sbo *sbo_ck);
int UserInFunc(int *user_in);
const int num = 3;        //전역변수로 사용자 입력 숫자 설정

int main(){
    int nUserData[3] = { 0 };    // 유저의 숫자 3개 선언 및 정의
    int nComData[3] = { 0 }; // 컴퓨터의 숫자 3개 선언 및 정의

    sbo s_sbo = { 0 }; // 스트라이크,볼,아웃 구조체 선언 및 정의

    int ck_flag = SettingFunc(nComData);    // 숫자야구의 숫자 세팅 함수 
    if (ck_flag == 0){    // 숫자 입력을 실수하였을때 프로그램 종료
        puts("ERROR!!! 숫자 입력 오류");
        return 0;
    }
    /*    printf("컴퓨터 입력한 숫자:");
    for (int j = 0; j < 3; j++){
        printf("%d ", nComData[j]);
    }
    puts("");
    */    
    int count = 0;
    while (s_sbo.strike != num){
        ck_flag = 0;            // ck_flag 0으로 리셋 한다.
        while (ck_flag == 0){    // 숫자 입력을 실수하였을때 다시 입력 받음.
            ck_flag = UserInFunc(nUserData);
            if (ck_flag == 0) puts("ERROR!!! 숫자 입력 오류");
        }
        CheckFunc(nUserData,nComData,&s_sbo);
        StatusFunc(&s_sbo);
        count++;
    }
    printf("축하합니다 홈런입니다!!\n");
    printf("%d번 만에 성공!\n", count);

    return 0;
}

// 시작 UI 및 숫자를 세팅하는 담당 함수
int SettingFunc(int *s_com){
    puts(" === 숫자 야구 게임 === ");
    srand(time(NULL));
    // 컴퓨터의 숫자 입력
    for (int j = 0; j < num; j++){
        s_com[j] = rand() % 10;
        if ((s_com[0] == s_com[1] || s_com[0] == s_com[2] || s_com[1] == s_com[2])) j = 0;    // 중복숫자가 발생하지 않도록
    }
    // 컴퓨터 숫자입력 끝

    return 1; // 오류 아닐시 1을 return 
}

// 사용자 입력 인터페이스
int UserInFunc(int *user_in){

    printf("숫자 %d개를 입력하세요 :",num);
    scanf("%d %d %d", &user_in[0], &user_in[1], &user_in[2]);

    for (int i = 0; i < num; i++)    // 오류가 발생하면 return 0;
        if (user_in[i] < 0 && user_in[i] > 10) return 0;

    if (user_in[0] == user_in[1] || user_in[0] == user_in[2] || user_in[1] == user_in[2]) return 0; // 같은 숫자가 없어야한다.

    return 1;
}

int ball(int *b_user, int *b_com);        // ball 함수에 대한선언
int    strike(int *s_user, int *s_com);    // strike 함수에 대한선언
int out(int *o_user, int *o_com);        // out 함수에 대한 선언

// 숫자 야구의 핵심 알고리즘 함수s
void CheckFunc(int *c_user, int *c_com, sbo *sbo_ck){
    sbo_ck->strike = strike(c_user,c_com);
    sbo_ck->ball = ball(c_user,c_com);
    sbo_ck->out = out(c_user, c_com);
}

// 결과값 출력하는 Interface
void StatusFunc(sbo *sbo_UI){
    puts("결과는!?");
    printf("%dBall ", sbo_UI->ball);
    printf("%dStrike ", sbo_UI->strike);
    printf("%dOut\n\n", sbo_UI->out);    
}

// 볼 판정 함수
int ball(int *b_user, int *b_com){
    int nB = 0;
    for (int i = 0; i < num; i++){
        for (int j = 0; j < num; j++){
            if (b_user[i] == b_com[j] && i != j) nB++;    // 두 숫자는 같고 위치가 다를경우 볼판정
        }
    }
    return nB;
}

// 스트라이크 판정 함수
int    strike(int *s_user, int *s_com){
    int nS = 0;
    for (int i = 0; i < num; i++){
        if (s_user[i] == s_com[i]) nS++;    // 두개의 위치와 숫자가 같은경우 스트라이크
    }
    return nS;
}

// 아웃 판정 함수
int out(int *o_user, int *o_com){
    int nO = 0;
    int ck_out=0;
    for (int i = 0; i < num; i++){
        for (int j = 0; j < num; j++){
            if (o_user[i] != o_com[j]) ck_out++; // 하나를 가지고 세개와 비교하며 같은것이 없으면 3이된다.
        }
        if (ck_out == num) nO++;
        ck_out = 0;
    }
    return nO;
}

 

소스파일

baseball.c
다운로드

 

 

 

 

더 편하게 작성도 가능하고 더 편하게 더 간결하게 더 유지보수가 좋게 작성하는 방법도 많으리라 생각됩니다. 

 

" 혼자만의 코드세상에 머물지 말고 여러 코드를 보며 시야를 넓혀가야합니다. "

 

반응형

댓글