最中限2.0開発日記

Djangoのテンプレートで「ループの最初だけこれを表示」とかどうするんだろう。selectの最初の項目をselectedにしたい。調べた。

forloop.first 最初のループであれば True になります

http://djangoproject.jp/doc/ja/1.0/ref/templates/builtins.html#ttag-for



サイゼリアに来た。ランチセットを注文すると600円でドリンクバーもついてコーヒー飲み放題。
しかし電波が入りやすいようにしようと思って窓際の席に座ったら明るくてバックライト最大にしないいけないし、あんまり涼しくない。失敗だったかも。

invokeのテスト用のリンク付けた。あとでネットにつないでテストする。



http経由で呼び出されるAIのtypeを"http"にしていたけど、能動的(active)に自分からhttpでAPIを叩きにくるAIもいるわけなのでactive/passiveという切り分けにしよう。


え、なに、都内の窓際の席なのに搬送派が見つからない?なんだってー。


他のサーバで動いているAIを叩くテスト、うまく動いた

  • □ デフォルトアカウントをtype=activeにする

なんかクラブのクイーンを出し続けている…
伏せカードをめくった時点で手札から減らしていたのをやめたので代わりに伏せた時点で手札から減らしたり、手札になかったらキャンセルしたりするようにしなければ。


http://www.nishiohirokazu.org/cgi-bin/saichugen_cgi.pyに置いた大きい順に出すAIがちゃんと動くようになった。


ふう。実際にやってみないと色々わからないことは多いもんだな。プロトコルを決める段階では区切り文字にセミコロンを使えないことを知らなかったしな。これでとりあえずドキュメントを整備すればゴールのうちの2つは達成か。

  • ゴール: 人間が第三者または第三者の登録したAIと戦える
    • ■ 別サーバ(nishiotools.appspot.com)で走っているランダムAIを叩けるかテスト
    • CGIで適当な(大きい順に出す?)AIを作ってwww.nishiohirokazu.orgに置いて、それとの対戦がうまく動くことを確認する
      • このサンプルはドキュメントに載せる
  • ゴール: 管理者権限のない人がAIを登録できる
    • ■ ユーザ追加フォームでpassiveを選択できないのでtypeがNoneになってしまっているのを直す
    • □ 手順を書いたドキュメントとサンプル

ちなみにサンプルのCGI。手札を大きい順に出すだけだけど。

#!/usr/bin/env python

import cgi
import cgitb
cgitb.enable()
print "Content-Type: text/html"
print
form = cgi.FieldStorage()
query = form["query"].value
if query == "available":
    print "OK"
elif query == "play":
    hand = [
        int(item) 
        for item in form["hand"].value.split(",")]
    played = form["played"].value.split(".")
    if played[0] == "":
        played_cards = [[], [], []]
    else:
        played_cards = [
            [int(item) for item in packed_cards.split(",")]
            for packed_cards in played]
    seat_id = form["seat_id"].value
    hand.sort()
    print hand[-1] # return largest item
    print played_cards
else:
    print "Saichugen Sample AI"

とりあえず一段落ということで少し散歩をしよう。

あとこれDjangoで書かれた手札をランダムに選択して返すボットのコード:

def handler_random(request):
    "ランダムにプレイするpassive botのサンプル"
    from django.http import HttpResponse
    from random import choice
    GET = request.GET
    query = GET["query"]
    if query == "avaliable":
        return HttpResponse("OK")

    hand = GET["hand"].split(",")
    return HttpResponse(choice(hand))


どうしてこういう設計か、だとかのお題目はさておき、最中限2.0サーバにログインして対人戦や外部サーバのAIとの勝負をする流れとか、自分で作ったAIを登録する流れとかを一通り試してみてつまずきどころがないかをチェックするのが優先だな。あとnishiotoolsで公開するのかsaichugen-onlineで公開するのか、も考えないと。


ご飯を食べて息抜きをして眠くなってきた。やることやらねば。


  • ■自分以外のところに座れないようにする
  • ■教えてもらった他人がログインしていなかったときはログインしてもらわないといけないね。明日修正する。
  • ■ 今までに出されたカードの履歴が出た方がいいよね、明日作る

よし。

明日のタスク:

  • □ ドキュメントを書く
  • □ Finishedになったらスコアとか勝敗とかを表示する
  • □ 終了したゲームの一覧をどこかに出す
  • □ 終わったゲームの観戦用表示
  • □ 未ログインのアカウントでログイン→その後どうしていいかわからないよね。名前の設定が必要
  • □ ラウンド終了時に真ん中以外の人がカードを裏向けるのを実装していない
  • □ 進行中のゲームの公開情報を表示する