最中限2.0開発日記

集中力が切れた。集中力の持続時間が短いなぁ。



3人着席して3人分のカードが表示されるところまでできた。

カードをクリックしたときにカードを出すAPIが叩かれるべき

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

APIまわりは一応一通り実装してあるのか>過去の自分



手札のレンダリングに、カスタムタグでseat.handからレンダリングしていて、リンクを張るのにそれじゃ情報が足りないからfilter使おうとしたり、紆余曲折した。結局、カスタムタグにリンク先を作るのに必要な情報を全部渡した。

@register.simple_tag
def render_hands(hands, seat_id, key):
    ...
    for c in hands:
        url = reverse(api_views.play_html, args=[c, seat_id, key])
        ...

なんだ、簡単じゃん。



最初使い始めたときreverseとカスタムタグは色々混乱したけど、使い慣れてくるとこれなしで書くのは辛いというのがわかってくるような気がした。
reverseなしでは自分でどのビューがどのURLにマップされているかを管理して、URL変更時には大量の修正をすることが必要になる。
カスタムタグ無しではテンプレートで無理矢理複雑な内容をレンダリングしようとして汚くなる。

ackは便利

カードをクリックしたときにplayAPIが叩かれるようになった。

  • ■(必須ではない)きれいな折りたたみ表示
  • ■いま誰がカードを伏せていて誰がカードを伏せていないかの表示
  • □(必須ではない)カードのレンダリングの部分で高さを5emと決め打ちしているのを直す
  • ■3人のカードがそろったときにターンを進める処理



カードを伏せた時点で手札が減るのではなく、伏せカードがそろった時点で減っていた。カードを伏せたのにそれがまだ手元にあるのは不自然。修正。
む、なんか出したカードじゃないカードが出ている。

play = s.closed_card
if play not in s.hand:
    from random import choice
    play = choice(s.hand)
s.hand.remove(play)

あっ。手札にないカードを伏せた時点で怒るんじゃなくて、手札にないカードで勝負をしたときに怒るようになっていて(AIがAPI経由でプレイをするときにはそれが自然に思えた)そして人間がプレイするときに自然なように手札から伏せた時点で手札から削除するようにしたから常に「手札にないカードで勝負している」ってことになっていた。



ターンは正しく進むようになった。最後の勝負のときに出されたカードが表示されていないのでわかりにくいが、まあとりあえず昨日の夜に書いたTODOは全部クリアした。

タスクをリストアップする。

  • ■ 伏せたカードをオープンした結果を表示する
  • □ (必須ではない)現在のラウンドスコアとゲーム全体でのスコアを表示する
  • □ ゲーム開始画面でランダムAIを選んでプレイ
  • □ ゲームを最後まで進めてきちんと勝敗の判定が行われることを確認する
    • されてない
  • □ 実サーバで実ユーザデータを使ってテスト
  • CGIで適当な(大きい順に出す?)AIを作ってwww.nishiohirokazu.orgに置いてうまく動くことを確認する
  • □ ドキュメントを書く
  • □ (必須ではない)Ver1の勝敗情報を引き継ぐ



3時間くらいバックライト明るめで作業をしたらバッテリーがなくなった。バッテリーを長持ちさせるには暗いカフェを探すことが重要だ。

  • ■ゲームが終了していたらseatで手札を表示しない(代わりに残りカードを表示)
    • 終了していたらseatはgameへのリダイレクトでいいのか?いや、中央が自分ってのが変わると混乱するのでこのままでいい

game.is_finishedを作った


  • プレイヤーのtypeがpassiveだったらプレイ可能になったときに通知しないといけない
    • プレイ可能になったタイミングとは
      • 3人そろってカードが配られた直後
      • 3人の伏せカードがそろって次のターンに進んだタイミング

自分が前に書いたSeat#invokeを見てみると、entrypointがhttp://で始まるかどうかを
外部サーバのAIであるかどうかを判定するのに使っている。
それでいいのか?それでいいか。



invokeでplayerのtypeがinternalでもpassive(http)でもない場合にNotImplementedErrorを投げるようになっているけどこれだとinvokeの外でinvokeを叩くべきタイプかどうかの判定をしてから叩かないといけないからよくない

3人目が着席したときにinvokeを叩くようにした。

むう、タイムアウトでこけた。あ、あれか、SDKでリクエストの処理中に自分に対してリクエストを投げるとブロッキングしてしまうんだっけ?とりあえず現状まででデプロイしてそれを叩きに行くか。



こんなこともあろうかと(違う)組み込みのAIもあるんだった。internalのrandomAIを2人対戦相手に指定してプレイ。ちゃんと最後まで行った。終わったらFinished Gameって出るようになった。

  • □ Finishedになったらスコアとか勝敗とかを表示する
  • □ (重要ではない)AIを2つ選んでプレイするショートカットを作る
  • □ AIがたくさんになるとドロップダウンで選ぶのはうざい。
  • □ 終わったゲームの観戦用表示
  • history



集中力が切れて頭が混乱してきたのでタスクを整理して優先度付けをする

集中力が切れたのは眠い体ということに気がついた。
ドキュメント作りのことを考えると明日中には仕様が完全に固定して、「このAPIを使えばAIが作れます」ってドキュメントを書ける状態にならないといけないのでタイムリミットは8時間くらいかなぁ。