Haskellでシューティングゲームを作ったまとめ

ゲーム製作者コミュニティ in 札幌の春のシューティング祭りプロジェクトで一ヶ月ほどかけて簡単なシューティングを作りました。
Windowsバイナリは紹介ページ、ソースはHackageから落とせます。ビルドにはSDLが必要です。また、絵と音楽はそれぞれコミュニティのぐぐぐさん、RE-Ya!@D.J.無理王さんに頼みました。


感想

まず、全体的にバグはほとんど出ませんでした。唯一ハマったのはIntのオーバーフローぐらいで、それもSDLとのやり取りのためにIntを使っているので仕方ないかな、という感じです。

IOもそれほど障害にはなりませんでした。面倒なのは事実ですが、do記法を使えば簡単に処理できるのですぐに慣れることが出来ました。ただ、始めは非IO関数として定義しようと思っていたものを、乱数を使いたいとかいう雑多な理由で後からしぶしぶIOにするというケースは結構ありました。

一番困ったのは、テトリスの方も書かれていますが、フィールドラベルが関数としてグローバルに出てしまうことでした。後から見ると実際に衝突しそうなのはそれほど多くないにも関わらず、衝突への恐怖や関数名の一貫性のために、フィールド名が不必要に長くなってしまいました。フィールド名に限らず、Haskellではモジュール単位でしか見せる・見せないを決められないので、全般的にスコープが大きすぎるということが多いように思いました。

このあたりのことを考えると、オブジェクト指向言語のクラスが関数に適当なスコープを与えるために存在するように思えてくるほどで、少し違いますがF#のパイプ演算子なんかも(自分で定義すれば作れますが)なかなか羨ましいと思いました。

今回はしなかったこと

起動画面やゲーム画面は型クラスに出来そうでしたが、気づいたときにはほぼ完成していたので結局しませんでした。また、ゲームのリソースなどはモナドとかに出来そうな気がしましたが、相当難しそうだったのでしていません。

まとめ

Haskellを使うことの一番の利点は、IOなどを除いて状態が無いためにバグが少なくなることだと思います。特に、変数への再代入が無いことでプログラムの見通しがとても良くなります。
RubyPythonには関数型言語の要素がたくさん入っていますが、mapや内包表記だけではなく、もっと定数を積極的に使ってみるのも実践的でいいかもしれません。