問題作成と、ユーザーの入力までできたので、次はいよいよヒットとブローの判定をする。
今回のルール
ヒットとブローの判定は、とても簡単。
問題の数列(```answer```)とユーザの入力(```input```)を比較して、ごにょごにょして、ヒット数とブロー数を数えるだけです。
それぞれ、以下のような関数を作ってHITとBLOW別々に判定してみましょう。(別に一緒にやってもいいんだけど、なんとなく別にします)
HIT:数字も位置も一致している。なので。
HIT数は簡単に求められます。answerとinputの各桁同士を比較して一致しているものの数を返せばいいです。
int CountHit(string _ans, string _input) { int count = 0; //チェック通ってるんで、_ansとinputの長さは同じ前提 for (int i = 0; i < _ans.length(); i++ ) { if (ヒットかどうかの判定) { count++; } } return(count); }
BLOW:数字はあっているけど、位置はずれている。なので。
BLOW数は簡単に求められます。answerとinputの各桁同士を比較して一致しているものの数を返せばいいです。
int CountBlow(string _ans, string _input) { int count = 0; //チェック通ってるんで、_ansとinputの長さは同じ前提 for (int i = 0; i < _ans.length(); i++) { for(int j = 0; j < _input.length(); j++) { if (BLOWかどうか) { if(HITの時は除いてカウントする) count++; } } } return(count); }
関数の中でいろんなチェックをしなくてよいように、エラーチェックに通った時だけHIT数、BLOW数のカウントを行います。
前回までの入力ループを以下のように変更してみよう
int main() { string answer = "0000"; //正答 string input = "0000"; //入力用 srand((unsigned int)(time(nullptr))); answer = MakeProblem(); cout << "THE HIT AND BLOW GAME" << endl; cout << "Let's Play the GAME!!" << endl; while (true) { cout << "予想した4桁の整数を入力:"; cin >> input; if (エラー処理で問題なかったら) { //HIT数を数えて表示 cout << " Hit:" << HIT数カウント呼び出し << endl; //BLOW数を数えて表示 cout << "Blow:" << BLOW数カウント呼び出し << endl; } } return 0; }