4.1 数当てゲーム

ゲームサーバに参加表明し,ゲームサーバからの問い合わせに答えるプログラムを作成してみましょう.

概要

%0 Player Player GameServer GameServer Player->GameServer request-join, acknowledge Player->GameServer request-answer GameServer->Player hit, too-large, too-small

メッセージの流れ

useruserGameServerGameServerrequest-join乱数生成acknowledge推測request-answerhit / too-large / too-small

プログラム

GameManager.groovy

class GameServer extends TAG {
    def answers = [:] // 空のマップ キーは参加したエージェント名 値は?

    def loop(msg) {
        println msg
        if (msg._p=='request-join') {
            def number = (int)(Math.random()*100) // 0~99のランダムな整数
            answers[msg._f] = [ans:number, list:[]]
            println answers // テストのために表示してみる
            reply(msg, [_p:'acknowledge'])
        }
        if (msg._p=='request-answer') {
            def map = answers[msg._f]
            def ans = map.ans
            def list = map.list
            def n = msg.guess
            list.add(n)
            println answers // テストのために表示してみる
            if (n==ans) {
                reply(msg, [_p:'hit', answer:ans, list:list])
            } else if (n>ans) {
                reply(msg, [_p:'too-large', list:list])
            } else {
                reply(msg, [_p:'too-small', list:list])
            }
        }
    }
}

動作方法

課題

  1. hit が返るまで,WebUIを使ってGameServerに request-answer を送ってみましょう.
  2. answersに格納される値の意味を考えてみましょう.
    • answersはマップ形式のデータが入ります.
    • キーは参加表明したエージェント名です.
    • 値は何が入るでしょうか?
  3. あなたの代わりにGameServerで(一度だけ)ゲームを行うPlayerエージェントを作成してみましょう.

useruserPlayerPlayerGameServerGameServerstartrequest-join乱数生成acknowledge推測request-answerhit / too-large / too-small

  1. 一度だけではなく, hit が返るまで繰り返しゲームを行うエージェントを作成してみましょう.

Groovy文法情報

リストとマップについて:

def list = [] // 空のリスト
list.add(1)
list.add(2)
println list // [1, 2]
println list[1] // 2
def map = [:] // 空のマップ
map[1] = 'いち'
map[2] = 'に'
map['three'] = 'さん'
map.four = 'よん'
println map // [1:いち, 2:に, three:さん, four:よん]
println map[2] // に
println map.three // さん

Groovy Web Consoleで試してみましょう.