記事に「#ネタバレ」タグがついています
記事の中で映画、ゲーム、漫画などのネタバレが含まれているかもしれません。気になるかたは注意してお読みください。
見出し画像

「世界一退屈かもしれないRPG」雑談録

どうも、108Hassiumです。

2025/08/29に「世界一退屈かもしれないRPG」というフリーゲームを公開しました。

※☟DL版

※☟ブラウザ版

https://plicy.net/GamePlay/212301

本作には本作がどれほどのクソゲーなのか理解するのを補助する等のための「雑談」という機能があるのですが、私の技術力不足によりバックログ機能を実装できませんでした。

なのでこの記事では雑談内容の全文と画像を載せ、自由に読み返せるようにしたいと思います。

 未プレイの方は、この記事さえ読めばゲームをプレイする意味はほぼなくなります。


1戦目

t=10

やあ。

このゲーム、楽しんでる?

2戦目

t=10

そろそろ君も、このゲームの本質が
見えてきた頃かな。

スライムは、攻撃すると増えたり減ったりする。
増減の仕方の法則はわかったかな?

ちなみに画面左上の数字は、ターン数だよ。
スライムの挙動と関係あるから観察してみてね。

t=20

攻撃されたスライムは、体力が1減る。
攻撃後の体力が0なら消滅する。
スライムが0体になったら戦闘終了。

体力が1以上なら、t+1体に分裂する。
スライムの行動が終わったらターン数が1増える。

これがこのゲームにおける
スライムの行動ルールだよ。

t=30

ところで、このゲームのスライムには
こんな性質があるよ。

例えばこんな風に、スライムの体力が
左から降順に並んでいるとする。

次のターンでは、スライムの並びはこうなる。

その次は、こう。

降順の並びが維持されているのに気づいたかな?

実はスライムの並びが降順になったら、
その後は戦闘終了までずっと降順のままなんだ。

この法則のことを、「降順の法則」って
呼ぶことにするよ。

t=40

え?僕は誰かって?

僕はただのゲームキャラクターだよ。
それ以上でもそれ以下でもないよ。

おっと、この言い方は正しくないね。

僕はただのゲームキャラクター、
それ以上かつそれ以下だよ。

t=50

さて、せっかくだからこの戦闘がいつ終わるか
考えてみようか。

まずは簡単な例から考えていこう。
この画像の戦闘が終わるのは何ターン目?

スライムに攻撃して、体力が0だから消滅して、
個体数が0だからそのまま戦闘終了。
答えは5ターン目だね。

じゃあ、これは?

スライム2体を倒すのに2ターン使って、
6ターン目に倒し終わるから正解は6ターンだね。

同じように考えると、tターン目に
体力1のスライムだけがn体いる場合、
戦闘が終わるのはt+n-1ターン目になることが
わかるね。

t=60

じゃあ、これは?

まず体力が2のスライムに攻撃するから、
攻撃後の体力は1になる。

体力が残っているからスライムは分裂して、
ターン数は2だから3体になる。
そしてターン数が1増えて、3ターン目に
体力1のスライムが3体いる状態になる。

ということは、スライムは5ターン目に
全滅することがわかるね。

t=70

もっといろんな例を考えてみたいところだけど、
画像を使って説明するのは面倒だから
代わりの手段を用意するよ。

「降順の法則」って覚えてる?

スライムの並び順が、例えばこんな風に
右下がりになるっていう法則があったよね。

これを利用して、スライムの列を
数字で表現するよ。

こんな風に。

体力が1のスライムは3体だから、
配列の右から1番目に「3」を書く。
体力が2のスライムは4体だから、
配列の右から2番目に「4」を書く。

体力が3のスライムは0体だから、
配列の右から3番目に「0」を書く。
体力が4のスライムは1体だから、
配列の右から4番目に「1」を書く。

そしてターン数をここに書けば、
戦況をとってもコンパクトに表現できるね。

次からは、この表記のことを
「スライム配列」と呼ぶことにするよ。

t=80

そういえば、世の中にはゲームをプレイするときに
台詞とかの文字を全部読み上げる人が
いるらしいね。

さっきのスライム配列に関しては、
正しい読み方は決まってないから
各自で適当に読み方を決めてね。

ちなみに作者は、例えば(1,0,4,3)[7]を
「いちぜろよんさんのなな」みたいに
読んでるらしいよ。

t=90

数式の読み方といえば、
「2^(3^4)」って君ならどう読む?

あ、"^"っていうのは冪乗の記号だよ。
3^4は「3の4乗」、つまり3×3×3×3のことだよ。

計算の優先度は掛け算より上で、
例えば4×3^2=4×3×3だよ。

話を戻すよ。「2^(3^4)」って何て読む?

2^xは、普通「2のx乗」って読むよね。
そして2^(3^4)は、2^xのxを3^4に
置き換えた式だよね。

ということは、「2の3の4乗乗」っていうのが
自然な読み方ってことになるよね。

t=100

今更だけどさ、「数式の読み上げ方」なんて
考えるだけ時間の無駄だと思わない?

例えば、こんな式にわざわざ「正しい読み方」
なんてものが設定してあると思う?

もしこの世の全ての数式に読みが設定されていて、
音声で完璧に区別できるようになっていても、
覚えたり聴きとるのが面倒臭くて大して便利に
ならないと思わない?

だから僕はスライム配列の読み方を
決めていないし、2の3の4乗乗もあえて
「正しい読み方」とは言わずに「自然な読み方」
って言ったんだ。

t=110

もう予想できてると思うけど、僕が話す内容は
ほとんど数学の話だよ。

理解するのが面倒臭いっていう人は、
重要そうな結果だけ適当に拾い読みしていけば
話についていけてる感じにはなると思うよ。

一応僕も重要な話は何度も繰り返すから、
僕が「~だったよね。」って言う度に
「そういえばそんな感じのこと言ってたな」って
思えれば十分理解できているって言えると思うよ。

台詞のバックログ機能でも実装すれば
もっと理解しやすくなったんだろうけど、
残念ながら作者にはそんな技術力は
無かったみたいだね。

t=120

ごめん、めちゃくちゃ脱線しちゃったね。
元の話に戻すよ。

「降順の法則を使うと、スライムの並びを
配列で表記できる」っていう話だったね。

