Player
var (games=100) = ARGV.map{.to_i}...
define DIE = 1..6
define GOAL = 100
class Player(score=0, ante=0, rolls=0, strategy={false}) {
method turn {
rolls = 0
ante = 0
loop {
rolls++
given (DIE.rand) { |roll|
when (1) {
ante = 0
break
}
case (roll > 1) {
ante += roll
}
}
((score + ante >= GOAL) || strategy) && break
}
score += ante
}
}
var players = []
# default, go-for-broke, always roll again
players[0] = Player()
# try to roll 5 times but no more per turn
players[1] = Player( strategy: { players[1].rolls >= 5 } )
# try to accumulate at least 20 points per turn
players[2] = Player( strategy: { players[2].ante > 20 } )
# random but 90% chance of rolling again
players[3] = Player( strategy: { 1.rand < 0.1 } )
# random but more conservative as approaches goal
players[4] = Player( strategy: { 1.rand < ((GOAL - players[4].score) * 0.6 / GOAL) } )
var wins = players.len.of(0)
games.times {
var player = -1
loop {
player++
var p = players[player % players.len]
p.turn
p.score >= GOAL && break
}
wins[player % players.len]++
players.map{.score}.join("\t").say
players.each { |p| p.score = 0 }
}
say "\nSCORES: for #{games} games"
say wins.join("\t")Output:
Last updated
Was this helpful?