4.2 じゃんけん

ゲームサーバを介して対戦する2つのエージェントを作成してみましょう.

概要

%0 GameServer2 GameServer2 Player0 Player0 GameServer2->Player0 request-join, acknowledge GameServer2->Player0 request-hand, hand GameServer2->Player0 result Player1 Player1 GameServer2->Player1 request-join, acknowledge GameServer2->Player1 request-hand, hand GameServer2->Player1 result

メッセージの流れ

useruserPlayer0Player0Player1Player1GameServer2GameServer2startstartparrequest-joinacknowledgerequest-joinacknowledge参加者数=2parrequest-handhand show:rock/paper/scissorsrequest-handhand show:rock/paper/scissors勝敗判定result you:win/loseresult you:win/lose

プログラム

GameManager2.groovy

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
            }
        }
    }
}

Player0.groovy

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'])
        }
    }
}

Player1.groovy

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'])
        }
    }
}

動作方法

課題

  1. GameServer2に勝敗判定と結果通知をさせてみましょう.
  2. Player1の手をランダムに変更できるようにしてみましょう.