今でもたまにやる。1980年代のナムコのゲーム、人によって「いまでも遊んだときに面白い思う」ゲームが違いそうなところが興味深い。大学のときにパックランドが好きな先輩とかドラゴンバスターが得意な人とかそれぞれ居た。自分はドルアーガとリブルラブルと源平のような気がするが、リブルラブルとギャプラスはボーナスステージがもっと短かかったらいいなと今は思うものの、ボーナスステージがなかったらあまり上手くないときに遊ばなかったのではないかという気もするので難しい。
ところで10年くらい前から6階と22階は同じマップなのではと思っていたのだけど調べてみると右の5〜6ブロックだけが違っていた。
6階
22階
ドルアーガの迷路は各階ごとに乱数のシードがあるだけであとは自動生成ということだったので、左半分が同じなら全部一緒になりそうな気がしていた。しかしこの事象だけでドルアーガのマップは右側から左に向かって生成されていることがわかるのだ。生成途中でなぜか乱数が同じ動きをするように収束してしまったのだ。
調べたところドルアーガの塔の迷路は、右上の柱からどこかの方向に壁を伸ばしていく、その方向を乱数で決める、というようなアルゴリズムで実装されているっぽかった。そして60階ではその乱数列が全ての柱で左方向になるような(それはもはや乱数ではないが)seed値が設定されているということだった。
この迷路生成につかわれる疑似乱数は https://hayasememo.tumblr.com/post/55601992754/%E3%83%89%E3%83%AB%E3%82%A2%E3%83%BC%E3%82%AC%E3%81%AE%E5%A1%94-%E3%83%95%E3%83%AD%E3%82%A2%E7%94%9F%E6%88%90%E3%82%92%E5%8F%AF%E8%A6%96%E5%8C%96 あたりで解説されているのだがこれを実装してもなんだかうまくいかなかった。
下記のページにDで記述されたコードがあった。
https://qiita.com/devmynote/items/ea9d9cd323439363a670
これの乱数部分だけCで実装してためしたところ、
6階の乱数(seed=5)は
3321212012001333200012001213201213213213333332133321321213332012120132013212121320001320120121333321213212013321320013320000000133332001...
22階の乱数(seed=21)は、
2120000012133212120120013332000120012132012132132133333321333213212133320121201320132121213200013201201213333212132120133213200133200000...
となった。22階の乱数列から冒頭の"21200000121"を省いたものは6階の乱数列と同じになった。数字を1つ生成するごとに変わっていくseedを確認したところ212000000121が終わったところでseed=5になっていた。そりゃその後は同じになるよね。
でももしドルアーガの壁生成アルゴリズムが、「ある柱に対して、一つの乱数を生成したら必ず壁を1個作る」みたいなものになっていたら、同じ乱数列がでも位置がズレていると同じ迷路パターンになったりしないはず。ドルアーガの壁生成アルゴリスムでは、「乱数によって決まった壁を伸ばす方向に既に壁があった場合、再度同じ場所で乱数を引きなおして、壁が作れるかどうかを確認することになっており、なので、6階でも22階でも乱数を何度も無駄打ちした結果、たまたま同じ柱の位置で同じパターンで始まるような感じになり、しかもそのあと生成される迷路の壁生成にそれまで生成されてきた壁のパターンが影響を及ぼさないような感じになったということになる。これはなかなかのレアな確率なのかもしれないと思った。