====== ゲームを作っていくぅ ====== まずいつもの通り、projectを作ります。\\ 今回はコンソールアプリなので、visual studioでもいいし、[[https://replit.com/|replit.com]]でも[[https://paiza.io/ja|paiza.io]]でもできます。\\ __**(もう何も見ないでproject作れない人とかいないよね。。。)**__\\ === 今回のルール === * 被らない4桁の数字がランダムで生成され出題される * プレイヤーは毎ターン4桁の数字を入力する * コンピュータの応答として、入力した数字を答えと比べ以下を返す * ヒット:位置も数字も答えと一致している桁数 * ブロー:数字はあっているけれども位置が違う数字の数 * ヒット=4の時は入力=出題なので、正解のメッセージを表示 * それ以外は、もう一度入力を促す。 * 正解するまでこれを繰り返す。 ==== まずは、設計 ==== とりあえず、ゲームの設計を考えます。\\ まずはデータ構造を考えていきます。問題とプレイヤーの入力の変数の型は何がいいでしょうか?\\ 使う数字は0~9にしたいと思います。\\ **4桁のかぶらない整数を使うので、intに決まってんじゃん。\\ **\\ って思ったひとは、考えが浅いです。\\ **1234**や**5792**などはいいかもしれないですが、**0123**のような数はどうしたらいいでしょうか? ちょい困ったことが起きます。\\ C++では整数の初めに0をつけると、その数は8進数として扱われる。\\ つまり、0789などの数は、8進数に8なんて数字使えないよ!ということでエラーになる\\ しかも、数字以外の文字を入力されたとき、エラーになってとんでもないめんどくさいことになります。\\ どうしたらよいでしょうか?\\ 。。。\\ そうですね。charの配列か、stringを使えばいいですね!\\ それで、出題と入力それぞれの、入力文字が等しいかどうか確認すればいいですね。\\ もうちょい考えてみます。、\\ //4文字+'\0' char input[5]; cout << "答えを入力" << endl; cin >> input; このコードの問題点はどこでしょう?\\ 4文字以上入力があった場合、配列が間に合わなくてエラーになる可能性が高いところです。\\ 4文字以上の入力は、どうせゲーム上のルールでもエラーなのですが、この時点では防ぎようがないよね。\\ なので、stringで入力をとっちゃうのがいいです。\\ //answer : コンピュータの用意した答え //input : ユーザーの入力 string input,answer; ==== 被らないランダムな4桁の数字 ==== 次に、問題となる4桁の数字を生成します。\\ どうしたらいいでしょうか?\\ トランプを使って、ランダムな4桁の数字を作ることを考えてみます。\\ - トランプのスートのうちハートだけを取り出します。(1~13)このセットを使います。 - セットをシャッフルする(ランダムな1~13の数列ができる) - 上から4枚取り出す(数字の被らない4枚のカードが取り出せる) この手順を、アルゴリズムとして0~9の数字を使ってやってみましょう。\\ #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; } ==== できた処理を関数化しよう! ==== 今後、プログラムを効率よく作るために、問題生成を関数化し、以下のように使えるようにしたい。 #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; } 戻り値の型 関数名は、\\ **string MakeProblem();** とする。\\ 引数は、特に必要ないのでなし(void)でよい。\\ つくったら、上のソースコードのように表示してみて、何回か実行したときに別の4桁の数字が出てくることを確認しよう!\\ [[game-engineer:classes:2023:something-else:summertime-special-cource:console-3|その3へ]]