スクリプト:
DataManager
Scene_Puzzle15
Window_Puzzle15
Tile_Tip
導入方法 :
上のスクリプトを全て入れる。
DataManagerのself.initのload_databaseの下の辺りに
load_normal_data_takopuzzle15を挿入します。
例
使い方:
ここでアップしているDataManagerの
$MINIGAMERESULT_puzzle15で指定されたIDの変数にゲームの結果が代入されます。
残りカウントが0以上の場合は1,負の数の場合は2が入ります。
使う画像素材はサイズが300*300のものを/Graphics/Picturesに入れてください。
$data_puzzle15Pic_filenameで画像素材のファイル名を指定してください。
$data_puzzle15_widthで横方向のタイルの個数、
$data_puzzle15_heightで縦方向のタイルの個数を指定します。
イベントにおいてSceneManager.call(Scene_Puzzle15)で呼び出せます。
例
細かく分割しすぎるとゲームの動作が重くなるので注意してください。
(縦横1桁程度までにしておいてください)
テストゲーム:
Puzzle15.zip (1.45 MB)
ゲーム画像:
$data_puzzle15_width = 5 , $data_puzzle15_height = 5 の場合
$data_puzzle15_width = 2 , $data_puzzle15_height = 6 の場合
ゲームクリア
余談:
上の15パズルにおけるちょっとした数学的知識。
実は15パズルはどんな配置をしても必ず解けるわけではない。
偶置換と呼ばれる変換で置き換えた配置でないと解けない。
これについてちょっと説明。
一般的に配列の並び替えを置換という。
さらに2つの要素のみを交換するような置換を互換という。
それで全ての置換は互換の積(互換の合成のこと)であらわすことができるという定理がある。
(証明は帰納法を使えば難しくはない)
ただ互換の積としての表し方は1通りではなくて色々なパターンがあるんだけど
互換の個数が偶数個か奇数個であるかというのは置換によって決まるという定理がある。
(この証明は若干テクニカル、もしかしたら簡単な証明もあるかもしれないが…)
つまり偶数個の互換の積であるような置換を選べば、ほかのどんな互換の積の表現を考えても互換の個数は偶数個となる。
これによって置換は表現できる互換の個数が奇数か偶数かによって奇置換、偶置換に分けられる。
定義から分かるように偶置換と偶置換の積(合成)は偶置換となり
偶置換と奇置換の積は奇置換、奇置換と奇置換の積は偶置換となる。
これを考慮に入れて15パズルを考えると、
15パズルの並び替えというのは右下の空セルが
隣のセルと入れ替え(つまり互換)を空セルが元の位置まで戻ってくるまで繰り返す変換である。
そして空セルが元の位置まで戻ってくるということは上方向へ進んだ回数と下方向へ進んだ回数が等しくて、右方向へ進んだ回数と左方向へ進んだ回数が等しいということである。
つまり合計で上方向へ進んだ回数の2倍 + 右方向へ進んだ回数の2倍となるので偶数回である。
つまり互換を偶数回行っているのでこれは偶置換である。
つまり初期配置が奇置換による配置であるとどうセルを動かしても奇置換の配置にしかならない。
identity(つまり全く動かさないような並び替え、恒等変換)の場合は互換の個数が0なので偶置換であることを考慮に入れると、奇置換による配置だとidentityの配置にできないことになる。
(identityが偶置換であるのは同じ互換の積はidentityということを使って偶置換と証明することもできる)
さて少なくとも初期配置が偶置換による配置でないと解くことができないことがわかったが、
偶置換による配置ならかならず解くことができるのであろうか?
これに関しては縦のセルの個数と横のセルの個数による数学的帰納法を使えばそんなに難しくはない。
任意の置換による初期配置は最終的に2 * 3のセルの15パズルに還元されて、さらにそれは2通りの場合に帰着される。
そしてそのうち片方は奇置換であるので初期配置が偶置換である場合は1通り、すなわちidentityの場合のみとなり、偶置換による配置の場合はかならず解けるということになる。
1. 無題
使わせていただきます。