4.3 連続じゃんけん

連続してじゃんけんを行い,その結果を保存する方法を考えてみましょう.

概要

%0 GameServer3 GameServer3 Player2 Player2 GameServer3->Player2 request-join, acknowledge GameServer3->Player2 request-hand, hand GameServer3->Player2 result Player3 Player3 GameServer3->Player3 request-join, acknowledge GameServer3->Player3 request-hand, hand GameServer3->Player3 result

メッセージの流れ

useruserPlayer2Player2Player3Player3GameServer3GameServer3startstartparrequest-joinacknowledgerequest-joinacknowledge参加者数=2loop[10 times]parrequest-hand loop:lhand show:rock/paper/scissorsrequest-hand loop:lhand show:rock/paper/scissors勝敗判定, 記録result win:n lose:mresult win:n lose:m

プログラム

GameManager3.groovy

class GameServer3 extends TAG {
    def players = [] // 参加者のリスト
    def winlist = [] // n番目の要素はn回目の勝利者の名前, 引き分けの場合は""

    def loop(msg) {
        if (msg._p=='request-join') {
            players.add(msg._f)
            reply(msg, [_p:'acknowledge'])
            if (players.size() == 2) {
                winlist = []
                repeat10()
                def win0 = winlist.count{it == players[0]} // players[0]の勝利数
                def win1 = winlist.count{it == players[1]} // players[1]の勝利数
                send(players[0], [_p:'result', win:win0, lose:win1])
                send(players[1], [_p:'result', win:win1, lose:win0])
                players = []
            }
        }
    }

    def repeat10() {
        for (i in 0..9) {
            def replies = request(players, [_p:'request-hand', loop:i])
            println replies
            def hand0 = replies[0].show
            def hand1 = replies[1].show
            println "0:"+hand0+" 1:"+hand1
            def winner = players[0] // 勝者をwinnerに格納する
            winlist.add(winner) // 勝者リストにwinnerを追加する
        }
    }
}

Player2.groovy

class Player2 extends TAG {
    def loop(msg) {
        if (msg._p == 'start') {
            def ack = request('GameServer3', [_p:'request-join'])
        } else if (msg._p == 'request-hand') {
            reply(msg, [_p:'hand', show:'rock'])
        }
    }
}

Player3.groovy

class Player3 extends TAG {
    def loop(msg) {
        if (msg._p == 'start') {
            def ack = request('GameServer3', [_p:'request-join'])
        } else if (msg._p == 'request-hand') {
            reply(msg, [_p:'hand', show:'paper'])
        }
    }
}

動作方法

課題

  1. Player3の手をランダムに変更できるようにしてみましょう(前回の課題と同じ)
  2. GameServer3に勝敗判定をさせ,正しい勝敗数を通知させてみましょう.