C++でスロットを作ってみよう
-ランダムな数字を出して当たりの条件を付ける-
プログラムを勉強したことが無い人でもとても簡単にゲームを作る基礎をC++を使用して実際に作りながら
プログラミングをしたことがない人に向けて教える感覚で説明していきます。
今回でスロットを3つ揃えて当たりではありませんが、ランダムな数字を1度表示させてその数字が一定数以上だった場合に当たりになる仕組みを作っていきます。
ランダムな数字を表示させるrand関数を使ってみる
まずはランダムな数字を表示させる準備を進める為にrand()関数を使用する準備を進めます。
まずはrand()という関数がどういうものかを確認する為に以下の関数を準備します。
rand()の関数を使用するには<stdlib.h>をインクルードする必要があるので、インクルードするファイルを書き足すことも忘れずに行います。
#include <stdio.h> #include <stdlib.h> int stopSlot() { int random = 0; random = rand(); printf("ランダムな数字は%d\n", random); return random; }
ランダムな数字を表示させるのはこれだけで準備ができます。
この rand() がランダムな数字に置き換わるという感覚で見れれば良いかと思います。
後はこの作ったstopSlot()の関数をメインの中で呼び出すと関数を使ったタイミングでランダムな数字が表示されるようになります。
今回の場合はスロットの掛け金を決めた直後にランダムな数字を表示させたいので、checkBet()の関数の直後に書きます。また後で当たりの判定を作って所持金を変動させる為計算の部分を消しておきます。
これでメインの関数のコードが以下のように変えて下さい。
int main() { int money = 1000; int bet = 0; //所持金を表示 printOwnMoney(money); //賭け金の確認 bet = checkBet(); //ランダムな数字を表示 stopSlot(); //所持金を表示2回目 printOwnMoney(money); //賭け金の確認 bet = checkBet(); //ランダムな数字を表示 stopSlot(); //所持金を表示3回目 printOwnMoney(money);
上のようにコードが書き換えれたら一度実行して下さい。
すると1回目と2回目の掛け金を入力した後にランダムな数字が出てるように見えると思います。
しかしこの数字は何度も実行してみると分かるのですが、何度やっても同じ数字がランダムで生成されるようになっています。
この数字をランダムにする為にシード値と呼ばれるものを設定する必要があります、この値は簡単に言うとランダムな数字の初めに出てくる数字を自由に変える為の数字です
主に現在時刻によってランダムの値が切り替わるようにするのが最も簡単で分かりやすいもので以下のコードをメインの一番最初に書き加えることでよりランダムな数字が表示されるようになります。
#include <time.h> srand(time(NULL));
srand関数を使用するのには<time.h>をインクルードする必要があるので更にインクルードするファイルを追加して、メイン関数の最初に上記の srand(time(NULL)); を書き足してください。
これで再度実行することでランダムな数字が実行を開始した時間によって変わるようになっている為、何度か実行してみて毎回同じ数字が表示されることがないようになります。
しかし出てくる数字がスロット内に表示するには規模が大きいものが表示される為、このランダムで表示される上限の値を演算子の回で説明した「割った時の余りを求める記号」を使用して設定することができます。
更に stopSlot() の関数のランダムの関数にコードを書き加えて以下のようにします。
int stopSlot() { int random = 0; int maxNumber = 10; //maxNumberより小さいランダムな数字が入る random = rand() % maxNumber; printf("ランダムな数字は%d\n", random); return random; }
これでランダムな数字は0から9までの数字しか表示されないようになりました。
今作成した maxNumber の値を自由に変えるとランダムな数字は設定した値より小さい数字が表示されるようになります。
if文を使って当たりとハズレの条件分岐を作る
ここまででランダムな数字が自由に表示できるようになったのであと一歩で最低限のゲームとしてなり立つところまできています。
出てきた数字がある一定の値以上の場合は「当たり」として扱い掛け金に応じて所持金が増え、逆に一定以下の場合は「ハズレ」として所持金を減らすシステムを作ります。
それを踏まえて先ほど作成したスロットを止める関数に要素を書き加えていきます。
少し用途も変わったので関数の名前も少し変更します。
//スロットを止めて報酬金額を確定させる int stopSlotAndGetMoney(int bet) { int number = -1; int maxNumber = 10; int winNum = 5; //maxNumberより小さい数字を表示 number = rand() % maxNumber; printf("\n"); printf("スロットの数字は%dだ",number); printf("\n"); //条件その1 if (number == maxNumber - 1) { bet = bet * 10; printf("これは最大の数字だ!\n"); printf("大当たりー!\n"); printf("%dコイン増えました\n",bet); } //条件その2 else if (number >= winNum) { printf("当たりー!\n"); printf("%dコイン増えました\n",bet); } //設定して以外の条件 else { printf("残念!\n"); printf("%dコイン減りました\n", bet); bet = -bet; } return bet; }
この関数で所持金から増減させたい額を戻り値に設定したり、関数の名前などを変えたのでメイン関数内のスロットを止める関数を使用している箇所も書き換えていきます。
int main() { srand((time(NULL))); int money = 1000; int bet = 0; //所持金を表示 printOwnMoney(money); //賭け金を設定する関数 bet = checkBet(); //所持金より多い数の場合はスロットが開始できないように設定 if(bet <= money){ //スロットを開始して所持金を変動させる money += stopSlotAndGetMoney(bet); } else { printf("その金額は賭けられません。\n"); } //所持金を表示(2回目) printOwnMoney(money); //賭け金で変動する関数 bet = checkBet(); //所持金より多い数の場合はスロットが開始できないように設定 if(bet <= money){ //スロットを開始して所持金を変動させる money += stopSlotAndGetMoney(bet); } else { printf("その金額は賭けられません。\n"); } //所持金を表示(3回目) printOwnMoney(money); //今は入力で止めるために使用 printf("\n"); printf("数字を入力して終了します。"); scanf_s("%d", &bet); return 0; }
これでスロットを止める関数内で設定した条件に応じて所持金に対して増減させる金額を足して変動するようになりました。
また今までの場合だと所持金以上の金額を賭けてもそのまま動作していたので、所持金より大きい数字を入力した場合はスロットを止める処理に移動しないように条件を書き加えています。
この状態で実行すると
5以上の数字が出た場合は賭け金の分だけ所持金が増え、
4以下の数字が出た場合は賭け金の分だ所持金が減るようになっていて、
おまけに一番最大の9が出た場合は賭け金の10倍の金額が獲得できるシステムとなっていてかなり簡素なスロットが完成しています。
少しゲームっぽくする為に
ここまででゲームをプレイする上で必要最低限の基礎ができたので少しでもコマンドプロンプト上で動作しているように見えるようする為にsystem(“cls”)というコードを使用します。
このコードsystem()はコマンドプロンプト上で括弧の中に書いた内容を実行させるという意味があります。
ここで使用している(“cls”)はコマンドプロンプト上で入力すると画面に表示されている内容を一度すべて削除するという意味がります。
これを使用して入力されたタイミングで数字が表示されるスロットを作ります。
スロットの見た目の関数を以下のように作ります。
//スロットのUIを表示する void showSlotUI(int bet, int slotNum) { system("cls"); printf("\n"); printf("・掛け金:%dコイン\n", bet); if (slotNum < 0) { printf("■===■\n"); printf("■ ? ■\n"); printf("■===■\n"); printf("\n"); } else { printf("■===■\n"); printf("■ %d ■\n",slotNum); printf("■===■\n"); printf("\n"); } return; }
この関数が準備できたらスロットを止めるのに使用している関数を編集して上の関数を使えるようにします。
stopSlotAndGetMoney関数を下のコードのここからと書いた場所からここまでの部分を書き加えてください。
int number = -1; int maxNumber = 10; int winNum = 5; //ここから int input = 0; showSlotUI(bet, number); printf("%d以上が出たら当たり\n",winNum); printf("数字を入力してストップ\n"); scanf_s("%d", &input); showSlotUI(bet, number); //ここまで printf("\n"); printf("スロットの数字は%dだ",number); printf("\n");
これで実行すると賭け金を設定した後にスロットが画面に表示されます。
そして数字を入力してエンターを押したタイミングでスロット内の数字が表示されるようになります。
コマンドプロンプト上なので見た目に限度はありますが、少しは楽しめる見た目にはなっていると思います。
if文の使い方
条件の演算子とif文
今回使用したコードの if は特定の条件の場合毎にプログラムの内容が変わるようにしたい場合に使用します。
コード上に if と書いた後に『( )』この括弧の中に条件を書いて、その後『{}』で区切ることで『{}』の中身のプログラムは『()』の条件に当てはまらない場合は実行されません。
条件を書く際は条件があっているかどうかを確認する演算子があり、下記のものがあります。
演算子の記号 | 演算子の意味 |
== | 左辺と右辺が全く同じ場合に条件があっていると判定させる。 数字だけなく文字などあらゆる型同士を条件として比較することができる。 |
< | 左の数字が右の数字より小さい場合にあっていると判定 |
> | 左の数字が右の数字より大きい場合にあっていると判定 |
<= | 左の数字が右の数字以下の場合にあっていると判定 同じ数字の場合もあっていると判定 |
>= | 左の数字が右の数字以上の場合にあっていると判定 同じ数字の場合もあっていると判定 |
C++では条件があっていた場合は値に『true』に置き換わり、そうでない場合は『false』に置き換わるようになっており、if文の『()』の中が『true』となるものが入るとその後のコードが実行されます。
条件の演算子を踏まえて以下に例を書いてみます。
int main () { int Number = 1; int value = 3; //条件① 数字が1の場合 if (Number == 1) { printf("数字は1です"); } //条件② 数字が2の場合 if (Number == 2) { printf("数字は2です"); } //条件③ 数字が設定した変数と同じだった場合 if (Number == value) { printf("数字は%dです",value); } //条件④ 数字が1以上の場合 if (Number >= 1) { printf("数字は1以上です"); } return 0; }
このコードの場合は変数「Number」の値は「1」と設定しています。
上記のコードで「Number」が「1」だった場合は条件①④の中身が実行され、条件②③は実行されないようになっています。
「Number」の値を「2」に変えた場合は条件②④が実行され、「Number」が「3」の場合は③④が実行されるようになっています。
条件③のような変数同士で比較することもできます。
else if と else
また「if文」にはもうセットでついてくる「else if」と「else」というコードがあります。
「else if」の使い方の基本は「if」と全く同じですが手前に「if」の内容が終わった直後に書かなければ使用できません。
そして「else if」を使った場合は直前の「if」の条件に当てはまっている場合は例えコードに書いた条件式があっている場合でも「else if」内のコードは実行されません。
「else」を使う際は「if」の条件に当たる「()」を書く必要がなく「else」の後に直接「{ }」を書き中にコードを書きます。
「else」も「if」の内容が終わった直後に書く必要があり、直前の「if」の条件に当てはまらない場合のみ実行されるようになっています。
以下に「if文」用の例とほとんど同じ例を書きます。
int main () { int Number = 1; int value = 3; //条件① 数字が1の場合 if (Number == 1) { printf("数字は1です"); } //条件② 数字が2の場合 else if (Number == 2) { printf("数字は2です"); } //条件③ 数字が設定した変数と同じだった場合 else if (Number == value) { printf("数字は%dです",value); } //条件④ 数字が1以上の場合 else if (Number >= 1) { printf("数字は1以上です"); } //条件に当てはまらない場合 else { printf("条件に当てはまらない数字です"); } return 0; }
条件の内容は全く書き替えてはいませんが、「if」だけの場合と「else if」の場合で実行される結果は変わってきます。
今回も変数「Number」の値が「1」の場合は条件①はあっているのでその中のコマンドは実行されますが、条件④は書いている条件に当てはまる内容ではありますが、最初の「if 」から連なった 「else if」 がある箇所に書かれている為、条件④はあっていてもその内容を実行しない結果になります。
同様に「Number」が「2」の場合は条件②のみ、「Number」が「3」の場合は条件③のみ実行されます。
条件④が実行されるのはこの条件①②③にあてはまらないが条件④に当てはまる内容でなくては中のコードが実行されないため、「Number」が「4」以上の場合に実行されるようになります。
また最後の「else」は条件①②③④のどれにも当てはまらない場合のみ実行されるため、「Number」が0から負の値の時に実行されるようになります。
今回はここまで
ようやくゲームらしい動きができ、ここまででコマンドプロンプト上で動作するスロットゲームとしてプレイできる基礎の状態にはなりました。
現在2回スロットをするとその時点で終了してしまうので繰り返してスロットをプレイできるようにしたいと思います。
前回までの記事は以下から確認できます。