じゃあ次は、この表記を使ってスライムとの戦闘を
シミュレートできるように「スライム配列の
計算規則」を考えてみよう。

まず、配列部分の右端から
「0より大きい数字」を探す。

あ、「配列部分」っていうのは
丸括弧まるかっこで囲まれた部分だよ。
右端にある角括弧かくかっこの部分は含まないからね。

t=130

話を戻すよ。配列部分の右端から
0より大きい数字を探すんだったね。

見つけた数字が配列の右端にあった場合、
まずその数字を1減らして、角括弧の中の数字を
1増やす。

これは体力1のスライムを攻撃したときの処理を
表しているよ。

実際に計算するときは、1ずつ動かさずに
まとめて計算した方が速いけどね。

t=140

見つかった数字が右端じゃない場合、
まずその数字を1減らして、その右隣にある0を
「角括弧の中の数字+1」に書き換える。
そして、角括弧の中の数字を1増やす。

これは体力2以上のスライムを攻撃して、
スライムが分裂する処理を表しているよ。

そして最後に、0より大きい数字が
見つからなかったら、角括弧の中の数字が
計算結果になるよ。

t=150

じゃあ、計算の練習をしてみようか。

(1,0,2,0)[3]に対して計算規則を適用した結果は
どれかな?

選択肢
・(1,0,2,-1)[4]
・(1,0,1,4)[4]
・(1,4,1,0)[4]

正解!

じゃあ次の問題。
(2,2,2)[2]と等しくないのはどれ?

選択肢
・(2,3,0)[1]
・(2,1,5)[5]
・(2,0,0)[20]

正解!

今後君にスライム配列の計算をしてもらう機会は
無いと思うんだけど、一応計算方法だけは
頭に入れておいたほうが良いと思うよ。

t=160

大事なことを言い忘れてたよ。

実はスライム配列の計算結果は、
正しいターン数より1だけ大きくなるんだ。

例えばこの戦闘、5ターン目で終わるのは
分かるよね?

でもスライム配列の(1)[5]の計算結果は、
6になる。

実際の戦闘では最後の1体を倒したときは
ターン数は増えないけど、スライム配列の
計算規則では角括弧の中の値が1増えるから、
こういうズレが生じるんだね。

t=170

さあ、いよいよ本題に戻ろうか。

何の話かって?
君が今やってる戦闘がいつ終わるか、って話だよ。

「tターン目に体力1のスライムだけがn体いる
場合、戦闘が終わるのはt+n-1ターン目になる」
って言ったの覚えてる?

「tターン目に(略)」という状況をスライム配列で
表すと(n)[t]になるけど、これの計算結果は
t+nだよ。

さっき説明した「ズレ」を考慮すると、
「t+n-1ターンで終わる」という結果と
合っていることがわかるね。

t=180

じゃあ、(1,0)[t]は?

ルール通りに計算すると、まずは
(0,t+1)[t+1]になるね。

配列部分の左端にある0は計算には
関わらないから、(0,t+1)[t+1]=(t+1)[t+1]
って省略できるね。

ということは(n)[t]=t+nという公式が使えて、
答えはt+1+t+1、整理すると2t+2だね。

t=190

次は(2,0)[t]を計算してみよう。

まず、(2,0)[t]=(1,t+1)[t+1]だよね。

この後は、「配列の右端の値を1減らして、
角括弧の中の値を1増やす」という処理が
t+1回行われるよね。

ということは、最終的に(1,0)[2t+2]になるよね。

あとは(1,0)[t]=2t+2という公式が使えるから、
(2,0)[t]=4t+6という結果が得られるよ。

t=200

どんどん行くよ、次は(3,0)[t]だ。

まずは(3,0)[t]=(2,t+1)[t+1]。

「配列の右端の値を1減らして、角括弧の中の
値を1増やす」という処理がt+1回行われるから、
(2,t+1)[t+1]=(2,0)[2t+2]。

(2,0)[t]=4t+6という式を適用して、
(2,0)[2t+2]=8t+14。

まとめると、(3,0)[t]=8t+14。

t=210

そろそろ飽きてきただろうから、別の見方を
してみようか。

(4,0)[t]を地道に計算していくと、
いつか(1,0)[x]という形の式になるよね。

実は(4,0)[t]が(1,0)[x]という形になるまでの
流れは、(3,0)[t]が(0,0)[x]になるまでの流れと
ほとんど同じなんだ。

具体的な値で見てみると、こうなるよ。

数値の増え方も同じだから、角括弧の中の値も
同じになってるよね。

ということは、こういう関係が
成り立つってことだよね。

説明は省くけど、実は(n+1,0)[t]=(1,0)[(n,0)[t]]
という関係式が成り立つんだ。

t=220

実際に計算して確かめてみようか。

まず(2,0)[t]だけど、これはルール通りに
計算すると(1,t+1)[t+1]になって、その後は
(1,0)[2t+2]になるよね。

ところで、(1,0)[t]=2t+2だったのを覚えてる?
これを使うと、(1,0)[2t+2]=(1,0)[(1,0)[t]]と
変形できるよね。

つまり(2,0)[t]=(1,0)[(1,0)[t]]ってことに
なるけど、これは(n+1,0)[t]=(1,0)[(n,0)[t]]の
n=1のケースに相当するよ。

t=230

(3,0)[t]の場合は、ちょっと違う方法で
確かめてみようか。

まず、(3,0)[t]=8t+14だったね。

実は8t+14という式は、2(4t+6)+2と等しいんだ。

(1,0)[t]=2t+2と組み合わせると、
2(4t+6)+2=(1,0)[4t+6]と変形できるよね。

で、4t+6ってなんか見覚えあると思わない?

そう、(2,0)[t]=4t+6だよね。

ということは、(1,0)[4t+6]=(1,0)[(2,0)[t]]
ってことになるよね。

つまり(3,0)[t]=(1,0)[(2,0)[t]]で、
(n+1,0)[t]=(1,0)[(n,0)[t]]のn=2のケースが
成り立っていることになるね。

t=240

じゃあ結局、(4,0)[t]は?

まず、(4,0)[t]=(1,0)[(3,0)[t]]だよね。

で、(3,0)[t]=8t+14だから、
(1,0)[(3,0)[t]]=(1,0)[8t+14]。

そして(1,0)[t]=2t+2だから、
(1,0)[8t+14]=2(8t+14)+2。
展開して整理すると、16t+30になる。

