こんにちは。ティーマネジメントの田中です。
こちらは後半記事 2/2となります。
前半記事で15パズルについての説明を行いました。
後半記事では、15パズルをどのようにFileMaker データベースで実現したかの考え方について、解説できればと思っています。
ご興味のある方はぜひご覧ください。
ゲームが遊べたらいい、という方は、前半記事の方にFileMakerファイルと、45日間の無料評価版FileMakerがダウンロードできる、Claris公式リンクをつけておりますので、前半記事をご覧ください。
前回の記事で、15パズルのパネルをスライドさせる考え方について解説しました。
今回は、パネルの配置について考えていきたいと思います。
初期配置を考える・解けない配置について
ここからは、ゲームの開始前に配置する数字を考えます。
1から15までの数字をランダムに配置すればいいのですが、
適当に配置しただけでは、決して解けない配置になってしまう可能性があります。
決して解くことができない例を一つ、下に提示します。
14と15が逆であればパズルは完成するのですが、
この状態からでは、どのように動かしても完成させることはできません。
なぜ完成できないのか、詳しく解説しようとすると非常に複雑になってしまい、解説する自信がありませんので、Chat GPTに解説してもらいたいと思います。
15パズルの逆順数を求めるには、タイルの順番を1次元配列として扱い、その中で各タイルの右側に自分より小さいタイルがいくつあるかを数えます。この逆順数が偶数であればパズルは解け、奇数であれば解けないと判断します。 逆順数を求める手順は以下の通りです。 パズルのタイルを1次元配列に変換します。空きスペースは無視します。 各タイルについて、自分より後ろにあるタイルと比較し、自分より小さいタイルの数をカウントします。 すべてのタイルについて上記の操作を行い、合計を逆順数とします。 具体的な例とともに説明します。 例 パズルの初期配置を次のように仮定します: この配置を1次元配列に変換すると、次のようになります(空きスペース0は無視): [1, 8, 2, 4, 5, 14, 3, 9, 10, 6, 13, 15, 11, 12, 7] この配列で逆順数を求める手順を見ていきましょう。
手順 タイル1について、自分より後ろに1より小さいタイルはありません。逆順数は0。 タイル8について、自分より後ろに8より小さいタイルは、2, 4, 5, 3, 6, 7 の6個。逆順数は6。 タイル2について、自分より後ろに2より小さいタイルはありません。逆順数は0。 タイル4について、自分より後ろに4より小さいタイルは3。逆順数は1。 タイル5について、自分より後ろに5より小さいタイルはありません。逆順数は0。 タイル14について、自分より後ろに14より小さいタイルは3, 9, 10, 6, 13, 11, 12, 7 の8個。逆順数は8。 タイル3について、自分より後ろに3より小さいタイルはありません。逆順数は0。 タイル9について、自分より後ろに9より小さいタイルは6, 7 の2個。逆順数は2。 タイル10について、自分より後ろに10より小さいタイルは6, 7 の2個。逆順数は2。 タイル6について、自分より後ろに6より小さいタイルはありません。逆順数は0。 タイル13について、自分より後ろに13より小さいタイルは11, 12, 7 の3個。逆順数は3。 タイル15について、自分より後ろに15より小さいタイルは11, 12, 7 の3個。逆順数は3。 タイル11について、自分より後ろに11より小さいタイルはありません。逆順数は0。 タイル12について、自分より後ろに12より小さいタイルは7 の1個。逆順数は1。 タイル7について、自分より後ろに7より小さいタイルはありません。逆順数は0。 すべての逆順数を合計すると: 0 + 6 + 0 + 1 + 0 + 8 + 0 + 2 + 2 + 0 + 3 + 3 + 0 + 1 + 0 = 26 この合計値(逆順数)が偶数なので、このパズルは解ける配置であると判断できます。 |
逆数順、が偶数であればちゃんと解けて、奇数であれば解けない問題になる、ということが解説から分かりました。
1~15の数字をランダムに配置し、上の計算に当てはめてみて、解ける問題かどうか判断する、という方法で実現できそうです。
が、私はこのような高度な考え方は思いつきませんでした。
絶対に完成できない配置がある、ということは、15パズル作成前に事前に調査していたので知っていたのですが…
そこで私は制作の際に、もう一方の別のやり方を使いました。
それが何か、というと
「完成した状態のパネルを一度作成し、規定回数ランダムにパネルを動かす」
ことで、初期配置を作成することにしました。
さいわい、前回の記事で解説した、「1~16の引数を与えて、スライド可能なパネルであればスライドする」
というスクリプトを作成していたので、
ゲーム開始の際に、そちらのスクリプトを規定回数、成功するまで実行するようにしました。
フローにすると次のようになります。
実際に作成したスクリプトはこちらです。
1~16までの値をランダムに与えて、$difficulty(規定回数)ぶん成功するまで、パネル移動を行うスクリプトです。
数字をランダムに与えていて、いつかは成功して終わるのですが、念のため長時間ループすることを防ぐためにループの最大回数を決めています。
おわりに
ここまでご覧頂きありがとうございます。
15パズルゲームとは何か、スライドのさせ方、パネルの配置について、という内容でお伝えしてきました。
FileMakerは業務で便利だけど、こんなこともできるんだよ、ということをお伝えしたくて、今回の記事を書かせて頂きました。
この記事が少しでも皆さんの心に響くことがあれば嬉しく思います。
前半記事で配布しているFileMakerファイルは、完全アクセス権をつけていますので、
データベースの中身を見ることができるようになっています。
ご興味のある方は確認頂けますと幸いです。