作成日:2024年12月30日
FileMakerでスロットマシンを作ろう


どうも、にゃん太です
FileMakerはレイアウトを動的に動かす事は得意ではありませんが、オブジェクトフィールドを使ってそれっぽく見せる事はできます
今回のメモでは、試しにスロットマシンを作ってみましょう
どんなスロットマシンを作るのか
スロットマシンと言っても、色々な形態がある様です
多分標準的な形態である3×3マスが見えているものを作ってみる事にします
イメージ的にはこんな感じですね

3つのリールがあり、ボタンを押すなりの処理でそれを回転させます。そして、3列それぞれの停止ボタンを押したら停止し、止まった時に絵柄が揃っていれば当たりとなります
絵柄が揃っている方向は、横3列と斜め2列としましょう
リール上の絵柄の数は、21が標準な様なのでそれに合わせて作成します
必要な処理
基本的な動作をさせるだけなら、あまり複雑な処理はありません
- リールを回転させる
- リールを停止させる
- 当たっているかの判定をする
これだけの処理があれば最低限の動作はさせられますので、これを順番に作っていきましょう
リールを回転させる
さて、リールをどうやって回転させるかを考えていきます
3マス表示しているので、3つのオブジェクトフィールドを用意します
また、21個の絵柄がリール上にあるので、それを順番に表示させる必要があります
以上の事から、Noを1~21まで順番に進め、No1の時は絵柄1、2、3を表示させる、No2の時は絵柄2、3、4を表示させる……、という様に切り替えれば良さそうに思えます
とりあえず作成してみましょう
まずは簡単にテーブルを構築します
絵柄用テーブル

リール用テーブル

リレーション