つまり、(4,0)[t]=16t+30だね。

t=250

ところで、(4,0)[t]=(1,0)[(3,0)[t]]
っていう式は実はもっと変形できるんだ。

まず、(3,0)[t]の部分は(1,0)[(2,0)[t]]にできる。

そして、(2,0)[t]=(1,0)[(1,0)[t]]だよね。

ということは、(4,0)[t]=(1,0)[(1,0)[(1,0)[(1,0)[t]]]]
ってことになるね。

t=260

(4,0)[t]=(1,0)[(1,0)[(1,0)[(1,0)[t]]]]ってことは、
(4,0)[t]の値はtに対して(1,0)[x]の計算、つまり
「2を掛けて2を足す」っていう計算を
4回適用した値でもある、ってことだよね。

(4,0)[t]=16t+30だけど、tに「2を掛けて2を足す」
っていう操作を4回行うと本当に16t+30になるよ。
気になった人は試してみてね。

この話、実は(4,0)[t]だけに限った話じゃないんだ。

nがどんな自然数でも、(n,0)[t]は
「tに『2を掛けて2を足す』という操作をn回
適用した値」になるんだ。

これを利用すると、(n,0)[t]の値をnとtの式で
表せるようになるよ。

説明は省くけど、頑張って計算すると
(n,0)[t]=(t+2)×2^n-2になるよ。

t=270

今更だけど、僕の存在って邪魔だったりしない?

「二度と口を開くな、臭ぇ蘊蓄を垂れ流す
肛門の代弁者が!」とか思ってない?

  • はい

そうなんだ。

なら、僕はもう喋らないことにするよ。

戦闘コマンドの選択肢に「雑談」っていう項目を
追加しておくから、また僕の話を聞きたくなったら
その項目から雑談をONにしてね。

  • いいえ

へぇ。

まあそうだよね、話し相手でもいないと
こんなクソゲー耐えられないだろうね。

それでももし、僕の話を聞きたくなくなったら
いつでも話を止められるようにするよ。
戦闘コマンドの選択肢に「雑談」を追加して
おくから、その項目から雑談をOFFにできるよ。

t=280

話を戻すよ。
(n,0)[t]=(t+2)×2^n-2が成り立つ、
って話だったね。

これを使うと、ようやく君が今やっている
戦闘のことがわかるようになるんだ。

まず、この戦闘の初期状態は
「1ターン目に、体力4のスライムだけが1体いる」
っていう状況だったね。

これをスライム配列で表すと、
(1,0,0,0)[1]だよね。

t=290

(1,0,0,0)[1]に計算規則を適用すると、
(0,2,0,0)[2]になるよ。左端の0は計算には
関わらないから、(2,0,0)[2]と書いても同じだね。

(2,0,0)[2]を更に計算すると、(1,3,0)[3]になる。
ここからさらに計算を続けると、いつかは
(1,0,0)[x]という形になるよね。

そこまでの計算過程では、左端の1は
計算には関与しないよね。ということは、
(1,3,0)[3]が(1,0,0)[x]になるまでの計算は
(3,0)[3]の計算終了までの過程と同じになるんだ。

要するに、x=(3,0)[3]ってことだね。
(4,0)[t]=(1,0)[(3,0)[t]]とかと同じ仕組みだね。

t=300

(3,0)[3]はいくつかわかるかな?
(3,0)[t]=8t+14だから、38になるよ。

で、(1,3,0)[3]=(1,0,0)[(3,0)[3]]って話だったから
(1,3,0)[3]=(1,0,0)[38]だね。

(1,0,0)[38]=(39,0)[39]だから、
あとは(n,0)[t]=(t+2)×2^n-2
っていう公式を使えば終わりだね。

t=310

(1,0,0,0)[1]=(39,0)[39]っていう話だったね。
あとは(n,0)[t]=(t+2)×2^n-2っていう公式を使えば
この戦闘が終わるまでのターン数がわかるね。

n=39、t=39だから、(t+2)×2^n-2=41×2^39-2。
ということは、この戦闘が終わるのは
22539988369406ターン目だね!

おっと、計算ミスだ!
正しい値はもっと小さいよ。

スライム配列の計算結果は正しいターン数より
1大きいから、正しいターン数は
22539988369405だね。

t=320

せっかくだから、22539988369405ターンの戦闘が
終わるまでの時間を概算してみようか。

1ターンに1秒かかるとすると22539988369405秒で
終わるけど、分換算だと22539988369405÷60分
だよね。

さらに時間、日、年と変換していくと、
22539988369405÷(60×60×24×365)になる。
これを計算すると、約714738年になるよ。

当然だけど、この結果はプレイスタイルによっては
全く違う値になるよ。

1ターンにかかる時間は最短だと1秒より短いから
頑張ればもっと早くクリアできるし、
1日1時間しかプレイできない人は
24倍の時間がかかるよ。

t=330

ところで、「22539988369405」って
正しく読める?

一般的な命数法では、「二十二兆五千三百九十九億
八千八百三十六万九千四百五」だよ。

あ、「命数法」っていうのは万、億、兆とかで
数の名前を付ける法則のことだよ。

日本で一般的な命数法は「万進法」といって、
一から九と十、百、千と、10^4ごとの数詞を
組み合わせて数に名前を付ける体系だよ。

10^4を表す単位が「万」、10^8が「億」、
10^12が「兆」、その後は「京」、「垓」・・・と
たくさんあって、一番大きいのが10^68を表す
「無量大数」だよ。

t=340

ゲームで扱える数字って、普通は上限が
あるんだよね。

最近のゲームだと大抵21億か42億辺りに
限界があって、その値を超えると値がマイナスに
なったり0になったりするんだ。

このゲームの場合はちょっと違って、
ターン数とスライムの個体数だけは100桁まで
扱えるような工夫をしてあるらしいよ。

例えば、こんな風に。

まあターン数と個体数以外は
何も工夫してないから、プレイ時間とかは
途中でバグっちゃうと思うけどね。

とはいってもそれが原因で進行不能になったり
PCが壊れるようなことは無さそうだから、
大した問題じゃないと思うよ。

t=350

ところで、さっきの「ターン数の表示例」の
画像におかしなところがあるのに気づいたかな?

さあ、変なのはどこかな?

