問題ができたら今度は、ユーザーの入力を作って、出題の数字列と比べる部分を作っていきます。
(っていうか、ほとんどそれでゲーム出来上がっちゃうよね笑い)
入力ループは、通常のゲームでいうゲームループみたいなもんになります。
この流れを作っていきます。
とりあえず、無限ループで入力された4桁の数字(string input)を表示し続ける処理を書いてみます。
ここは特に工夫もいらんと思うので、そのまま提示します。
int main() { srand((unsigned int)(time(nullptr))); //早速作った関数で問題の変数を初期化 string answer = MakeProblem(); string input; while(true){ cout << "予想した4桁の整数を入力:"; cin >> input; //入力エラー処理をして、エラーがなかったら //答え合わせをここでする。 cout << input << endl; //デバッグのため、入力をそのまま表示 //=入力した数字が文字列として変数化されそのまま表示されればOKってこと } }
これで、後正解のチェックすればいいじゃん!
と思ったかもですが、そうはいきません。
ユーザーってやつは何する変わらんものです。
ゲームでもそうですが、こちらで規定された入力以外ははじいてやる必要があります。
(ここでも、データ型をstringにしておいた恩恵があるよ)
じゃぁ、考えられる入力エラーを何個かリストアップしてみましょう。
簡単なものを考えると大体この4つに分類されるかなと思います。
後で使うかもしれないので、エラーに番号を付けます。(使わないかもだけど)
入力された数列を調べて、エラーがあればその番号を返す関数を作ります。
関数への入力と出力(引数と戻り値の型)はどうなるでしょうか?
戻り値の型: エラー番号なので整数
引数: ユーザーの入力した数列の文字列
なので、以下のような関数を作ります。
```int CheckAnswer(string _input);```
int CheckAnswer(string _input) { //0:エラーなし, 1:桁数エラー 2:数字以外が混じっている 3:数字がかぶっているものがある //複数エラーの時はどうしようね?(今んところ1から見て行って見つかった時点でエラー番号返して終わるよ //桁数エラーのチェック if (桁数おかしいかな?のチェック) return 1; //数字以外が混じっていないかチェック for (int i=0;i< _input.length();i++) //input中の各文字を1文字ずつチェックしていく { if (文字以外が入っていたら) return(2); } //数字のかぶりをチェック for (int i = 0; i < _input.length(); i++) { for (int j = i + 1; j < _input.length(); j++) { if (数字が同じかチェック) return 3; } } //これらをかいくぐってエラーなしでここまでたどり着いたら何を返せばいいかな? return xxxxxx; }
入力した文字が、数字以外かどうかの判別は、引数のchar型の変数が数字の文字か、そうじゃないかを判別する関数があるのでそれを使う。
使い方:
int c = '4'; if(isdigit(c)) //'4'は数字なのでtrueが返る、 'a'や'+'など数字以外の時はfalseが返る。 cout << "数字です" << endl; else cout << "数字以外の文字です" << endl;
さっきの入力ループを使ってできた関数をチェックしていくぅ!
int main() { srand((unsigned int)(time(nullptr))); //早速作った関数で問題の変数を初期化 string answer = MakeProblem(); string input; while(true){ cout << "予想した4桁の整数を入力:"; cin >> input; cout << CheckAnswer(input) << endl; //返ってきたエラー番号を表示するよ //答え合わせをここでする。 } }
エラー検出の結果がこんな感じになればちゃんとエラー検出できている。
(見づらい時は、画像をクリックして、大きい画像で表示してみてね)