最中限2.0開発日記

あと1週間で対戦ができるフレームワークにする

  • ゴール:
    • 人間が第三者または第三者の登録したAIと戦える
    • 管理者権限のない人がAIを登録できる
    • AI同士の勝負をマッチングできる

処理の流れ

自分が完全に忘れているので追うところから。


start_gameする→HTMLなら/gameにリダイレクト



(r'^api/(?P<format>text|json|html)/start_game/$', 'start_game'),

にurlタグで渡る方法がわからなかった(引数に'html'を指定してエラー) APIがRESTっぽいことは最重要ではないので?format=htmlにした



apiのビューはapi_views.pyにわけていた、忘れていた。viewsにstart_gameがないぞとか思った。urls.pyにちゃんと書いてあったのに。

POST start_gameだったのだけどGETに変えた。リンクでスタートしたいし。新しくスタートしたゲームのIDを返す。

return HttpResponseRedirect(reverse(views.game, (game_id,)))
__import__() argument 1 must be string, not tuple

reverseの使い方が正しくないのか。
■後で調べる
調べた

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)

argsをつける必要があった。あと最初[game_id]にしていてunhashableと怒られたのでタプルにしたのだけど、そもそも引数を間違えていただけだったのでこれでOK

return HttpResponseRedirect(reverse(views.game, args=[game_id]))

期待通りにリダイレクトされるようになった。


http://localhost:8080/saichugen/api/start_game/?format=text
game_89e9e218f919a85cae33e8026fdd518bが返ってきた
期待通り


手動でリダイレクトしてみた。'NoneType' object has no attribute 'played'

ゲームを作成してまだ誰も着席していない&カードも配られていない状態で配られたカードを表示しようとしているな。3人そろうまでは別の画面を出そう。

TemplateDoesNotExist at /saichugen/game/game_89e9e218f919a85cae33e8026fdd518b/
saichugen/gam_waiting_participants.html
想定された挙動。まだテンプレート作ってないからね。



add computer players

  • □ addできるコンピュータプレイヤーの一覧
    • どうする?
    • 全体からplayerの一覧を取得してpassiveなものを選択する?
      • このとき最後にいつenabled/disabledを返したかを表示
  • ■ 自分のjoinできるプレイヤーの一覧



あれ、Model.objects.all()じゃなくてModel.all()だっけ。


  • Playerのtypeってどういう値だっけ
    • なんでmodels.pyのPlayerクラスのドキュメントに書いてないんだよ自分爆発しろ



バッテリーがなくなるまであと2時間。
ぷち締め切りまでにやるべきことは何か。

  • AIを混ぜた勝負はテストが面倒なのでまずは対人戦ができるようにして自分で操作して最後まで流れテスト
  • 2時間ではできない気がするが
    • ■ 別のプレイヤーがjoinできるかテスト
    • ■ 3人そろったときにゲームを開始



joinのAPIはこういう設計にしていたけど

(r'^api/(?P<format>text|json|html)/join/(?P<game_id>.*)/(?P<player_id>.*)/$', 'join'),

とりあえず

(r'^api/html/join/$', 'join_html'),

を追加してフォームからのPOSTを受け付けるようにする。これがapi/以下にあって、api_views.pyの中で定義されるRATIONALEはviews.pyが全般的な表示のためのビューでapi_views.pyがAPIのためのビューであるならプレイヤーを参加させて表示用のURLにリダイレクトするだけのビューはapi_views.pyにいれるべきだから

リストを表示して選択させるフォームの書き方がわからん。電波がないので後で調べる。

□ リストからプレイヤーを選択できるようにする

とりあえず決め打ちにして先に進む



2人が着席中に2人いることが見えるようになった。3人目を着席させると3人そろった後の画面が出るようになった。
カードが配られているのが見えてほしいけど見えていない
templatetagsで実装したはずだ

カードが配られていないな。

いや、カードは配られていて{{ game.seat_set.0 }}で特定のシートを確認するとちゃんと配られているが
{{ game.get_played }}では配られていないように見える。

いや、これで正しい挙動か。playedはプレイヤーが場に出したカードであってゲームの最初には空っぽで正しい。

この勘違いを再発させないためには何が必要なのか?

思いつかないのでスルー。



とりあえず決めうちで座席へのリンクを張った
□ 3人分にする

The view saichugen.views.seat didn't return an HttpResponse object.
想像通り未実装だった。
えーと、プレイ中画面で表示されるべきものは…これはversion 1.0を参考にすればいいか。



seat.handの表示完了
□ リンクを張ってクリックしてカードを出せるようにする
□ カードの間隔が決めうちで30pxなのをくくりだす

次は何ができないといけないか。
□ カードをクリックしたらそのカードを伏せて出す
□ 現在伏せられているカードの存在が表示されるべき
□ 3枚伏せられたらターンを進める

18:30か。おなかがすいてきたな。コミットログによれば17:02に「ゲームがまだ始まっていないときの画面」のテンプレートをコミットしているからもうそれから1:30経っているのだけどバッテリーはまだ1:50残っていて、コミットより前の作業を開始した時点でのバッテリー残量は2:30だった。ふうむ、MacBookはバッテリーを少なめに申告するのか?食事をしてからもう1〜2時間作業できるなぁ。



今日のところは、明日するべきことをリストアップして終わりにしよう。
きれいさっぱり構造とかどこまでできているかを忘れている状態だったのでスタートに手間取ったが、明日はもうちょっと生産的に活動できるだろう、そう期待したい。

  • game
    • □ リストからjoinするプレイヤーを選択できるようにする
      • select, option
    • □ とりあえず決めうちで座席へのリンクを張った,3人分にする
  • seat
    • □ seat.handの表示からリンクを張ってクリックしてカードを出せるようにする
      • □ カードをクリックしたらそのカードを伏せて出す
      • □ 現在伏せられているカードの存在が表示されるべき
      • □ 3枚伏せられたらターンを進める
    • □ (重要でない)カードの間隔が決めうちで30pxなのをくくりだす