数値の区切りが、3桁ずつじゃなくて
4桁ずつになってるよね。

英語圏では3桁区切りの命数法が一般的だから
数値のカンマ区切りは3桁ずつが一般的だけど、
このゲームでは日本の命数法に合わせて
4桁ずつにしたらしいよ。

まあ、日本語の命数法は72桁までにしか
対応してないから、100桁もあっても
意味無いんだけどね。

t=360

さて、次は何の話をしようかな。

え?
このゲームにストーリーは無いのかって?

もちろん、あるよ。

勇者は魔王を倒すために旅に出ました。
道中でスライムを倒しました。
勇者は魔王を倒しました。
おしまい。

おっと、大事な部分をネタバレしちゃった!

そう、このゲームは勇者が魔王を倒したら
終わりなんだ。

t=370

え?
こんなストーリーじゃつまらないって?

仕方ないな、じゃあ全然関係ない物語でも
聞かせてあげようか。

「永遠の努力」
原作:ジョナサン・バウアーズ

ある日、ベントレー氏は「カウンターを
10個作ったら100万ドル」と書かれたビラが
通りを舞っているのに気が付きました。

欲張りなベントレー氏は、ビラの内容を
よく読まずにその仕事を引き受けることに
しました。

t=380

ベントレー氏は、真っ白な壁に囲まれた
細長い部屋へと通されました。

部屋の中には、助手を名乗る一人の人物と、
2つの段ボール箱がありました。

一方の段ボール箱には、金属の棒が
たくさん入っていました。棒は全て同じ形で、
端同士をつなぎ合わせて長い棒を作れる構造に
なっていました。

もう一方の箱には、穴の開いた金属のディスクが
これまた大量に入っています。ディスクの側面には
0から9までの数字が1つずつ書かれていて、
穴のサイズは金属棒がちょうど通る大きさでした。

t=390

助手はディスク1枚に棒を刺した物体を差し出し、
これが1個目のカウンターであると説明しました。

そしてベントレー氏は、2つ目のカウンターを
作り始めました。

ベントレー氏が棒にディスクを取り付けるごとに、
助手は1個目のカウンターのディスクを1目盛ずつ
回転させていきました。

10枚目のディスクを取り付けたところで1個目の
カウンターのディスクは1周分回転し切り、
2個目のカウンターが完成しました。

t=400

助手は2個目のカウンターの目盛を
0000000000にセットし、ベントレー氏は
3個目のカウンターを作り始めました。

ベントレー氏がディスクを1枚取り付けるごとに
助手は2個目のカウンターを
0000000001、0000000002、0000000003・・・
と回していきます。

棒とディスクはいくら使っても減らず、
段ボール箱は常にいっぱいになっています。

ベントレー氏は休むことも無く、老いることも無く
棒を繋げてディスクを付ける作業を続けました。

t=410

ベントレー氏が数百年かけて10000000000枚、
つまり10^10枚のディスクを取り付けると、
2個目のカウンターは0000000000に戻りました。
これで3個目のカウンターは完成です。

助手は100億枚のディスクが取り付けられた
3個目のカウンターを受け取ると、
目盛を000...00にセットしました。

そしてベントレー氏は4個目のカウンターを
作り始め、助手はベントレー氏が取り付けた
ディスクの枚数を3個目のカウンターで
数え続けます。

4個目のカウンターは、10^(10^10)枚のディスクを
取り付けることで完成します。

4個目のカウンターが完成すると、
次は5個目のカウンター作りが始まります。
5個目のカウンターは、10^(10^(10^10))枚の
ディスクを取り付けることで完成します。

果たして、10個目のカウンターが完成するときは
やってくるのでしょうか?とてもやって来るとは
思えません。この「永遠の努力」を
終わらせる方法は、知られていません。

t=420

どう?面白かった?

念のため言っておくと、さっきの話は
原作とは結構違う部分があるよ。

ディティールはめちゃくちゃ削ってあるし、
変な部分や分かりにくそうだと思った部分は
改変してあるよ。

例えば原作では部屋の形は細長くないし、
段ボール箱は1個しかないよ。

t=430

せっかくだから、ベントレー氏の仕事が
どれだけ大変なのか考えてみようか。

2個目のカウンターを作るまでは、
すぐ終わるってわかるよね。

3個目のカウンターは、10^10枚の
ディスクをつけると完成するんだったね。

ディスク1枚をつけるのに1秒ずつかかるとすると、
3個目のカウンターが完成するまでにかかる時間は
10^10÷(60×60×24×365)年になる。

これを計算すると、約317年になるよ。

t=440

4個目のカウンターの話をする前に、
少し寄り道するよ。

自然数同士の演算に限れば、掛け算は足し算を
繰り返したもので、冪乗は掛け算の繰り返し
だよね。

ということは、冪乗を繰り返した演算っていうのが
あったら便利そうじゃない?

「テトレーション」っていう演算があるよ。

演算子の記号は"↑↑"で、3↑↑4=3^(3^(3^3))
みたいな感じで冪乗の繰り返しを表すよ。

読み方は、多分「さんテトレーションよん」
みたいな読み方が一般的だと思うよ。

正確な定義はこんな感じなんだけど、
これは別に覚えなくていいよ。
とりあえず、「テトレーションは冪乗の繰り返し」
ってことだけ覚えておけばOKだよ。

t=450

ところで、「冪乗の繰り返し」っていうと
3^(3^(3^3))っていう形のもののほかに
((3^3)^3)^3っていうのもあるよね。

この二つは実は全然違う値で、テトレーションで
表せるのは3^(3^(3^3))みたいに
右側で繰り返す方の値だよ。

足し算や掛け算は演算の左右を入れ替えても
同じ値になるけど、冪乗はa^b≠b^aだから
こういう違いが生じるんだね。

ちなみに((3^3)^3)^3は頑張って計算すると
3^27に等しいことがわかるんだけど、
3^(3^(3^3))の方は3^7625597484987だから
3^(3^(3^3))の方が圧倒的に大きい値だよ。

t=460

3^(3^(3^3))とか((3^3)^3)^3みたいな
書き方について、補足しておくよ。

小学校か中学校で、「括弧の中に括弧を入れる
ときは、括弧の種類を変えなさい」って
習ったんじゃないかな。

僕はそのルール、わざと無視してるんだ。