計算式は以下の様に記述しています
image1
Let ( [ #no = Mod ( no - 1; 21 ) + 1 ]; Case ( #no = 1; 5; #no = 2; 4; #no = 3; 3; #no = 4; 1; #no = 5; 3; #no = 6; 5; #no = 7; 4; #no = 8; 1; #no = 9; 6; #no = 10; 4; #no = 11; 5; #no = 12; 3; #no = 13; 2; #no = 14; 4; #no = 15; 5; #no = 16; 3; #no = 17; 5; #no = 18; 4; #no = 19; 2; #no = 20; 6; #no = 21; 1; "" ) )
絵柄は6種類用意して、次の様に番号割り振っていきます

先ほどの計算式と合わせるとリール全体は下図の様になります

次に、リール回転を行うスクリプトを作ってみます
停止処理を考慮する必要がありますので、回転処理にはOnTimerスクリプトを使用します
回転テスト
# ################################################## # スロット回転のテスト # ################################################## OnTimerスクリプトをインストール[「回転テスト|実行」; 間隔: .1]
回転テスト|実行
# ################################################## # 回転テスト|OnTimerで実行 # ################################################## 変数を設定 [$$i; 値: $$i + 1] If [$$i > 50] 変数を設定 [$$i; 値: ""] OnTimerスクリプトをインストール [] Else フィールド設定 [slot::no; Mod ( $$i; 21 ) + 1] End If
これを動かしてみた結果はこんな感じです

それなりに動いている感じに出来たのではないでしょうか
とはいえ、回転しているイメージがちょっと弱い気がします
という事で、オブジェクトの移動コマ数を増やして回転イメージを補強してみます

こんな感じに間にオブジェクトフィールドを追加します
1コマ進んだ時にオブジェクトフィールドは空欄になりますので、計算式も変更します
image2_1
Let ( [ #no = Mod ( no2 - 1; 42 ) + 1 ]; Case ( #no = 1; 5; #no = 3; 4; #no = 5; 3; #no = 7; 1; #no = 9; 3; #no = 11; 5; #no = 13; 4; #no = 15; 1; #no = 17; 6; #no = 19; 4; #no = 21; 5; #no = 23; 3; #no = 25; 2; #no = 27; 4; #no = 29; 5; #no = 31; 3; #no = 33; 5; #no = 35; 4; #no = 37; 2; #no = 39; 6; #no = 41; 1; "" ) )
改めて動かしてみたのが次のとおりです

先ほどより、上から下に動いている感じになっています
これでリール1本の動きは完成ですね!
リールを3本動かす
リール1本分の動きは出来たので、次はリール3本を動かしてみます
OnTimerスクリプトが3つ同時に動かせれば先ほどの処理を3つ動かせばよいのですが、残念ながらOnTimerスクリプトは1つしか実行できません
また、リール3本はそれぞれで停止させるので、元となるNoは別に設定する必要があります
以上を考慮して、改めてテーブル定義をします


次にリール3本を動かす処理を書いていきますが、1スクリプトで実行する必要がありますので、停止処理も一緒に行う事になります
ですので、停止処理やあたり判定も一緒に考えていきます
リール3本を動かすにあたり、3本それぞれに回転位置番号を加算していきますが、停止の指示がされたリールはその加算を停止する必要があります
同一のOnTimerスクリプトで動かしているので、グローバル変数で停止指示を判定させる事にしましょう
停止位置が回転イメージ用に作った中間フィールドで終わらない様にだけ注意が必要です
後は、停止指示をしなくても適当な所で停止させる様にしておきましょう
あたり判定は、5ラインの番号が一致するかを判断させればよいでしょう
以上の事から作成したスクリプトが次の通りです
START
# ################################################## # スロット回転開始 # ################################################## OnTimerスクリプトをインストール[「回転」; 間隔: .05]
STOP
# ################################################## # スロット停止 # ################################################## # 停止する列を引数で取得 変数を設定 [$target; 値: Get ( スクリプト引数 )] If [Exact ( $target; "left" )] 変数を設定 [$$left; 値: Int ( Random * 4 ) + 1] 変数を設定 [$$left; 値: $$left + If ( Mod ( slot::leftNo + $$left; 2 ) = 0; 0; 1 )] Else If [Exact ( $target; "middle" )] 変数を設定 [$$middle; 値: Int ( Random * 4 ) + 1] 変数を設定 [$$middle; 値: $$middle + If ( Mod ( slot::middleNo + $$middle; 2 ) = 0; 0; 1 )] Else If [Exact ( $target; "right" )] 変数を設定 [$$right; 値: Int ( Random * 4 ) + 1] 変数を設定 [$$right; 値: $$right + If ( Mod ( slot::rightNo + $$right; 2 ) = 0; 0; 1 )] End If
回転
# ################################################## # 回転処理 # ################################################## 変数を設定 [$$i; 値: $$i + 1] If [$$i > 9] If [$$left > 0] 変数を設定 [$$left; 値: $$left - 1] フィールド設定 [slot::leftNo; If ( slot::leftNo = 42; 1; slot::leftNo + 1 )] If [$$left = 0] ウインドウ内容の再表示 [] End If End If If [$$middle > 0] 変数を設定 [$$middle; 値: $$middle - 1] フィールド設定 [slot::middleNo; If ( slot::middleNo = 42; 1; slot::middleNo + 1 )] If [$$middle = 0] ウインドウ内容の再表示 [] End If End If If [$$right > 0] 変数を設定 [$$right; 値: $$right - 1] フィールド設定 [slot::rightNo; If ( slot::rightNo = 42; 1; slot::rightNo + 1 )] If [$$right = 0] ウインドウ内容の再表示 [] End If End If # 全リールが停止したら終了 If [$$left + $$middle + $$right = 0] 変数を設定 [$$i; 値: ""] OnTimerスクリプトをインストール [] スクリプトを実行 [指定:一覧から; 「あたり判定」; 引数: ] End If Else If [$$i = 9] フィールド設定 [slot::leftNo; If ( slot::leftNo = 42; 1; slot::leftNo + 1 )] フィールド設定 [slot::middleNo; If ( slot::middleNo = 42; 1; slot::middleNo + 1 )] フィールド設定 [slot::rightNo; If ( slot::rightNo = 42; 1; slot::rightNo + 1 )] # STOPを押さない場合の停止位置を設定 変数を設定 [$$left; 値: 201 + Int ( Random * 5 ) * 2] 変数を設定 [$$middle; 値: 251 + Int ( Random * 7 ) * 2 + 1] 変数を設定 [$$right; 値: 301 + Int ( Random * 10 ) * 2] ウインドウ内容の再表示 [] Else If [$$i < 9] # 各リールを若干ずらして回転開始 # 左は最初から回転 フィールド設定 [slot::leftNo; If ( slot::leftNo = 42; 1; slot::leftNo + 1 )] # 中央は0.25秒後から回転 If [$$i > 5] フィールド設定 [slot::middleNo; If ( slot::middleNo = 42; 1; slot::middleNo + 1 )] End If # 右は0.4秒後から回転 If [$$i > 8] フィールド設定 [slot::rightNo; If ( slot::rightNo = 42; 1; slot::rightNo + 1 )] End If End If
あたり判定
# ################################################## # あたり判定 # ################################################## If [slot::left2 = slot::middle2 and slot::left2 = slot::right2] 変数を設定 [$$あたり; 値: 3] 変数を設定 [$$mark; 値: slot::left2] Else If [slot::left4 = slot::middle4 and slot::left4 = slot::right4] 変数を設定 [$$あたり; 値: 1] 変数を設定 [$$mark; 値: slot::left4] Else If [slot::left6 = slot::middle6 and slot::left6 = slot::right6] 変数を設定 [$$あたり; 値: 2] 変数を設定 [$$mark; 値: slot::left6] Else If [slot::left2 = slot::middle4 and slot::left2 = slot::right6] 変数を設定 [$$あたり; 値: 5] 変数を設定 [$$mark; 値: slot::left2] Else If [slot::left6 = slot::middle4 and slot::left6 = slot::right2] 変数を設定 [$$あたり; 値: 4] 変数を設定 [$$mark; 値: slot::left6] End If ウインドウ内容の再表示 []
これで回転から停止までの処理が出来上がりました
実際に動かしてみた所を動画で見てみましょう
かなりスロットマシンっぽく仕上がったのではないでしょうか
これで必要な機能は完成です
サンプルファイル
これで必要最低限が完成しました
とはいえ、これでは回して止めるだけでゲームになっていませんので、もう少しゲームらしく体裁を整えてみました
ご興味がありましたら是非こちらからダウンロードしてご確認ください

以上で今日のメモ書きは終了です
内容はいかがでしたか?
もしご意見やご要望、誤りの指摘などありましたら、下記フォームよりお気軽にご連絡ください