今回のルール(ふたたび)

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

次に、問題となる4桁の数字を生成します。
どうしたらいいでしょうか?
トランプを使って、ランダムな4桁の数字を作ることを考えてみます。
トランプは、同じカード(ジョーカーは除く)ってないよね。

  1. トランプのスート(マーク)のうちハートだけを取り出します。(1~13)このセットを使います。
  2. セットをシャッフルする(ランダムな1~13の数列ができる)
  3. 上から4枚取り出す(数字の被らない4枚のカードが取り出せる)

この手順を、アルゴリズムとして0~9の数字を使ってやってみましょう。

Listing. 1: C言語版
#include <cstdio>
 
using namespace std;
 
int main() {
	srand((unsigned int)(time(nullptr)));
	//被らない4桁のランダム数を作りたいから
	//"123456789"をシャッフルする
	char temp[] = "1234567890"; //0~9までのかぶらない数を準備
	//100回くらいシャッフルしたらランダムでしょう。。。
	for (auto i = 0; i < 100; i++) {
		int randnum1 = ********** //0~9の乱数1
		int randnum2 = ********** //0~9の乱数2
		//indexがrandnum1の要素とrandnum2の要素を交換する
                ****************************************;
	}
 
	//実体作っておかないと怒られるよ
	char resStr[]="0000";
        //配列の初めから4つ取り出してresStrにコピー
	for (****************)
	{
		resStr[i] = *******;
	}
        //出来上がった4桁のかぶらない数列を表示(stringだからそのまま送ると表示できる)
	printf("NUMBER: %s", resStr);
        return 0;
}
Listing. 2: C++版
"4桁のかぶらない数字"
 #include <iostream>
using namespace std;
int main() {
	srand((unsigned int)(time(nullptr)));
	//被らない4桁のランダム数を作りたいから
	//"123456789"をシャッフルする
	string temp = "1234567890"; //0~9までのかぶらない数を準備
	//100回くらいシャッフルしたらランダムでしょう。。。
	for (auto i = 0; i < 100; i++) {
		int randnum1 = ********** //0~9の乱数1
		int randnum2 = ********** //0~9の乱数2
		//indexがrandnum1の要素とrandnum2の要素を交換する
                ****************************************;
	}
 
	//実体作っておかないと怒られるよ
	string resStr="0000";
        //配列の初めから4つ取り出してresStrにコピー
	for (****************)
	{
		resStr[i] = *******;
	}
        //出来上がった4桁のかぶらない数列を表示(stringだからそのまま送ると表示できる)
	cout << resStr;
}

今後、プログラムを効率よく作るために、問題生成を関数化し、以下のように使えるようにしたい。
C++のコードだけど、わかるよね?

"問題作成関数をつくる"
#include <iostream>
using namespace std;
 
//void MakeProblem(string& question) C++の人
void MakeProblem(char question[5]) //Cの人
{
    //char temp[] = "0123456789";  /* 11バイト (\0 含む) Cの人*/
    //string temp = "0123456789"; //C++の人
    //0~9の乱数を2個出して、その2つのインデックス temp[x]とtemp[y] (0<= x,y <= 9)の中身を交換
    //を適切な数くらい(よく混ざる程度)繰り返す
    //tempの頭から4文字分を、question[0]~question[3]+question[4]='\0'を作って返す
    //って言ってもreturnじゃなく引数で返すパティーン
}
 
int main() {
    srand((unsigned int)(time(nullptr)));
    //ここで、関数呼び出し。
    //関数は文字列を返すのでそのまま出力
    cout << MakeProblem() << endl;
    //printf("%s\n", MakeProblem());
}

戻り値の型 関数名は、

C++
string MakeProblem();
または
void MakeProblem(string &question);
C言語
char* MakeProblem();
または
void MakeProblem(char question[5]);

とする。
引数は、特に必要ないのでなし(void)でよい。

つくったら、上のソースコードのように表示してみて、何回か実行したときに別の4桁の数字が出てくることを確認しよう!

  • game-engineer/classes/2025/something-else/summertime-special-cource/console-3.txt
  • 最終更新: 6カ月前
  • by root