アレって可読性を意識したルールなんだろうけど、
個人的に大して見やすいとも思わないし、むしろ
階層数を数えて括弧の種類を変える面倒臭さ
の方が勝つから全部丸括弧にしてるんだ。

そもそも、計算順序以外の括弧は大抵種類の変更
なんてできないんだから、2重とか3重ぐらいの
多重括弧は当たり前に読めるようになった方が
いいと思うんだよ。

僕の話にはあまり複雑な構造の多重括弧は
使わないから、多重括弧の読解の練習だと思って
頑張って読んでよ。まあ数式を読み飛ばしてる人
には関係ない話だけど。

t=470

さて、ベントレー氏の仕事の話に戻ろうか。

3個目のカウンターを作るのに使うディスクの数は
10^10枚だったけど、これは10↑↑2枚とも
表せるよね。

そして4個目のカウンターを作るのに使う
ディスクの数は10^(10^10)枚だけど、
これは10↑↑3枚だね。

同じように考えていくと、n個目のカウンターを
作るのに使うディスクの数は10↑↑(n-1)枚になることがわかるよ。

ちなみに10↑↑1=10だし、人によっては
n↑↑0=1を定義に含めることもあるから、
その場合は2個目と1個目のカウンターについても
同じ法則が成り立つよ。

t=480

大きな数を表す比喩として、「天文学的な数」
っていうのがあるよね。

星の大きさとか、銀河の広さとか、
あとは何かの時間の長さとか、
宇宙は大きな数の宝庫だよね。

じゃあ、ベントレー氏の仕事を「天文学的な数」と
比べてみようか。

君の住んでいる宇宙に存在する素粒子の数は、
大体10^80から10^85くらいらしいよ。

1無量大数が10^68乗だから、大きすぎて
日本語の命数法では表せない数だね。

t=490

で、4個目のカウンターに使うディスクの数は
10^(10^10)枚、つまり10^10000000000枚だから、
ディスクの数は宇宙の素粒子の数より多いんだね。

ということは10^(10^10)枚のディスクなんて
存在できないけど、そういうしょうもないツッコミ
は「フィクションだから」で割り切ってね。

「ベントレー氏のいる宇宙は我々の宇宙より
ずっと大きいんだ」みたいな言い訳をしたところで
僕の話を理解するのには役に立たないから
諦めてね。

t=500

宇宙の大きさといえば、君のいる宇宙の大きさ
についてはいろいろな説があるようだね。

そんな中で特に大きい推定値として、
「直径10^(10^(10^122))m」という値があるよ。

10^(10^(10^122))という値は、テトレーションで
表すと10↑↑4より大きくて10↑↑5よりは
小さい値だよ。

6個目のカウンターは10↑↑5枚のディスクで
できているから、6個目のカウンターは
宇宙からハミ出すことになりそうだね。

t=510

10^(10^(10^(10^(10^1.1))))という数は、
「宇宙論で使われた最大の数」と呼ばれている
らしいよ。

どういう値なのかはよくわからないけど、
どうやら時間の値らしいね。

で、この値をテトレーションで評価すると
10↑↑5と10↑↑6の間になる。

7個目のカウンターは10↑↑6枚のディスクで
できているから、7個目のカウンターを作るのに
かかる時間の方が長くなりそうだよね。

t=520

「宇宙論で使われた最大の数」を
超えちゃったから、8個目のカウンターについては
もう宇宙に関する値とは比較できないね。

こんな感じで、テトレーションで表される数では
「天文学的」という比喩では
不十分なことがあるよ。

テトレーションで表される数の大きさは、もはや
「テトレーションで表される数の大きさ」としか
表現できないんだ。

t=530

一応、テトレーション級の数の大きさを体感する
別のアプローチも紹介しておくよ。

まず、10^nって「1の後に0がn個並んだ数」
だよね。

10↑↑2=10^10だから、10↑↑2は
「1の後に0が10個並んだ数」になるよね。

次に、10↑↑3=10^(10^10)だから、10↑↑3は
「1の後に0が10^10個並んだ数」だよね。
10↑↑2と合わせて考えると、こうなるよね。

じゃあ、10↑↑4は?

10↑↑4=10^(10^(10^10))だから、こうだよね。

ということは、10↑↑9はこんな数だって
ことになるよね。

どう?実在するモノとの比較じゃないけど、
とんでもない大きさの数だっていう雰囲気が
なんとなく体感できたんじゃないかな。

t=540

テトレーションの説明は、
これくらいにしておくよ。

結局テトレーション級の数の大きさは
よくわからなかった、なんていう人も
いるだろけど、個人的には感覚的な理解は
そんなに重要じゃないと思ってるよ。

重要なのは、テトレーションはテトレーションと
割り切って、逆にテトレーションを新たな数の
比較基準として受け入れられるか、ってこと
だと思うんだ。

宇宙の話をしたとき、「10^(10^(10^122))は
10↑↑4より大きくて10↑↑5よりは小さい」
みたいな話をしたのを覚えているかな。

そんな感じで、テトレーションを新たな物差し
として使って、他の数を比較できるように
なることを「テトレーションの理解」と
呼べばいいんじゃないかな。

t=550

え?
「宇宙論以外の話でテトレーション級の数が
出てくることなんてあるのか」だって?
もちろんあるよ。

スライム配列。

「永遠の努力」の話をする前に、スライム配列で
表される数の大きさについて話したのを
覚えてるかな。

あのときは(1,0,0,0)[1]の計算が目的だったから
(n,0)[t]の計算をして一区切りにしちゃったけど、
実はこの先を考えるとテトレーション級の数が
出てくるんだ。

t=560

(n,0)[t]の値がどんな式で表されるか、
覚えているかな。

別に覚えてなくてもいいんだけど、
冪乗が出てくる式だったことは流石に
覚えてるんじゃないかな。

実際の式は、(n,0)[t]=(t+2)×2^n-2だよ。

そして(1,0,0)[t]=(t+1,0)[t+1]だから、
(1,0,0)[t]=(t+3)×2^(t+1)-2だよ。

ところで、(t+3)×2^(t+1)-2が2^(t+1)より
大きいってのはわかるよね?

まあ別に分からなくてもいいんだけど、
とりあえず(1,0,0)[t]が2^(t+1)より大きい、
っていうことだけは頭の片隅にでも置いといてね。

t=570

