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

bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Yampaでゲームを定式化する―概略

1.懐かしいパックマン

Yampaを用いてのゲームの作成方法は、Gerold Meisinger (University of Applied Sciences Upper Austria) の学位論文「Game-Engine-Architektur mit funktional-reaktiver Programmierung in Haskell/Yampa」やそれに関連する学会論文での資料に分かりやすく紹介されている。ここでは、そこで用いられた図を引用して説明する。彼の論文ではパックマンが使われているので、まず、簡単にパックマンの説明から始める(パックマンの動作を知りたい場合には、動画を見るとよい)。
f:id:bitterharvest:20141102101540p:plain

パックマンナムコが1980年に発表したゲームである。当時、最も流行っていたゲームはスペースインベーダーなど戦争を中心としたゲームであった。このため、ゲームセンターは殺伐としており、女性は入りづらい環境であった。そのような状況を打破するために、キャラクタに明確な性格を持たせて女性でも遊びやすいゲームをということで開発されたのがこのパックマンである。

主役はもちろんパックマン。プレイヤーは4方向レバーを用いてパックマンを動かし、迷路に置かれたドットをたくさん食べようとする。これを阻止しようとするのが4匹のモンスターである(モンスターはそれぞれ異なる性格を持っているがここでは説明しない)。モンスターとパックマンが衝突するとパックマンは消失する。但し、パワー餌を食べた後一定時間は、力関係が逆転しパックマンがモンスターを食べることができる。但し、モンスターは不死身で食べられた後もまた出現する。また、これまでの成果に応じてモンスターの巣の下にフルーツが出現する。得点が少ないときはサクランボであるが、得点が上がるにしたがって、イチゴ、ミカン、リンゴへと変わる。

2.パックマンを定式化する

パックマンでの登場者であるパックマン、モンスター、フルーツ(図ではさくらんぼのみ)をオブジェクトとする。また、入力をレバー、衝突などとする。オブジェクトはこれらの入力を受けて変化するが、その関係は、pSwitchで表すことができる。もう少し分かりやすく説明したMeisinger作成の図が次である。
f:id:bitterharvest:20141102101814p:plain

ゲームプログラムの定式化はオブジェクトの振舞いを論理的に示すことであるが、その第一歩は、オブジェクトと入力とを関連づけることである。関連付けることでオブジェクトの振舞いを定式化できるようになる。

オブジェクトと入力を関連づけ、その後の振舞いの様子を示したのが次のMeisinger作成の図である。
f:id:bitterharvest:20141102101832p:plain

この図で、コアーは入力ごとにどのような処理が行われるかを示したものである。\(coreA_0\)は初期入力を扱う。\(coreA_1\)はレバーの入力を扱う。\(coreA_2\)は衝突を扱う(inputの後が[ ] となっているがこれは誤りで、稲妻のような衝突のマークが正しい)。\(coreA_3\)はイベントなしを扱う。

コアの最初の関数はルート(route)となっているが、これは先に説明したpSwitchである。この関数から入力とオブジェクトの対のリストを得る。青のボックスで表された信号関数は、入力とオブジェクトの対のリストから、オブジェクトの次の状態を得る。次の状態には、パックマンが消失したり、モンスターが消失したり、ゲームそのものが終了したりということが含まれる。これらの処理を行うのが関数killAndSpawnである。次の状態は出力に渡され、画面には新しい状態が表示される。

上記の処理をフローチャートで示したのがMeisinger作成の下図である。
f:id:bitterharvest:20141102101909p:plain