# Game description (from Bell's Board & Table Games from Many Civilizations): # "Any number of players may play and each throws the die in turn. # The player with the lowest throw begins the game and the one with # the highest plays last. The opening player throws the die as many # times as he wishes, each time adding the number on the upper face # of the die to his score. If he throws an ace, however, he loses all the # points for that turn, and has to pass the die on to the next player. # He may stop throwing at any time and hand the die on, when he # keeps the points scored in that turn and adds it to his total score. # The first player to reach 100 points wins. In succeeding games the # advantage of an early throw is decided afresh by each player casting # the die, lowest starting and the highest being last." verbose = true function pig(players) n = length(players) scores = zeros(Int, n) while true for i in 1:n j = 1 score = 0 while true if scores[i] + score >= 100 || !players[i](scores, i, j, score) verbose && println("Player \$i passes") break end k = rand(1:6) verbose && println("Player \$i throws \$k") if k == 1 score = 0 verbose && println("=> Zero!") break end score += k j += 1 end scores[i] += score verbose && score != 0 && println(" Earned \$score points => \$(scores[i])") if scores[i] >= 100 verbose && println("Final scores: \$scores - Player \$i wins") return i end end end end function test_players(players, iterations) global verbose old_verbose = verbose verbose = false scores = zeros(length(players)) for i in 1:iterations j = pig(players) scores[j] += 1 end verbose = true scores /= iterations end # player(scores, i, j, current) # - scores : an array of the total scores of all players # - i : the index of this player # - j : the number of this throw (in the current turn) # - current: the accumulated score in the current turn fivetimes(scores, i, j, current) = j <= 5 sixtimes(scores, i, j, current) = j <= 6 twentier(scores, i, j, current) = current < 20 twentyfourer(scores, i, j, current) = current < 24 function fighter(scores, i, j, current) for k in 1:length(scores) k != i && scores[k] > 75 && return j < 10 end current < 24 end