Daydreaming in Brookline, MA

DL-13; サーバー&クライアント

1 はじめに

Rogue+Wizライクなゲーム(DL - Daemon Lord)を作るプロジェクトの13回目です。

githubでコードを 公開 しています。MacとLinuxで動作確認していますが、Windowsは未検証です。(いちおうWindows用のコードは入れてみました。Macは立ち上げ確認くらい。。)

2 クライアント&サーバー

前回、次回作の予告らしきものをしましたが、次回作ではなく今作の延長線上でクライアント&サーバー化にトライしています。サーバーは別レポジトリに分けています。

予告通りサーバーはasync対応しました。asyncプログラミングは初めてです。ライブラリは長考の結果、python-socketioを使うことにしました。これはシンプルなパッケージですが、DLの用途では必要十分であると感じました。

とりあえず現在できることは、

  • 複数クライアントのサーバー接続(localhostのみ確認)
  • ダンジョンマップ上でメッセージ送付、リアルタイム受信
  • サーバーでのフロアマップ生成&同じルーム参加者(チーム)とのマップ共有
  • マップ上で他の参加者の移動状況をリアルタイムに見られる
  • サーバー接続ダンジョン内でのセーブ&ロード

といったところで、ごくprimitiveなことしかできません。それでも、同じチームとしてログインしている他のユーザーの動きがマップ上に見られたり、メッセージをリアルタイムに送受信できるだけで結構楽しいです。

今後エンハンス予定(取らぬ狸の皮算用ですが。。。)なのは、

  • 他参加者のモンスターとのバトルへのjoin
  • サーバー独自モンスターの追加
  • 他参加者との共同キャンプ
  • 共同キャンプでのアイテム受け渡し/売買
  • 共同キャンプでの相手パーティメンバーの回復魔法、アイテム使用
  • インターネット対応
    • username & passwordを使った認証
    • ユーザー登録(flask使うべきだったのかな。。)
    • https対応(できるのかなぁ)
  • サーバーのDB対応(サーバーリブートで情報が失われないようにする)

3 Pythonのお勉強

3.1 List comprehension

DLのプログラミングで一番楽しいのは、list/dictionary comprehensionやgenerator expressionを考えて工夫している時です。Python初級者を卒業した気になるし、パズル みたいで本当に楽しいです。

3.2 SQLAlchemy

前回の更新から使い始めたSQLAlchemyですが、今回またもや衝撃的な学びがありました。 なんと、既存テーブルへのカラムの追加はSQLAlchemyでサポートされていないのでした。 えー。そんなのあり? DBの基本機能だと思うのですが。。。これができないとなると、 ORMのお気楽さがものすごく中途半端に感じます。テーブル設計だけは事前にかっちりやって おかないといけないなら、そもそも軟弱なORMなど使わないのでは。。。(個人の感想です)

3.3 asyncプログラミング

最近流行のasyncですが、いろいろ調べたところ、これにはasyncio派とgreenlet派がある ことがわかりました。前者は明示的にasync def, awaitといったキーワードを使って 意識的にasyncとそうでない部分を使い分ける必要があり、後者は既存の書き方で作った プログラムを(半ば無理矢理)async化してくれるというもののようでした。

ぱっと見では後者の方が良さそうですが、async化を隠蔽して実施する後者はデバッグが より大変そうです。うまく動かない時には、実際にはどう動いているのかを見なければ ならないので、結局、隠蔽されている部分がどうなっているのかを正しく理解していなくては ならず、それならば明示的にコード上でasyncなのかそうでないのかを判別出来る方が 単純です。そんなわけで、最初はすごく良さそうに見えたgreenletは見送ることにしました。

SQLAlchemyのORMと同様に、複雑な部分を隠蔽してくれるのはありがたいのですが、いざ デバッグしなくてはならなくなると、一見面倒な細かい部分まで隠蔽せずにオープンにして くれた方が実は楽だったりするのですね。

まあ、このあたりは好みの問題という気がします。私は元々がアセンブラプログラマー (アマチュア)だったので、細かいところまで何でも理解しておきたい傾向があるようです。

3.4 Python-socketio

このパッケージはすごいです。独立したチュートリアルが必要ないくらいシンプルかつ、 必要十分な機能が備わっていて、とても使いやすいです。クライアントサーバーの システムがここまで簡単に実現できるとは思いませんでした。比較的低レベルな関数の 集合ですが、そこも気に入っています。

作者のMiguel Grinbergという人はただ者ではないです。弟子入りしたいくらい。 どうやらgreenlet推しのようですが、そこだけは賛同できません。。。笑

4 次は、、、

今回いろいろ変えすぎて、プログラムがすっかり不安定になってしまっているので、 しばらくはエンハンスしつつ安定化に努めたいと思います。

実は、まだ致命的なバグが残っていてアップロードできずにいます。。。今週末中に 取れるかなぁ。