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

レガシーコード生産ガイド

私に教えられることなら

ClojureScriptでローグライクを作る 2

進捗と、いくつか考えがあるので記録しておく。

masterブランチに敵がプレイヤーを追跡・行動(コンソールにメッセージ)を実装したんだけど、凄まじく重い。Chromeでプロファイル取ってみると、reduceが何重にもなってやたら時間がかかっている。

フロアを二次元のvecで使ってるんだけど、どこかの時点でシーケンスになってしまい、assocやassoc-inで数字をキーに取れなくなる。なので(vec (map vec floor))をいちいちかけてたのが流石にボトルネックになったみたいだ。

というわけでClojureでの二次元配列に関する議論を参考に、座標[x y]をキーにしたマップを使ってみた

まだ敵の追跡ルーチンがおかしくなったままだけど、速度はマシになったみたいだ。視界を切り出すときに二次元シーケンスじゃないと難しいので変換してるんだけど、そこが次はボトルネックになってそう。上手いやり方を考えないとだ。

イミュータブルな値への関数適用と、オブジェクト同士のメッセージング

既にまたコードが混乱しつつあって結構キツい。一つの大きなgameステートを更新していくスタイルは、現状の自分のやり方だと参照の書き換えを遠回しにやってるだけ、に思えてきた。更新されたentityを指すようにgameステートを更新するのを忘れたり、参照を直接書き換えるのに比べてデメリットが目立っている。

ミュータブルなステートに依存しないことでテストがやりやすくなるかもと思ってたけど、結局大きなgameステートを用意するのが面倒で書かなくなってしまった。

ゲームみたいに互いが影響し合う複雑な状態を、参照を書き換えずに管理する場合、どういうやり方がいいのかちょっといろんなソース見て考えてみよう。LambdaHackがそこそこ複雑な状況を参照を書き換えずに実現してるっぽい……かな?Haskellのソース読めるか謎だけど構造だけでも把握したい。

それとたまに休憩しつつ考えてたんだけど

  • ローグライクみたいなのはSmalltalkみたいなメッセージングで書いたほうが楽しそう
  • やっぱりクラスみたいな分類が強制されてると整理が楽そう
  • 動いてる最中のオブジェクトをインスペクトできたりすると楽で楽しそう
  • コードとファイルの結びつきから一旦離れて、コンパイルされた関数やオブジェクトそのものを触るイメージで作ってみたい

などなどを実現できそうな、SmalltalkとかCLOS/Common Lispでも並行して書いてみたくなった。今の理想はSmalltalkの環境にLispなんだけど……Interlispだっけ、そういう雰囲気の環境まだあるんだろうか。目玉飛び出るほど高かったりしなければ試してみたい気もする。

Clojureでも諦めずに細細とでも関数適用スタイルを続けていこう。何か打開策ありそうな気もするんだよな。モナドとかかな(よくわかってない)。

広告を非表示にする