ゲームサーバに参加表明し,ゲームサーバからの問い合わせに答えるプログラムを作成してみましょう.
- 数当てゲームを行います.
- GameServerは0~99の整数をランダムに生成し,答えとして保持しています.
- Playerは整数を推測し,その数を当てようとします.
- GameServerはユーザからの参加表明を待ちます.
- ユーザはWebUIを用いてGameServerに request-join を送り参加表明をします.
- GameServerは 0~99の整数をランダムに生成し,acknowledge を返信します.
- ユーザはGameServerの生成した整数を推測し, request-answer を送信して回答を要求します.
- GameServerは
- 推測が当たった場合,hit を返信します.
- 推測が大きい場合,too-large を返信します.
- 推測が小さい場合,too-small を返信します.
class GameServer extends TAG {
def answers = [:]
def loop(msg) {
println msg
if (msg._p=='request-join') {
def number = (int)(Math.random()*100)
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])
}
}
}
}
- 7行:0~99のランダムな整数を生成し,
number
に格納します
- WebUIを使ってGameServerに
[_p:'request-join']
を送信し,ゲームへの参加表明をします.WebUIを用いる場合はメッセージの送信者はuserとなるので,参加者名はuserです.
- GameServerは参加者userのために0~99の整数をランダムに生成します.生成後に
[_p:'acknowledge']
を返信し,準備が完了したことを通知します.
- WebUIを使ってGameServerに
[_p:'request-answer' guess:20]
と送信してみます.20は推測した数です.
- GameServerは request-answer を受け取ると,予想された数と自分が生成したランダムな数を比較し,hit,too-large,too-small のいずれかを返信します.
- hit が返るまで,WebUIを使ってGameServerに request-answer を送ってみましょう.
answers
に格納される値の意味を考えてみましょう.
answers
はマップ形式のデータが入ります.
- キーは参加表明したエージェント名です.
- 値は何が入るでしょうか?
- あなたの代わりにGameServerで(一度だけ)ゲームを行うPlayerエージェントを作成してみましょう.
- GameServerはPlayerからの参加表明を待ちます.
- Playerはユーザから start を受け取ると,GameServerに request-join を送り参加表明をします.
- GameServerは 0~99の整数をランダムに生成し,acknowledge を返信します.
- PlyerはGameServerの生成した整数を予想し, request-answer を送信して回答を要求します.
- GameServerは
- 予想が当たった場合,hit を返信します.
- 予想が大きい場合,too-large を返信します.
- 予想が小さい場合,too-small を返信します.
- 一度だけではなく, hit が返るまで繰り返しゲームを行うエージェントを作成してみましょう.
リストとマップについて:
def list = []
list.add(1)
list.add(2)
println list
println list[1]
def map = [:]
map[1] = 'いち'
map[2] = 'に'
map['three'] = 'さん'
map.four = 'よん'
println map
println map[2]
println map.three
Groovy Web Consoleで試してみましょう.