じゃあ、(2,0,0)[t]はどれぐらいの大きさかな?

(2,0,0)[t]を計算規則に従って計算すると、
(1,t+1,0)[t+1]になる。さらに計算していくと、
いつかは(1,0,0)[x]という形になるよね。

ところで、(1,n,0)[t]が(1,0,0)[x]という形に
なるまでの計算過程では、配列部分の左端の1は
計算には全く関わらないよね。

ということは(1,n,0)[t]が(1,0,0)[x]になるまでの
計算過程は(n,0)[t]の計算終了までの過程と同じ、
つまりx=(n,0)[t]ってことになるよね。

え?この説明前に見たことがあるって?

そうだね、(4,0)[t]と(1,3,0)[3]の計算をするときに
同じような説明をしたよね。

この性質ってかなり重要なんだけど、
定式化が面倒だから毎回同じ説明を
繰り返してるよ。

t=580

話を戻すよ。
(1,n,0)[t]=(1,0,0)[(n,0)[t]]が成り立つ、
っていう話だったね。

(2,0,0)[t]=(1,t+1,0)[t+1]だから、
さっきの式に当てはめると
(2,0,0)[t]=(1,0,0)[(t+1,0)[t+1]]が成り立つって
ことになるよね。

(t+1,0)[t+1]は(1,0,0)[t]を1回計算したものだから、
(2,0,0)[t]=(1,0,0)[(1,0,0)[t]]とも書けるね。

じゃあ、これがどのくらいの大きさか
考えてみようか。

t=590

(1,0,0)[t]は、2^(t+1)より大きいって
前に話したよね。

ということは、(1,0,0)[(1,0,0)[t]]は
(1,0,0)[2^(t+1)]より大きいよね。

そして、(1,0,0)[2^(t+1)]は2^(2^(t+1)+1)より
大きいことがわかるよね。

2^(2^(t+1)+1)は2^(2^(t+1))より大きいから、
(1,0,0)[2^(t+1)]は2^(2^(t+1))より大きいとも
いえるよね。

まとめると、(2,0,0)[t]は2^(2^(t+1))より
大きいってことになるよ。

t=600

じゃあ、(3,0,0)[t]は?
もう予想できたって人もいるだろうね。

まず、(2,0,0)[t]=(1,0,0)[(1,0,0)[t]]だったのと
同じ仕組みで、(3,0,0)[t]=(1,0,0)[(2,0,0)[t]]が
成り立つ。

(1,0,0)[t]>2^(t+1)で、
(2,0,0)[t]>2^(2^(t+1))だから、
(1,0,0)[(2,0,0)[t]]>2^(2^(2^(t+1))+1)が
成り立つ。

2^(2^(2^(t+1))+1)>2^(2^(2^(t+1)))だから、
結局(3,0,0)[t]>2^(2^(2^(t+1)))が成り立つ。

さて、もうそろそろパターンが見えてきた頃かな。

t=610

同じ計算を繰り返すと、(4,0,0)[t]が
2^(2^(2^(2^(t+1))))より大きくて、
(5,0,0)[t]が2^(2^(2^(2^(2^(t+1)))))より
大きいことがわかるよ。

こんな感じで、(n,0,0)[t]は2の冪乗を繰り返した
値で下から評価できるよ。

tが1以上ならt+1は2以上になるから、
テトレーションを使うと(n,0,0)[t]>2↑↑(n+1)と
評価できるよ。

t=620

そういえば、テトレーションの左側の数が
10のときと2のときの違いを説明してなかったね。

詳しい説明は省くけど、nが十分大きければ
10↑↑(n-2)>2↑↑n>10↑↑(n-3)
が成り立つよ。

要するに、繰り返しの回数は減るけど
2↑↑nも10の冪乗の繰り返しで表されるぐらいの
大きさになるってことだね。

t=630

(1,0,0,0)[t]=(t+1,0,0)[t+1]だから、
(n,0,0)[t]>2↑↑(n+1)という評価を適用すると
(1,0,0,0)[t]>2↑↑(t+2)ということがわかるね。

じゃあ、これを使って(1,0,0,0)[1]の大きさを
再評価してみようか。

2↑↑(t+2)にt=1を代入すると、2↑↑3になる。
2↑↑3=2^(2^2)で、さらに計算すると16になる。

ということは、(1,0,0,0)[1]>16ってことだね!

え?おかしくないかって?
別に嘘は言ってないよ。

実は(1,0,0,0)[t]>2↑↑(t+2)っていう評価は、
分かりやすさを重視したから
めちゃくちゃ雑なんだ。

まあ雑とはいっても、一応不等式としては
正しいよ。実際、(1,0,0,0)[1]=22539988369406
だったから16よりは大きいよね。

とりあえず、「(1,0,0,0)[t]は少なくとも
テトレーションで表されるくらいの大きさはある」
っていうことだけは覚えておいてね。

t=640

(1,0,0,0)[t]がテトレーション級の大きさになる
ということは、この戦闘が22539988369405ターン
っていう「現実的なターン数」で終わるのは
ラッキーなことなんだ。

例えば、この状況から戦闘が始まったら
終わるまでどのくらい掛かるかわかるかな?

君が今やっている戦闘との違いは、
体力4のスライムの前に体力1のスライムが1体いる
ってことだけだね。

最初の1ターンでこのスライムを倒すことに
なるから、体力4のスライムとの戦闘が
2ターン目から始まると考えても同じだね。

t=650

「2ターン目に体力4のスライム1体だけがいる」
っていう状況は、スライム配列に直すと
(1,0,0,0)[2]だよね。

(1,0,0,0)[2]を1回計算すると(3,0,0)[3]になるけど、
これは(1,0,0)[(1,0,0)[(1,0,0)[3]]]と等しいよね。

で、(1,0,0)[t]=(t+3)×2^(t+1)-2だったから、
(1,0,0)[3]=6×2^4-2=94、つまり
(1,0,0)[(1,0,0)[(1,0,0)[3]]]=(1,0,0)[(1,0,0)[94]]
ってことだね。

t=660

ここからは正確な計算が難しいから、
概算に切り替えるよ。
(1,0,0)[t]=(t+3)×2^(t+1)-2だけど、
これは明らかに2^(t+1)より大きいよね。

