반응형
숫자야구 게임
숫자야구는 쉽게 접할 수 있는 놀이 중 한가지입니다.
무한도전을 통하여서도 한번 방영이 되었었죠????
시간 잘가고 재미있는 킬링타임 두뇌 게임입니다 ㅎㅎ
저는 숫자야구 게임을 프로그램으로 작성하는데 앞서서
구조체를 사용하고 매개변수 전달법을 "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;
}
소스파일
더 편하게 작성도 가능하고 더 편하게 더 간결하게 더 유지보수가 좋게 작성하는 방법도 많으리라 생각됩니다.
" 혼자만의 코드세상에 머물지 말고 여러 코드를 보며 시야를 넓혀가야합니다. "
반응형
'훈, IT 공부 > C,C++,MFC' 카테고리의 다른 글
[프로그램]복권(로또)게임 #랜덤으로 뽑기(자동) (0) | 2018.01.30 |
---|---|
포인터에 대해서 깊고 세밀하고 정확하게 이해하기!!! (0) | 2018.01.24 |
[독하게C]함수에 대한 기본이론과 사용 주의점!! (feat.전역변수) (0) | 2018.01.18 |
헝가리안 표기법이란 (0) | 2018.01.04 |
ASLR이란? 왜 계속 주소가 바뀌는건가요!!! (메모리변조) (0) | 2018.01.03 |
댓글