C++でスロットを作ってみよう
-関数を作成してコードの整理をしてみる-
プログラムを勉強したことが無い人でもとても簡単にゲームを作る基礎をC++を使用して実際に作りながら
プログラミングをしたことがない人に向けて教える感覚で説明していきます。
前回でwhile文を使用した繰り返し処理を作ったので、簡素ではありますがコマンドプロンプト上で動作するゲームで最低限はできていますが、c++を使用する上で使用するコードはまだまだ沢山あるので、紹介しながらゲームを改良させていきたいと思っています。
この回では「配列」と「for文」を紹介させて頂きます。
配列 <型><変数名[配列の数]> = { 値, 値, ・・・}
配列は同じ要素を持っていてそれぞれ違う値が入る場合に使用されます。
例えば今まで作っているスロットゲームの場合に止めるスロットの数が今までは1個でしたが、複数スロットの数字を格納する為の数字を表示させるために使用します。
#include <stdio.h> int main() { //配列を表示させる数字 int nunmber[3] = {0, 1, 2}; //配列に数字を代入 int number[2] = 3; //配列の数字を表示 printf("配列1つめの数字は「%d」\n", number[0]); printf("配列2つめの数字は「%d」\n", number[1]); printf("配列3つめの数字は「%d」\n", number[2]); return 0; }
配列を使用する場合は今までの変数の宣言とほとんど同様ですが、変数の名前のすぐ右に[3]のように括弧と数字を書きます。
また変数の初期化で数字を宣言した際に設定する場合は{ }で囲ってコンマでそれぞれの値を区切って書きます。また配列で準備した数と同じだけ値を書く必要があります。
上記の例のコードでは変数「number」が同じ名前で3種類が作られていて、変数の初期化でnumberの1つめは0、2つめは1、3つめは2と設定していて初期化する際は3つの値のすべてを書き込まなければなりません。
また配列を使用する注意点として、上のように配列を3つ作った場合に配列は[0][1][2]のように配列の一番最初は「0」から始まるため、配列の[2]が最後の値となっており、[3]は作られていません。
for文 for ( for文中の変数; 条件 ; 最後に行う処理) {内容}
また配列の数が今回は3つなので値を3つ書き込むだけで良いのですが、配列の数が100以上になる場合もあるため初期化するより代入して使われる場合の方が多いです。
配列を代入する際にかなり有用な「for文」と呼ばれるものがあり、これは「while文」と似ていて繰り替えし処理をする為のコードで条件に応じてその下に書いているコードを実行するかどうかを判定します。
#include <stdio.h> int main() { //配列で用意する数 int const maxNum = 100; //配列(100個ある) int Number[maxNum]; //for文 for (int i = 0; i < maxNum; i++){ //配列のi番目に数字iを代入する。 Number[i] = i; //配列の数字を表示 printf("配列%dつめの数字は%dです。\n", i, Number[i]); } return 0; }
使用する際は上記のコードのように使用されます。例のコードのようにfor文の()内にセミコロンが2つあり、全部で3つのセクションに分けられます。
まず一番左側の部分の『int i = 0』の箇所は「{}」内の繰り返し処理を行なう前に行われる処理をここに書き、主にfor文中に使う変数を宣言する際に使用され、この部分で宣言された変数はfor文が繰り返される限り使用できる変数になります。
次に真ん中の『i < maxNum』の部分はfor文の繰り返しが行う条件を書き、この部分の値が正しい場合に「{}」の内容が実行されます。
最後に右側の『i++』の部分はこのfor文の「{}」の内容の最後の行の処理が終わった後に行われる処理が書かれます。
この「変数名++」で「変数 = 変数 + 1 」と同じ意味であり、for文ではよく使われます。
また上と類似の演算子で「変数名–」というものもありこれも「変数 = 変数 – 1」と同じもの意味です。
上の説明を踏まえて例のコードの動きを説明します。
例の場合はfor文が開始されるときに変数「i」が「0」の状態で作られます。この変数は「{}」の内容が実行されている限り存在する変数になります。
そして条件の部分で変数「i」が「0」なので「0」は「100」より小さいという条件に当てはまるので「{}」の内容が実行されます。
内容の最後の処理まで到達した際に変数「i」の値が1加算され、この後再度条件の「i」が「100」より小さいか判定をして、「i」が「100」より小さい場合は再度「{}」の内容が最初から順に実行されます。
これが繰り返され「{}」の中身が「i」の変数が「99」まで「{}」が繰り返され「i」が「100」になると条件外になり、「{}」の外の処理へ移動します。
この方法で配列100個分にそれぞれ値を順に「1」、「2」、「3」と順に値が入れられ、すべての配列に値を入れることができます。
スロットゲームにfor文と配列を含める
上の例のコードを応用してスロットゲームのスロットを3つに増やして、それぞれの数字が全部一致していた場合に所持金が加算されるシステムを作ります。
スロットを止めたりその表示用に使っていた「int stopSlotAndGetMoney(int bet)」と「void showSlotUI(int bet, int slotNum)」の内容を書き換えていきます。
その前に前回までで「int stopSlotAndGetMoney(int bet)」内に賭け金から所持金の変動する金額を設定するコードを書いていたので新たに別の場所に関数を準備します。
//賭け金の変動額を判定する int checkSlotAndCalcMoney(int bet, int num[3]) { //スロットの1番目と2番目が一致かつ1番目と2番目一致の場合 if (num[0] == num[1] && num[1] == num[2]) { //加算される金額がスロットで出た数字の十倍 bet = 10 * bet * (num[0] + 1); printf("当たりー!\n"); printf("%dコイン増えました\n", bet); } else { //はずれの場合は賭け金の分減少させる printf("残念!\n"); printf("%dコイン減りました\n", bet); bet = -bet; } return bet; }
上記でスロットの数字3つとかけ金を引数として設定しています。
またif文内の条件ですが「num[0] == num[1] == num[2]」のような使い方はできず左辺と右辺の二つに分ける必要があり、「&&」でこの演算子より左側と右側が両方「true」の場合に「true」と判定するようになっています。
今回で数字は1から3までしか出ないように設定していますが、それでも新しくした条件の場合は完全にランダムの場合に「1/9」となっているのでもらえる金額が今までの場合だと少なく感じるので出た数字の10倍になるようにしています。
「num[0] + 1」としているのはランダムの数字の「%」の演算子を使用しているので出た数字が「0」の場合があり、この場合にもらえる金額が「0」の倍数だと「0」になってしまうので必ず加算されるようにする為にnかいています。
次にスロットの見た目を表示させている部分「void showSlotUI(int bet, int slotNum)」を書き換えていきます。
//スロットのUIを表示する void showSlotUI(int bet, int slotNum[3]) { system("cls"); printf("\n"); printf("・掛け金:%dコイン\n", bet); printf("■===■===■===■\n"); printf("■ %d ■ %d ■ %d ■\n", slotNum[0] + 1, slotNum[1] + 1, slotNum[2] + 1); printf("■===■===■===■\n"); printf("\n"); }
この関数も引き数を配列が含まれるものに変えていて、if文が見にくく感じたので「?」の代わりに「0」が表示されている時がまだ確定していない時を表すようにした為、if文は消してしまいました。
まだ確定していないときにスロットの数字は「-1」が入っているので各配列の数字に1を足したものを表示させるようにしています。
最後にint stopSlotAndGetMoney(int bet) の関数を変えていきます。
//スロットを止めて報酬金額を確定させる int stopSlotAndGetMoney(int bet) { //表示させるスロットの数 int const slotNum = 3; //スロット最大の数字 int maxNumber = 3; //スロットの数字用の変数 int slotContent[slotNum]; //配列に値を代入する for (int i = 0; i < slotNum; i++) { slotContent[i] = -1; } //入力用の変数 int input = 0; //スロット3回止める for (int i = 0; i < slotNum; i++) { //スロットを表示する showSlotUI(bet, slotContent); printf("数字を入力してストップ\n"); //入力のうけつけ scanf_s("%d", &input); //ランダムな数字を生成 slotContent[i] = rand() % maxNumber; } //スロットを再度表示 showSlotUI(bet, slotContent); //賭け金を計算させる bet = checkSlotAndCalcMoney(bet, slotContent); return bet; }
前回まで使用していたスロットの数字を入れる変数を別の配列のものに切り替えて
その前にスロットの数を3つとスロットの最大の数字が3になるように変数の値を設定しています。
そしてスロットを止める入力をする箇所をfor文で囲っているのでスロットの数だけ入力とランダムな数字をスロットに表示させる処理を設定しています。
そして最後の所持金に対して増減させる金額は用意した別の関数に設定しています。
ここまでコードを書き込めたら実行してみてください。
スロットが3つに増えてスロットの数字が揃った場合のみ所持金が加算されるようになりました。
私の感想ですが前回と比較してスロットが思った以上に当たらないのでゲームとしてはプレイした満足感が減ったように感じてしまいました。
スロットを完全に運ではなく目で見て実力で止められるように作るコードもいつか紹介してみたいです。
今回はここまで
ここまで作ってかなり簡単にC++を全く知らない人に対して使える機能を紹介しつつ簡単なゲームを作るというのを考え動き始めた時の当初の目標のゲームまでは作成できました。
かなり単純なゲームではありましたが、ここまで実際に作ってプログラムを勉強してみたいという人が増えれば私自身かなり喜ばしく思います。
しかしまだまだ紹介しきれていない機能はまだまだあるので次回からはそれらを使用したコードに書き換える使ってみたいと思います。
前回までの記事は以下から確認できます。