正誤判定、HIT、BLOWの判定

問題作成と、ユーザーの入力までできたので、次はいよいよヒットとブローの判定をする。

今回のルール

  • 被らない4桁の数字がランダムで生成され出題される
  • プレイヤーは毎ターン4桁の数字を入力する
  • コンピュータの応答として、入力した数字を答えと比べ以下を返す
    • ヒット:位置も数字も答えと一致している桁数
    • ブロー:数字はあっているけれども位置が違う数字の数
  • ヒット=4の時は入力=出題なので、正解のメッセージを表示
  • それ以外は、もう一度入力を促す。
  • 正解するまでこれを繰り返す。

ヒットとブローの判定は、とても簡単。
問題の数列(```answer```)とユーザの入力(```input```)を比較して、ごにょごにょして、ヒット数とブロー数を数えるだけです。
それぞれ、以下のような関数を作ってHITとBLOW別々に判定してみましょう。(別に一緒にやってもいいんだけど、なんとなく別にします)

  • int CountHit(string _ans, string _input);
  • int CountBlow(string _ans, string _input);

int CountHit(string _ans, string _input);の作成

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);
}

int CountBlow(string _ans, string _input);の作成

BLOW:数字はあっているけど、位置はずれている。なので。
BLOW数は簡単に求められます。answerとinputの各桁同士を比較して一致しているものの数を返せばいいです。

"BLOW数のカウント処理"
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数のカウントを行います。
前回までの入力ループを以下のように変更してみよう

"入力チェック通ったら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;
}

その5(その後)へ

  • game-engineer/classes/2023/something-else/summertime-special-cource/console-4.txt
  • 最終更新: 3年前
  • by root