Nimで簡単なゲームを作った

最近Nimでインタプリタを作っているのですが、如何せんNim流の書き方に慣れていないようで、度々がっつり詰まってしまいます。

ですので、一度Nimっぽい書き方を学んでみようと思い、2日くらいでできるプロジェクトを探してみました。

すると、POSTDにNimでゲームを作る記事があったのでこれを試してみました。

成果物

完成品はこちらにあります。

【参考】mrsekut/nim_platform_game – github

概要

このゲームはNimで書かれたSDL2というクロスプラットフォーム向けのマルチメディアライブリを使って書いています。

ゲームはとても簡単なもので、表示されたキャラクターをキーボード操作で右側にあるゴールへ向かって進めるものです。

それまでにかかった時間と、ベストタイムも表示されます。

環境構築

環境構築がちょっと大変だったのでそこだけメモ。

homebrewでゲーム関係のライブラリをを入れる。
$ brew install sdl2 sdl2_image sdl2_ttf

Nimのプロジェクトを作成する。$ mkdir nim_platform_game

$ nimble install

依存するパッケージをインストール
$ nimble install sdl2 strfmt

実行

ディレクトリ構成に気をつけて、プロジェクトルートで以下を実行

$ nim -r c nim_platform_game.nim

注意点

全体的に記事通りに進めれば良いのですが、一つだけ注意する箇所があります。

あまりsdl2のことをしらないけど、記事中の「1.最初の動くプログラム」を書き終わった時点では画面は表示されませんでした。

「2.ユーザ入力」までやり終えて、コンパイルし実行したら青いスクリーンが起動しました。

Nimとしての気付き

  • 列挙型と構造体の使い方
  • result句を多用する
    • 構造体のコンストラクタでもnew resultのようにしてインスタンスを生成する
    • 基本的にreturn句は使わない
  • Nimは関数呼び出し時に色々な書き方できるが、
    • hoge(piyo)や、piyo.hoge()だったりhoge piyoだったり、どういう基準で書き分けているのかがわからない
  • forward declarationsで最初に関数を定義して置くと定義した順番に依らずに使うことができる
  • プラグマ
    • pure
    • discardable
    • global
  • notin
  • 関数のオーバーライド

最後に

本当は、マップを拡張したり、プレイするキャラを選択できる機能を追加したりなどのオリジナリティを入れても良かったのですが、それよりもインタプリタを作りたかったので、ここで中断しました。

NimはGoやRustと同じように、構造体を作ってそこにメソッドを生やしていく書き方をしていきます。

Rustの場合はimplで括るのでまだ見やすいのですが、NimやGoはメソッドの定義が散らばってしまうのでちょっと見づらいなという気がしています。

Nimでゲームを作るなんて割とニッチなとこだと思うのですが、それを翻訳して掲載してくれてるPOSTDにとても感謝です。

参考