=== 今回のルール(ふたたび) ===
* 被らない4桁の数字がランダムで生成され出題される
* プレイヤーは毎ターン4桁の数字を入力する
* コンピュータの応答として、入力した数字を答えと比べ以下を返す
* ヒット:位置も数字も答えと一致している桁数
* ブロー:数字はあっているけれども位置が違う数字の数
* ヒット=4の時は入力=出題なので、正解のメッセージを表示
* それ以外は、もう一度入力を促す。
* 正解するまでこれを繰り返す。
==== 問題作成:被らないランダムな4桁の数字 ====
次に、問題となる4桁の数字を生成します。\\
どうしたらいいでしょうか?\\
トランプを使って、ランダムな4桁の数字を作ることを考えてみます。\\
トランプは、同じカード(ジョーカーは除く)ってないよね。
- トランプのスート(マーク)のうちハートだけを取り出します。(1~13)このセットを使います。
- セットをシャッフルする(ランダムな1~13の数列ができる)
- 上から4枚取り出す(数字の被らない4枚のカードが取り出せる)
この手順を、アルゴリズムとして0~9の数字を使ってやってみましょう。\\
C言語版
#include
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;
}
C++版
#include
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
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桁の数字が出てくることを確認しよう!\\
|< 300px 50% 50% - >|
^ [[game-engineer:classes:2025:something-else:summertime-special-cource:console-2|その2へ]] ^ [[game-engineer:classes:2025:something-else:summertime-special-cource:console-4|その4へ]] ^