読者です 読者をやめる 読者になる 読者になる

Minecraftにみる世界の「完全性」

さて、所謂箱庭ゲームで重要なのは

  1. 適度な自由度(世界へ局所的にしか干渉できないものの、その痕跡は残せること)
  2. 作ったものを眺める楽しみ

などだと思うのですが、これらを実現するひとつの方法として、何らかの(それほど複雑でない)規則でシミュレーションを行う、というのが挙げられるかと思います。

そこで今回はMinecraftを例にとって、計算と自己複製の観点からその世界の性質を見てみます。


(この記事はMinecraftそのものに対する批評ではありません!)

概要

Minecraftがどんなゲームなのかは実況を見るなり実際にプレイ(注:最新版は有料)するなりして頂くとして、ここからはある程度知っていることを前提に概要を示します。

まず特徴的なのは、この世界の要素は連続的か離散的かで大きく二分できるということです。そして、離散的な側は自明ではないもののセルオートマトン(以下CA)として扱えます。というのも、ブロックの状態は種類の他にいくつかの属性を持ち、植物の成長・流体の発展・レッドストーン上の信号伝搬・照明など考えてみても、その時間発展は離散的でなおかつある瞬間には狭い範囲にしか影響を与えないからです。*1

一方連続な側は各要素がそれぞれ(連続な)位置と速度を最低限持ちますが、共通性の高い規則は重力程度で、相互作用は疎です。

そしてこれらの性質の異なる世界を、要素間のメッセージパッシングによって結合しているとみなすことが出来るでしょう。*2

Minecraftが考察の対象としてもおもしろいのは、世界の大部分を占める離散的なブロックを比較的均一に扱えるからです。まず、レッドストーン回路についてみてみましょう。

レッドストーン回路と計算

レッドストーン(以下RS)回路は色々な要素を操作できますが、論理回路としての完全性を言うには、空気・RSトーチ・適当なブロック・RSワイアの四種類があれば事足ります。

とりあえず遅延を無視すると、RSワイアは0とOR、RSトーチが1とNOTの役割を果たすのでこれで組み合わせ回路としては完全です。実際にはRSトーチでは単位時間(0.1sec)の遅延が発生する上に、瞬時に信号が伝わるのは15セルまでなので完全性を証明するのは難しいですが、CPUを構成した例( http://www.youtube.com/watch?v=4PnPSlLWRig )などから、事実上なんでも作れると言えるでしょう。

また、遅延が至るところで発生するにも関わらず、最小時間幅というのが決まっているので、複雑な回路が同期式とも非同期式とも言えない、暗黙の局所的クロックを用いるような構成を取るのも興味深いことです。

さて、ここで注意しておかないといけないのは、TNTやピストンがあるとはいえ、RS回路自体を動的に作りだすことはできないので*3、あくまでも移動するのは信号のみであるということです。

プレーヤキャラクタの役割

唐突ですが、このモデルで、例えばプレーヤがブロックを置くという操作が、プレーやキャラクタ(以下PC)を媒介としてどのように行われるか見てみましょう。

  1. PC->CA: 座標と種別を指定して「置く」メッセージを発行
  2. CA->PC: 置けるかどうか判断して、状態変更+成功可否を返答
  3. PC: 所持アイテムの状態を変更

ちなみに、「インベントリで選ぶ」というような作業は図の黒線の下の部分、つまりプレーヤとPCのインターフェースに属することであって、画面表示などと同じく、Minecraft世界の「中」から見える情報ではありません。・・・もちろんゲーム性には大きく関わるのですが、ここでは世界について考えているのでモデルから除いたほうが話が簡単になる、ということです。

プレーヤは何でも作れる、もう少し厳密には、「有限時間である領域内のCAの状態を(ほぼ)任意に設定できる」ようになっています。これを支えるのがPCに可能な行動群なので、それを見てみましょう。

  1. 速度変化(制限あり)
  2. 全てのブロックのアイテム化もしくは破壊
  3. アイテムの拾得
  4. ブロックの設置
  5. 箱・炉・作業台の使用
  6. その他(攻撃など)
  7. PCの周囲の数万セルの曖昧な情報

2,3,5,6で全てのアイテムが有限時間で取得可能なことを保証し、
それと2,4を加えて任意の点に任意のブロックを設置可能なことを保証します。

また1について、PCには重力が作用するものの(ほとんどの)ブロックには重力が作用しないというのは極めて重要です。もし重力がないと移動は対称性の高い操作になり、ゲームというよりもカーソルがPCの形をしているマップエディタになってしまいますし、全てのブロックが重力に従うとただのheight mapになってしまって、世界の次元がひとつ落ちてしまいます。*4

7について、これは1-6と違い生身のプレーヤを介してのものです。プログラマブルNPCがどのように行動を決めるのか?というのを考えてみると、7のような情報が必要になることが分かります。もちろん、ここではMinecraft世界では想像もつかないような非常に高度な情報処理が行われているわけです。

そして生命へ…?

さて、これらのことからPCが世界を書き換える速度には上限があるのです。巨大な構造物に張り巡らされたRS回路が見せる変化は時間的には制約されていないものの、空間的にはそれが存在する領域にとどまります。しかし、空間的にも非有界な変化を見せる構造を作りたい!と思ってしまうものです(少なくとも筆者はそうです)。これができれば、自動掘削だとか、成長する建造物だとか、移動する乗り物などが作れる(かもしれない)わけですね。

これには二つの方向性があるでしょう。それは、

  1. 世界のフラット化: 全体をひとつの規則で結合する
  2. 「充分に強力な」要素の導入

ですが、前者は莫大な計算リソースを必要とする上に生身のプレーヤが干渉する術がないので、実質的には2番目のみ可能ということになります。

比較的簡単なルール(いくつかのブロックの追加、など)で「充分に」を実現するのは大変面白い問題です。先ほどのPCの行動一覧で、1-6だけでも複雑なのですが、さらに7を劇的に簡素化して充分な状況判断が出来る必要があります。

3,5辺りに関してはBuildCraftが参考になります。6は既存のブロックでなんとかするとして、1,2,4,7をどうするかが問題になります。10分ほどで思いついたのが、次のような変更です。

  • BuildCraftを前提
  • ブロックを二種類追加
    • ひとつめは「ロボット」ブロック、自然数のパラメータn,mを持ち、RS信号でNPCに変化、nセル移動後(できなければ消滅)目の前のブロックをなんでも取る(とれなければ消滅)、その後mセル移動してブロックを一定の向きにおいて消滅、その他水・溶岩・敵に触れる、長距離の落下で消滅
    • ふたつめは「設定」ブロック、n,mはPCのみ操作できて、RS信号で隣の「ロボット」ブロックに設定を反映

さて、これは小さめの変更ですが、これで「完全性」が達成できるのでしょうか?暇ならば実際にMODを書いてみたいところですねー(書かないフラグ)

*1:ほとんどの部分は長時間変化せず、それ故に大規模な世界をほどほどのハードウェアで実現できるというのも重要な点です

*2:実際の実装がどうなっているかは知りません

*3:壊すことはできますが

*4:もし剛体物理に忠実なシミュレーションだと、何かの下を開ける、というような構造物を作るのに多くの種類の形状が必要となってしまいます。そのような例としてはSource/Garry's modなどが挙げられるでしょうか?