ということは、(1,0,0)[94]は2^95より大きくて、
(1,0,0)[(1,0,0)[94]]は2^(2^95)より大きいよね。

で、ここからの計算は説明が面倒だから
省略しちゃうけど、頑張って計算すると2^(2^95)は
10^(10^28)より大きいことがわかるよ。

ベントレー氏が4個目のカウンターに取りつける
ディスクの枚数が10^(10^10)だから、
4個目のカウンターを作るよりも
時間がかかりそうだね。

まぁこのゲームでは10^100以上の数値は
扱えないから、この話は「もしも桁数が
無制限だったら」という仮定の上での
妄想でしかないよ。

一応桁数の上限をもっと大きくする方法は
あるんだけど、それでも流石に10^(10^28)には
届かないと思うよ。

t=670

ところで、君はこのゲームのタイトルを
覚えているかな?

そう、「世界一退屈かもしれないRPG」だね。

なんで「かもしれない」なんていう弱気な表現を
使っているか、今の君ならわかるんじゃないかな。

簡単に言えば、「世界一と断言できるほど
退屈じゃないから」だよ。

クリアにもっと時間のかかるゲームが存在する
可能性もあるし、そもそも(1,0,0,0)[1]は
このゲームシステムで実現可能なターン数の限界
よりずっと小さいからね。

さっき説明した通り、(1,0,0,1)[1]みたいに
ほんのちょっとの変化でターン数は爆発的に
伸びるから、今作より退屈なゲームを作るのは
全然難しいことじゃないんだ。

(1,0,0,1)[1]は実際は数値の上限に引っかかるけど、
現実的な範囲で言えば例えば(2,1,0)[1]は
戦闘終了まで約30無量大数ターンかかるよ。
年換算だと約48那由他年だよ。

ということは、(2,1,0)[1]の戦闘を実装したゲームを
作れば、少なくとも今作よりは退屈なゲームを
名乗れることになるね。

t=680

さて、ちょっとだけ話を戻すよ。

(1,0,0,0)[t]がテトレーション級の大きさになる
ってことがわかったと思うけど、
(1,0,0,0,0)[t]とか(1,0,0,0,0,0)[t]がどうなるかって
気にならない?

(1,0,0,0)[t]を評価するのに冪乗の繰り返しである
テトレーションが必要だったってことは、
(1,0,0,0,0)[t]にはテトレーションの繰り返しの演算
が必要になりそうだよね。

実は、テトレーションの繰り返しやその繰り返し、
さらにその繰り返しの繰り返しの・・・っていう
一連の演算の定義がすでにあるよ。

「上矢印表記」っていって、テトレーションの
矢印を3本以上に増やした表記があるよ。

矢印3本の「ペンテーション」がテトレーションの
繰り返しで、ペンテーションの繰り返しは
矢印4本の「ヘキセーション」という演算だよ。

正確な定義は覚えなくていいけど、
「矢印n+1本の演算は、矢印n本の演算の
繰り返し」という法則は頭に入れておいてね。

t=690

一応、上矢印表記の具体例でも
紹介しておこうかな。

矢印3本の演算子で表される「ペンテーション」は
テトレーションの繰り返し、って言ったよね。

例えば、2↑↑↑4は2↑↑(2↑↑(2↑↑2))と
等しいよ。

頑張って計算すると2↑↑2=4、2↑↑4=65536
になるから、2↑↑↑4=2↑↑65536になるね。

ちなみに、「テトレーションの繰り返し」
といっても((2↑↑2)↑↑2)↑↑2みたいな数は
ペンテーションでは表せないよ。

冪乗がa^b≠b^aだったと同じくテトレーションも
a↑↑b≠b↑↑aだから、左右どちら側の計算を
繰り返すかによって計算結果は変わるよ。

ちなみに、((2↑↑2)↑↑2)↑↑2は
頑張って計算したら2^(2^9)になるよ。

2↑↑(2↑↑(2↑↑2))、つまり2↑↑↑4は
2↑↑65536、つまり2^(2^(2^(...(2^2)...)))
(2が65536個)だったから2↑↑↑4の方が
圧倒的に大きいね。

t=700

ペンテーションの繰り返しが、矢印4本で表される
「ヘキセーション」だよ。

例えば、2↑↑↑↑4は2↑↑↑(2↑↑↑(2↑↑↑2))
と等しいよ。

ペンテーションの繰り返しといっても、
a↑↑↑b≠b↑↑↑aだから
2↑↑↑↑4≠((2↑↑↑2)↑↑↑2)↑↑↑2だよ。

矢印が5本以上でもこの性質は共通していて、
矢印n+1本の演算は矢印n本の演算の右側を
繰り返したものであって、左側を繰り返したもの
とは等しくないよ。

t=710

さあ、いよいよ本題に戻ろうか。

(1,0,0,0)[t]>2↑↑(t+2)だったのを覚えてたかな?

散々説明したからもう省略するけど、
(n,0,0,0)[t]は(1,0,0,0)[(1,0,0,0)[(1,0,0,0)[...]]]
ていう感じに(1,0,0,0)[t]の計算をn回繰り返した値
と等しくなるよ。

これを利用すると、(n,0,0,0)[t]>2↑↑↑(n+1)
になることがわかるよ。

そして(1,0,0,0,0)[t]=(t+1,0,0,0)[t+1]だから、
(1,0,0,0,0)[t]>2↑↑↑(t+2)だね!

t=720

(1,0,0,0)[t]>2↑↑(t+2)、
(1,0,0,0,0)[t]>2↑↑↑(t+2)と来たら、
この先がどうなるか想像できるんじゃないかな。

もちろん、
(1,0,0,0,0,0)[t]>2↑↑↑↑(t+2)になるよ。

そしてこの先も、(1,0,0...0)tは
矢印n-1本で下から評価できるんだ。

これがスライム配列の全容、いわば
このゲームにおけるスライムの強さの全容だよ。

t=730

ここまで僕の話を聞いてくれて、
本当にありがとう。

せっかくだから、君に一ついいことを
教えてあげるよ。

いや、これを「いいこと」と呼ぶのは
ちょっと語弊があるかな。

今から教えるのは、この戦闘に勝たずに
魔王城へ直行できる「抜け道」だよ。

システム欄から「BGM」と「SE」の音量を
両方0%にして、お城を調べてごらん。
そしたら魔王城に繋がる抜け道に入れるよ。

