ゲームサーバを介して対戦する2つのエージェントを作成してみましょう.
- Player0とPlayer1がじゃんけんを行います.
- GameServerはPlayer0とPlayer1の手(グー/チョキ/パー)を要求し,勝敗を判定し,結果を通知します.
- GameServer2はユーザからの参加表明を待ちます.
- ユーザはWebUIを用いてPlayer0,Player1に start を送ります.Player0, Player1は参加表明である request-join をGameServer2に送らせます.
- 参加者数が2になったら,GameServer2は それぞれの参加者に request-hand を送りじゃんけんの手を質問します.
- Player0, Player1は 次のいずれかをGameServer2に返信します.
[_p:'hand' show:'rock']
: グー
[_p:'hand' show:'paper']
: パー
[_p:'hand' show:'scissors']
: チョキ
- GameServer2は 勝敗を判定し,次のいずれかをPlayer0, 1に送ります.
[_p:'result' you:'win']
[_p:'result' you:'lose']
class GameServer2 extends TAG {
def players = []
def loop(msg) {
if (msg._p=='request-join') {
players.add(msg._f)
reply(msg, [_p:'acknowledge'])
if (players.size() == 2) {
def replies = request(players, [_p:'request-hand'])
println replies
def hand0 = replies[0].show
def hand1 = replies[1].show
println "0:"+hand0+" 1:"+hand1
}
}
}
}
- 6行:request-join の送信者,つまりゲームの参加者を
players
に追加します.
- 8行: 参加者数が2になったら,
- 9行: request-hand を参加者のすべてに送ります.3.7節のManagerで示したように,
request()
の第1引数にはリストを記述することもできます.
- 11, 12行: 参加者が返信してきた手を
hand0
とhand1
に代入します.
class Player0 extends TAG {
def loop(msg) {
if (msg._p == 'start') {
def ack = request('GameServer2', [_p:'request-join'])
} else if (msg._p == 'request-hand') {
reply(msg, [_p:'hand', show:'rock'])
}
}
}
class Player1 extends TAG {
def loop(msg) {
if (msg._p == 'start') {
def ack = request('GameServer2', [_p:'request-join'])
} else if (msg._p == 'request-hand') {
reply(msg, [_p:'hand', show:'paper'])
}
}
}
- 6行: Player0はrock(グー)を,Player1はpaper(パー)を返信します.
- WebUIを使ってPlayer0, Player1にverに
[_p:'start']
を送信します.WebUIは複数のエージェント名を送信先として指定できます.
- GameServer2は
- 10行で
[[_p:hand, show:paper, _f:Player1], [_p:hand, show:rock, _f:Player0]]
を表示します.
- 13行で
0:paper 1:rock
を表示します.
- 勝敗判定・結果通知は行っていません.
- GameServer2に勝敗判定と結果通知をさせてみましょう.
- Player1の手をランダムに変更できるようにしてみましょう.