Emacs Lispでシューティングゲームを作ってみた

・画面イメージ

|                                        |
|                                        |
|                                        |  score: 25
|                                        |
|    G         GG        GG         G    |
|     F        FF        FF        F     |
|      E      E  E      E  E      E      |
|       D    D    D    D    D    D       |
|        C  C      C  C      C  C        |
|         BB        BB        BB         |
|                                        |
|                                        |
|         ^                              |
|                                        |
|          ^                             |
|                                        |
|                                        |
|                                        |
|                                        |
|           A                            |

・プログラム tinyshoot.el

・使い方 Emacsで、M-x load-fileとして、このプログラムをロードする。


遅い場合は、M-x byte-compile-fileとして、コンパイルされたファイル(tinyshoot.elc)をロードすると多少ましになると思う。

Emacs Lispの練習用に、elispでこういうこともできるんだということを確認する目的で作ったものであり、ゲームとしてきちんと作ってはいない。

これを作るのに使用したEmacsにはCommon Lisp extension(clパッケージ)が組み込まれており、Common Lispかどうかを気にせずにdescribe-functionで出てくる関数を探しながら作っていたため、最初に出来上がったものは別の環境のEmacsでは動かず、かなり手直しをする羽目になってしまった。ここ数日で調べまくって、使えそうだと思った関数の半分くらいはCommon Lispのものだった。特にsetf/incf/decfが素のEmacsで使えないとわかった時は驚いた。Elispを使うには、cons cellやリストの内部構造をよく理解して、setf系の関数が無くてもネストしたリストを自由自在に操作できるべきということか。

一応Lispっぽくなるようにリストを多用してみたが、要領がわからないので、細かい所はBASIC風になってしまった。熟練したLisperならこんなことは絶対しないんだろうな、と思う所がいくつかあるのだが、どう直したら良いのか見当がつかない。
foreachが無い時点で、PerlやPythonのリストに慣れた筆者には十分敷居が高いのだが、その上、Perlのgrep()のようなフィルター関数や、Pythonのzip()のような2つのリストから1つずつペアにして取り出す関数も見当たらないので、要領が全然違う。リストのネスト構造をうまく作って、1つのリスト上でうまいことやってどんな問題でも解決するようなテクニックが必要なのではないかと思った。私にはLispは難解だ。