Jump to content

Pig the dice game/Player: Difference between revisions

m
Added the Sidef language
m (Added the Sidef language)
Line 2,168:
 
═══════════════════════════HAL 2 the computer won! ════════════════════════════
</pre>
 
=={{header|Sidef}}==
{{trans|Perl 6}}
<lang ruby>var (games=100) = ARGV»to_num»()...;
 
define DIE = 1..6;
define GOAL = 100;
 
class Player(score=0, ante, rolls, strategy={false}) {
method turn {
self.rolls = 0;
self.ante = 0;
loop {
self.rolls++;
given (var roll = DIE.rand)
exact(1) {
self.ante = 0;
break;
}
case(roll > 1) {
self.ante += roll;
}
;
any {
score + ante >= GOAL;
strategy();
} && break;
};
self.score += ante;
}
}
 
var players = [];
 
# default, go-for-broke, always roll again
players[0] = Player.new;
 
# try to roll 5 times but no more per turn
players[1] = Player.new( strategy: { players[1].rolls >= 5 } );
 
# try to accumulate at least 20 points per turn
players[2] = Player.new( strategy: { players[2].ante > 20 } );
 
# random but 90% chance of rolling again
players[3] = Player.new( strategy: { 1.rand < 0.1 } );
 
# random but more conservative as approaches goal
players[4] = Player.new( strategy: { 1.rand < ((GOAL - players[4].score) * 0.6 / GOAL) } );
 
var wins = [0]*players.len;
 
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 };
}
 
"\nSCORES: for #{games} games".say;
wins.join("\t").say;</lang>
{{out}}
<pre>
0 0 67 101 19
0 88 100 9 14
0 81 66 100 24
0 56 103 8 27
0 102 70 17 27
0 79 101 29 36
0 100 71 56 31
0 62 104 28 34
103 19 24 6 5
0 49 101 24 19
0 60 22 101 0
0 20 101 30 34
...
...
...
0 101 69 26 91
0 87 101 30 54
0 84 100 17 64
0 52 24 102 17
 
SCORES: for 100 games
6 28 40 22 4
</pre>
 
2,747

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.