手順はメモとしてアイテム欄に入れておいたから、
いつでも再確認できるよ。気が向いたときにでも
試してみてね。

お城を調べるのもアイテムを見るのも
戦闘中は無理だから、試したくなったら
一旦「逃走」を選択して戦闘を終了させてね。

t=740

へえ、まだ続けるんだ。

もしかして、僕がまだ何か話すんじゃないかって
思ってる?悪いけど、スライムの強さを
説明し終わった時点で僕の役割は終わりなんだよ。

そうだ、この後からは僕の雑談の代わりに
広告が表示されるようにしようか。

そしたら君も「もう面白いことは何も無いんだな」
って思ってくれるよね?

もし広告を見たくない場合は、戦闘画面での
選択肢から「雑談」を選べば広告を非表示に
できるよ。

もちろん、無料でね!

t≥750

ここから先は以下の広告が順番に(10ターンごとに1パターン)表示され続けます。

  • パターン1

ホラゲーの皮を被ったバカゲーの皮を被った
高難度脱出ゲーム「サーモンピンク鬼」、
好評配信中!!!

  • パターン2

激ムズ脱出ゲーム第2弾
「エメラルドグリーン鬼」、好評配信中!!!

  • パターン3

鬼ごっこパズル系(?)高難度脱出ゲーム
「ワインレッド鬼」、好評配信中!!!

  • パターン4

1マップ微ホラー鬼畜脱出ゲーム「LH99」、
好評配信中!!!

余談

余談です。

没案

  • 設定

最後の方に「僕は作者の怠慢のせいで何の設定も与えられなかった悲しきキャラクターだよ」というセリフを言わせたかったのですが、前後の話の流れと上手く繋げられなかったので没になりました。

  • グラフィック

スライムのグラフィックは、ウディタのデフォ素材をProcessingで加工したものです。

☝スライムのグラフィック

色合いが微妙にしっくりこなかったのでいっそ全部自分で描こうかとも思ったのですが、1枚だけ描いて面倒臭くなったのでやめました。


☝自作のスライムのドット絵
  • コア付きスライム

抜け道を教えた後に、スライムを強化する話をする案がありました。

コア付きスライムは、名前の通り体内に「コア」があるスライムです。

体力が1のコア付きスライムが攻撃を受けると、コアを1個消費して体力をt+1に回復します。

コアが1個の場合の比較対象として、グラハム数を紹介する予定でした。

  • スライム数列

強化スライムはスライム配列とは相性が悪いので、スライムの体力をそのまま並べた「スライム数列」という表記を改造して使います。

例えばスライム配列で(1,3,0,1,2,4,0,0)[2]と表される状況は、スライム数列では{8,7,7,7,5,4,4,3,3,3}[2]と表します。

  • 多重スライム

多重スライムは、名前の通りネスト構造になったスライムです。

体力1のスライムがコア付きスライムのコアと同じように働き、体力2以上のスライムは通常のスライムと同様に分裂します。

例えば「2ターン目に、『体力2のスライムが中に入った体力1のスライム』がいる」という状況はスライム数列では{{2}1}[2]と表され、{{1,1,1}3}[3]と展開されます。

3重以上の場合も含めた動作規則は以下の通りです。

・体力が1で中身のないスライムは、攻撃を受けると消滅する。

・体力が1で中身があるスライムは、攻撃を受けると体力がt+1になり、中身のスライムの内右端にいるものが攻撃を受ける。

・体力が2以上のスライムは、攻撃を受けると体力が1減ってt+1体に分裂する。

スライム数列での展開例は以下のような感じです。

{{{{1}1}1}1}[1]=
{{{2}2}2}[2]=
{{{2}2}1,{{2}2}1,{{2}2}1}[3]=
{{{2}2}1,{{2}2}1,{{2}1,{2}1,{2}1,{2}1}4}[4]=…

  • 順序数

FGHや順序数自体の説明はほとんどせずに「矢印$${n}$$本の強さが$${n+2}$$、普通のスライムの強さが$${\omega}$$、コア1個のコア付きスライムが$${\omega×2}$$、コア付きスライムが$${\omega^2}$$、2層の多重スライムが$${\omega^{\omega}}$$、多重スライムの限界が$${\varepsilon_0}$$」みたいな話をして、「何も分からんけどなんか凄そうだな」みたいな雰囲気を味わわせたかった。

  • フリーバトル

自分でパラメータを自由に設定して戦闘ができるモードがエンディング後に解禁される、という案がありました。

ヒント

雑談を最後まで読んでも魔王城に辿り着けない人がいるっぽいので、抜け道の突破方法のヒントを載せます。

画像の通りの状態にしてセーブすると楽にクリアできます。

ちなみに今作はカラフル鬼シリーズとは違って、メニューを開いているときは敵は動きません。(ただし移動の最中だと移動先まで動く)

タグ

ふりーむのゲームページにある「似た無料ゲームをさがす(自動)」の欄に表示されるタグは、「(自動)」という表記の通り自動で決定されるらしく、ゲームの制作者ですら干渉することはできません。

本作の投稿前にTwitterで「作品内容と合ってないタグが表示されている」というツイートが少し話題となっていて、実際に見てみると確かに無関係なタグが付いていました。

☝「学校」と「AI」が無関係

ちなみに、他の作品でも同じ現象が発生していました。

☝サーモンピンク鬼(「RPG」が無関係)
☝エメラルドグリーン鬼(「切ない」「RPG」)
☝LH99(「鬼」「探索 RPG」「ランダム」「RPG」)
☝ワインレッド鬼(「切ない」)

どうやらこのタグはページ内の文章から生成されているらしく、たとえば「ランダム要素はありません」と書くと「ランダム」というタグが付くようです。

そしてエメラルドグリーン鬼とワインレッド鬼の「切ない」は、「前作との繋がりは一切ない」の「切ない」の部分が原因だと思われます。

計算ミス

実は「クリアするのに71万年」という宣伝文句(?)は、計算ミスにより2回も修正されました。

☝最初は400年だった
☝400年の次は35万年だった

「35万年」という計算結果は、1ターン経過させるのにかかる時間がちょうど30フレーム(0.5秒)であるという勘違いによるもので、ゲームの完成間近になって間違いであることに気付いて1ターン=1秒での計算結果に修正しました。。(400年の理由は忘れました)