배운게 적은만큼 배운만큼만.
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
int checkStrike(char* rdn, char* ipn); //RanDomNum, InPutNum ; return the number of 'STRIKE'
int checkBall(char* rdn, char* ipn); // '' ; return the number of 'BALL'
bool checkIsOut(char* rdn, char* ipn);
bool checkIsValid(char* ipn);
bool checkSameBalls(char* balls, int index);
int main(){
srand(time(0));
char randomNum[5]="****", inputNum[5]="****"; //initialize to '*'
char exitCheck;
int count=0;
cout<<"------------------BaseBall Game!-----------------"<<endl;
while(1){
for(int i=0;i<4;i++){
randomNum[i]=rand()%10 +48; //create number between 0 to 9
if(!checkSameBalls(randomNum, i))
i--;
}
cout<<randomNum<<endl;
count=0; //카운트 초기화
cout<<"무작위 수 생성완료. 게임을 시작하세요"<<endl;
while(1){
cout<<"수 입력::";
while(1){
cin>>inputNum;
if(checkIsValid(inputNum))
break;
else
cout<<"제대로 입력해라"<<endl;
}
if(!checkIsOut(randomNum,inputNum)){
cout<<checkStrike(randomNum,inputNum)<<"S "<<checkBall(randomNum,inputNum)<<"B"<<endl;
count++;
}
else{
cout<<"Out!!!!! 맞췄습니다."<<endl;
break;
}
}
cout<<"\n\n 계속할까요?? (y,n) ::";
cin>>exitCheck;
if(exitCheck=='n')
break;
else if(exitCheck=='y')
continue;
else
cout<<"!!예상치못한 입력값!! 게임을 다시 진행해버리렵니다."<<endl;
}
cout<<"게임을 종료합니다. 수고하셧다."<<endl;
return 0;
}
int checkStrike(char* rdn, char* ipn){
int strike=0;
for(int i=0;i<4;i++){
if(rdn[i]==ipn[i])
strike++;
}
return strike;
}
int checkBall(char* rdn, char* ipn){
int ball=0;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(rdn[i]==ipn[j] && i!=j){ //같은순번은 볼검사 필요없음
ball++;
break; //자기자신과 같은게 나왔다면 그 후로는 같은게 나올 수 없으므로 루프탈출
}
}
}
return ball;
}
bool checkIsOut(char* rdn, char* ipn){
for(int i=0;i<4;i++){
if(rdn[i]!=ipn[i])
return false;
}
return true;
}
bool checkIsValid(char* ipn){
if(strlen(ipn)!=4) //check its length
return false;
for(int i=0;i<4;i++){ //check its validity about numeric
if(ipn[i]<48 || ipn[i]>57 || !checkSameBalls(ipn,i))
return false;
}
return true;
}
bool checkSameBalls(char* balls, int index){
for(int j=0;j<4;j++){
if(balls[index]==balls[j] && index!=j)
return false;
}
return true;
}
쓸데없는 메모리낭비도 있고, 효율적이지 못한 에러처리도 있고...
그럴땐 요런 처리를 해주면 된다.
//-----------------int type 유효성 검사-------------------//
int x;
while(true){
cin >> x;
if(cin.fail() == false) // 입력 성공시에만 루프 탈출
break;
else{
cout << "fail" << endl;
cin.clear();
cin.ignore(512, '\n'); // 입력이 실패하면 입력값을 초기화
}
}
//지식인 긁어온 소스 ㅋ
//------------------------------------------------//
..