====== 入力の受け付けとチェック処理 ======
問題ができたら今度は、ユーザーの入力を作って、出題の数字列と比べる部分を作っていきます。\\
**(っていうか、ほとんどそれでゲーム出来上がっちゃうよね笑い)**
=== 今回のルール(おさらい) ===
* 被らない4桁の数字がランダムで生成され出題される
* プレイヤーは毎ターン4桁の数字を入力する
* コンピュータの応答として、入力した数字を答えと比べ以下を返す
* ヒット:位置も数字も答えと一致している桁数
* ブロー:数字はあっているけれども位置が違う数字の数
* ヒット=4の時は入力=出題なので、正解のメッセージを表示
* それ以外は、もう一度入力を促す。
* 正解するまでこれを繰り返す。
==== 入力ループを作っていくぅ ====
入力ループは、通常のゲームでいうゲームループみたいなもんになります。\\
- 入力メッセージ(プロンプト)表示
- 入力待ち
- (ユーザーの入力)
- コンピュータの応答
- 入力メッセージの表示に戻る
この流れを作っていきます。\\
とりあえず、無限ループで入力された4桁の数字(string input)を表示し続ける処理を書いてみます。\\
ここは特に工夫もいらんと思うので、そのまま提示します。\\
int main() {
srand((unsigned int)(time(nullptr)));
//早速作った関数で問題の変数を初期化
string answer;
MakeProblem(answer);
string input;
while(true){
cout << "予想した4桁の整数を入力:";
cin >> input;
//入力エラー処理をして、エラーがなかったら
//答え合わせをここでする。
cout << input << endl;
//デバッグのため、入力をそのまま表示
//=入力した数字が文字列として変数化されそのまま表示されればOKってこと
}
}
int main() {
srand((unsigned int)(time(nullptr)));
//早速作った関数で問題の変数を初期化
char answer[5];
char input[100];
MakeProblem(answer);
while(1){
printf("予想した4桁の整数を入力:");
scanf("%s", input);
//入力エラー処理をして、エラーがなかったら
//答え合わせをここでする。
printf("%s", input);
//デバッグのため、入力をそのまま表示
//=入力した数字が文字列として変数化されそのまま表示されればOKってこと
}
}
==== 次は、えらいこっちゃなエラーチェック処理 ====
**これで入力できたんだから、後正解のチェックすればいいじゃん!**\\
と思ったかもですが、そうはいきません。\\
ユーザーってやつは何するか分からないものです。\\
ゲームでもそうですが、こちらで規定された入力以外ははじいてやる必要があります。\\
(ここでも、データ型をstringにしておいた恩恵があるよ(C++の人だけ))\\
じゃぁ、考えられる入力エラーを何個かリストアップしてみましょう。\\
* '0'~'9'の数字以外の文字を入力しただろ!なエラー
* 4桁って言ってんのに4桁に足りないだろ!なエラー
* 4桁って言ってんのに4桁以上あるだろ!なエラー
* 被らん数字って言ってんのに数字がかぶってるだろ!なエラー
簡単なものを考えると大体この4つに分類されるかなと思います。\\
後で使うかもしれないので、エラーに番号を付けます。(使わないかもだけど)\\
* 0: エラーなし
* 1: 桁数エラー(多いのも少ないのも)
* 2: 数字以外が混じっている
* 3: 数字がかぶっているものがある
入力された数列を調べて、エラーがあればその番号を返す関数を作ります。\\
(エラーが複数重なった時は先に検出した方を返します(2個返すとかめんどいもの))
**関数への入力と出力(引数と戻り値の型)はどうなるでしょうか?**\\
戻り値の型: エラー番号なので整数\\
引数: ユーザーの入力した数列の文字列\\
なので、以下のような関数を作ります。\\
; 戻り値の型 : エラー番号(整数)
; 引数 : 入力文字列
; 例(C++) : int CheckAnswerError(const string& input);
; 例(C言語) : int CheckAnswerError(char input[5]);
==== エラー処理関数の作成 ====
int CheckAnswerError(string input)
{
//0:エラーなし, 1:桁数エラー 2:数字以外が混じっている 3:数字がかぶっているものがある
//複数エラーの時はどうしようね?(今んところ1から見て行って見つかった時点でエラー番号返して終わるよ
//桁数エラーのチェック
if (桁数おかしいかな?のチェック){
//C++では、inputのサイズか長さを調べればいいよ
//C言語では、strlenという関数で調べられるよ(使い方はググろう!)
return 1;
}
//数字以外が混じっていないかチェック
//C言語の人は0~3までの4文字しかないからそれでループしちゃえばいいよね
//(それ以外の文字数の時はすでに上の処理で弾いてるはず!)
for (int i=0;i< _input.length();i++) //input中の各文字を1文字ずつチェックしていく
{
//下の解説を参照(isdigit)
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;
}
int CheckAnswerError(char input[5])
{
//入力が4桁の数字であることを確認
if (桁数がおかしい?) {
return 1; //桁数エラー
}
//数字以外が混じっていないか確認
if (数字以外が混じっている) {
return 2; //数字以外が混じっている
}
//数字がかぶっていないか確認
if(数字がかぶっていたら){
return 3; //数字がかぶっている
}
return 0; //エラーなし
}
=== int std::isdigit(char c) ===
入力した文字が、数字以外かどうかの判別は、引数のchar型の変数が数字の文字か、そうじゃないかを判別する関数があるのでそれを使う。\\
(''#include '' または、''#include '' が必要)
; C++ : int std::isdigit(char c)
; C言語 : int isdigit(char c)
使い方:\\
int c = '4';
if(isdigit(c)) //'4'は数字なのでtrueが返る、 'a'や'+'など数字以外の時はfalseが返る。
cout << "数字です" << endl;
else
cout << "数字以外の文字です" << endl;
==== できた関数をチェックしよう ====
さっきの入力ループを使ってできた関数をチェックしていくぅ!\\
ここは、CでもC++でも変わらん感じかな。自分で考えてみようね!
int main() {
srand((unsigned int)(time(nullptr)));
//早速作った関数で問題の変数を初期化
string answer;
MakeProblem(answer);
string input;
while(true){
cout << "予想した4桁の整数を入力:";
cin >> input;
cout << CheckAnswer(input) << endl;
//返ってきたエラー番号を表示するよ
//答え合わせをここでする。
}
}
int main() {
srand((unsigned int)(time(nullptr)));
//実体作っておかないと怒られるよ
char resStr[5];
char input[255];//入力は、何入れられるかわからんので多めに取っておく
//配列の初めから4つ取り出してresStrにコピー
MakeProblem(resStr);
//出来上がった4桁のかぶらない数列を表示(stringだからそのまま送ると表示できる)
//printf("NUMBER: %s", resStr);
while (1)
{
printf("予想した4桁の整数を入力:");
scanf("%s", &input);
//入力エラー処理をして、エラーがなかったら
//答え合わせをここでする。
printf("%d\n", CheckAnswerError(input));
//入力エラーチェックの戻り値をそのまま表示
}
}
エラー検出の結果がこんな感じになればちゃんとエラー検出できている。\\
(見づらい時は、画像をクリックして、大きい画像で表示してみてね)\\
{{:game-engineer:classes:2023:something-else:summertime-special-cource:resultimage.png?400|}}
入力エラーの検出
|< 300px 50% 50% - >|
^ [[game-engineer:classes:2025:something-else:summertime-special-cource:console-3|その3へ]] ^ [[game-engineer:classes:2025:something-else:summertime-special-cource:console-5|その5へ]] ^