Pig the dice game/Player: Difference between revisions
Content deleted Content added
SqrtNegInf (talk | contribs) m →{{header|Sidef}}: Fix link: Perl 6 --> Raku |
|||
Line 2,304: | Line 2,304: | ||
</lang> |
</lang> |
||
=={{header|Nim}}== |
|||
{{trans|D}} |
|||
We use the same strategies as D (and C++) but the code is somewhat different. To represent the players with their different strategies, we don’t use a player base class with subclasses for each strategy but a single player object with a “strategy” field. To dispatch, we use a "case" statement rather than method overriding. This is only a matter of preference as Nim allows inheritance and method overriding. |
|||
We also describe the list of players as a linked ring of player objects. The code is somewhat more pleasant this way. |
|||
Except for some small differences in the formatting, the output is similar to that of D (or C++) implementation. |
|||
<lang Nim>import random, strformat |
|||
const MaxPoints = 100 |
|||
type |
|||
Move {.pure.} = enum Roll, Hold |
|||
Strategy {.pure.} = enum Rand, Q2Win, AL20, AL20T |
|||
# Player description. |
|||
Player = ref object |
|||
num: Natural |
|||
currentScore: Natural |
|||
roundScore: Natural |
|||
strategy: Strategy |
|||
next: Player |
|||
# Player list managed as a singly linked ring. |
|||
PlayerList = object |
|||
count: Natural |
|||
head, tail: Player |
|||
proc addPlayer(playerList: var PlayerList; strategy: Strategy) = |
|||
## Add a player with given strategy. |
|||
inc playerList.count |
|||
let newPlayer = Player(num: playerList.count, strategy: strategy) |
|||
if playerList.head.isNil: |
|||
playerList.head = newPlayer |
|||
else: |
|||
playerList.tail.next = newPlayer |
|||
playerList.tail = newPlayer |
|||
newPlayer.next = playerList.head |
|||
iterator items(playerList: PlayerList): Player = |
|||
## Yield the successive players of a player list. |
|||
var player = playerList.head |
|||
yield player |
|||
while player != playerList.tail: |
|||
player = player.next |
|||
yield player |
|||
proc getMove(player: Player): Move = |
|||
## Get the move for the given player. |
|||
if player.roundScore + player.currentScore >= MaxPoints: return Hold |
|||
case player.strategy |
|||
of Strategy.Rand: |
|||
result = if rand(1) == 0: Roll |
|||
elif player.roundScore > 0: Hold |
|||
else: Roll |
|||
of Strategy.Q2Win: |
|||
let q = MaxPoints - player.currentScore |
|||
result = if q < 6 or player.roundScore < q div 4: Roll |
|||
else: Hold |
|||
of Strategy.AL20: |
|||
result = if player.roundScore < 20: Roll |
|||
else: Hold |
|||
of Strategy.AL20T: |
|||
let d = 5 * player.roundScore |
|||
result = if player.roundScore < 20 and d < rand(99): Roll |
|||
else: Hold |
|||
randomize() |
|||
# Create player list. |
|||
var playerList = PlayerList() |
|||
for strategy in Strategy.low..Strategy.high: |
|||
playerList.addPlayer(strategy) |
|||
var endGame = false |
|||
var player = playerList.head |
|||
while not endGame: |
|||
case player.getMove() |
|||
of Roll: |
|||
let die = rand(1..6) |
|||
if die == 1: |
|||
echo &"Player {player.num} rolled {die} Current score: {player.currentScore:3}\n" |
|||
player.roundScore = 0 |
|||
player = player.next |
|||
continue |
|||
inc player.roundScore, die |
|||
echo &"Player {player.num} rolled {die} Round score: {player.roundScore:3}" |
|||
of Hold: |
|||
inc player.currentScore, player.roundScore |
|||
echo &"Player {player.num} holds Current score: {player.currentScore:3}\n" |
|||
if player.currentScore >= MaxPoints: |
|||
endGame = true |
|||
else: |
|||
player.roundScore = 0 |
|||
player = player.next |
|||
for player in playerList: |
|||
let stratStr = &"({player.strategy}):" |
|||
echo &"Player {player.num} {stratStr:8} {player.currentScore:3}"</lang> |
|||
{{out}} |
|||
<pre>Player 1 rolled 2 Round score: 2 |
|||
Player 1 rolled 5 Round score: 7 |
|||
Player 1 holds Current score: 7 |
|||
Player 2 rolled 2 Round score: 2 |
|||
Player 2 rolled 6 Round score: 8 |
|||
Player 2 rolled 4 Round score: 12 |
|||
Player 2 rolled 4 Round score: 16 |
|||
Player 2 rolled 4 Round score: 20 |
|||
Player 2 rolled 1 Current score: 0 |
|||
Player 3 rolled 3 Round score: 3 |
|||
Player 3 rolled 1 Current score: 0 |
|||
Player 4 rolled 6 Round score: 6 |
|||
Player 4 holds Current score: 6 |
|||
Player 1 rolled 1 Current score: 7 |
|||
Player 2 rolled 6 Round score: 6 |
|||
Player 2 rolled 6 Round score: 12 |
|||
Player 2 rolled 1 Current score: 0 |
|||
Player 3 rolled 3 Round score: 3 |
|||
Player 3 rolled 5 Round score: 8 |
|||
Player 3 rolled 2 Round score: 10 |
|||
Player 3 rolled 4 Round score: 14 |
|||
Player 3 rolled 2 Round score: 16 |
|||
Player 3 rolled 4 Round score: 20 |
|||
Player 3 holds Current score: 20 |
|||
Player 4 rolled 1 Current score: 6 |
|||
Player 1 rolled 4 Round score: 4 |
|||
Player 1 rolled 3 Round score: 7 |
|||
Player 1 holds Current score: 14 |
|||
Player 2 rolled 3 Round score: 3 |
|||
Player 2 rolled 4 Round score: 7 |
|||
Player 2 rolled 3 Round score: 10 |
|||
Player 2 rolled 2 Round score: 12 |
|||
Player 2 rolled 6 Round score: 18 |
|||
Player 2 rolled 4 Round score: 22 |
|||
Player 2 rolled 5 Round score: 27 |
|||
Player 2 holds Current score: 27 |
|||
Player 3 rolled 3 Round score: 3 |
|||
Player 3 rolled 4 Round score: 7 |
|||
Player 3 rolled 1 Current score: 20 |
|||
Player 4 rolled 5 Round score: 5 |
|||
Player 4 rolled 5 Round score: 10 |
|||
Player 4 rolled 1 Current score: 6 |
|||
Player 1 rolled 2 Round score: 2 |
|||
Player 1 rolled 3 Round score: 5 |
|||
Player 1 holds Current score: 19 |
|||
Player 2 rolled 2 Round score: 2 |
|||
Player 2 rolled 2 Round score: 4 |
|||
Player 2 rolled 3 Round score: 7 |
|||
Player 2 rolled 2 Round score: 9 |
|||
Player 2 rolled 5 Round score: 14 |
|||
Player 2 rolled 4 Round score: 18 |
|||
Player 2 holds Current score: 45 |
|||
Player 3 rolled 3 Round score: 3 |
|||
Player 3 rolled 5 Round score: 8 |
|||
Player 3 rolled 4 Round score: 12 |
|||
Player 3 rolled 4 Round score: 16 |
|||
Player 3 rolled 3 Round score: 19 |
|||
Player 3 rolled 1 Current score: 20 |
|||
Player 4 rolled 3 Round score: 3 |
|||
Player 4 rolled 6 Round score: 9 |
|||
Player 4 holds Current score: 15 |
|||
Player 1 rolled 6 Round score: 6 |
|||
Player 1 holds Current score: 25 |
|||
Player 2 rolled 6 Round score: 6 |
|||
Player 2 rolled 3 Round score: 9 |
|||
Player 2 rolled 3 Round score: 12 |
|||
Player 2 rolled 6 Round score: 18 |
|||
Player 2 holds Current score: 63 |
|||
Player 3 rolled 2 Round score: 2 |
|||
Player 3 rolled 4 Round score: 6 |
|||
Player 3 rolled 1 Current score: 20 |
|||
Player 4 rolled 4 Round score: 4 |
|||
Player 4 rolled 4 Round score: 8 |
|||
Player 4 holds Current score: 23 |
|||
Player 1 rolled 4 Round score: 4 |
|||
Player 1 holds Current score: 29 |
|||
Player 2 rolled 3 Round score: 3 |
|||
Player 2 rolled 6 Round score: 9 |
|||
Player 2 holds Current score: 72 |
|||
Player 3 rolled 5 Round score: 5 |
|||
Player 3 rolled 5 Round score: 10 |
|||
Player 3 rolled 6 Round score: 16 |
|||
Player 3 rolled 1 Current score: 20 |
|||
Player 4 rolled 2 Round score: 2 |
|||
Player 4 rolled 3 Round score: 5 |
|||
Player 4 rolled 2 Round score: 7 |
|||
Player 4 holds Current score: 30 |
|||
Player 1 rolled 4 Round score: 4 |
|||
Player 1 holds Current score: 33 |
|||
Player 2 rolled 1 Current score: 72 |
|||
Player 3 rolled 6 Round score: 6 |
|||
Player 3 rolled 1 Current score: 20 |
|||
Player 4 rolled 2 Round score: 2 |
|||
Player 4 rolled 1 Current score: 30 |
|||
Player 1 rolled 3 Round score: 3 |
|||
Player 1 rolled 3 Round score: 6 |
|||
Player 1 rolled 5 Round score: 11 |
|||
Player 1 rolled 5 Round score: 16 |
|||
Player 1 holds Current score: 49 |
|||
Player 2 rolled 2 Round score: 2 |
|||
Player 2 rolled 4 Round score: 6 |
|||
Player 2 rolled 4 Round score: 10 |
|||
Player 2 holds Current score: 82 |
|||
Player 3 rolled 2 Round score: 2 |
|||
Player 3 rolled 6 Round score: 8 |
|||
Player 3 rolled 1 Current score: 20 |
|||
Player 4 rolled 6 Round score: 6 |
|||
Player 4 holds Current score: 36 |
|||
Player 1 rolled 2 Round score: 2 |
|||
Player 1 holds Current score: 51 |
|||
Player 2 rolled 5 Round score: 5 |
|||
Player 2 holds Current score: 87 |
|||
Player 3 rolled 1 Current score: 20 |
|||
Player 4 rolled 6 Round score: 6 |
|||
Player 4 rolled 3 Round score: 9 |
|||
Player 4 holds Current score: 45 |
|||
Player 1 rolled 5 Round score: 5 |
|||
Player 1 holds Current score: 56 |
|||
Player 2 rolled 2 Round score: 2 |
|||
Player 2 rolled 1 Current score: 87 |
|||
Player 3 rolled 2 Round score: 2 |
|||
Player 3 rolled 5 Round score: 7 |
|||
Player 3 rolled 5 Round score: 12 |
|||
Player 3 rolled 3 Round score: 15 |
|||
Player 3 rolled 5 Round score: 20 |
|||
Player 3 holds Current score: 40 |
|||
Player 4 rolled 5 Round score: 5 |
|||
Player 4 rolled 6 Round score: 11 |
|||
Player 4 rolled 2 Round score: 13 |
|||
Player 4 rolled 4 Round score: 17 |
|||
Player 4 rolled 3 Round score: 20 |
|||
Player 4 holds Current score: 65 |
|||
Player 1 rolled 6 Round score: 6 |
|||
Player 1 holds Current score: 62 |
|||
Player 2 rolled 4 Round score: 4 |
|||
Player 2 holds Current score: 91 |
|||
Player 3 rolled 5 Round score: 5 |
|||
Player 3 rolled 5 Round score: 10 |
|||
Player 3 rolled 4 Round score: 14 |
|||
Player 3 rolled 6 Round score: 20 |
|||
Player 3 holds Current score: 60 |
|||
Player 4 rolled 4 Round score: 4 |
|||
Player 4 rolled 4 Round score: 8 |
|||
Player 4 holds Current score: 73 |
|||
Player 1 rolled 3 Round score: 3 |
|||
Player 1 rolled 2 Round score: 5 |
|||
Player 1 rolled 6 Round score: 11 |
|||
Player 1 rolled 6 Round score: 17 |
|||
Player 1 holds Current score: 79 |
|||
Player 2 rolled 5 Round score: 5 |
|||
Player 2 holds Current score: 96 |
|||
Player 3 rolled 4 Round score: 4 |
|||
Player 3 rolled 6 Round score: 10 |
|||
Player 3 rolled 4 Round score: 14 |
|||
Player 3 rolled 2 Round score: 16 |
|||
Player 3 rolled 3 Round score: 19 |
|||
Player 3 rolled 4 Round score: 23 |
|||
Player 3 holds Current score: 83 |
|||
Player 4 rolled 3 Round score: 3 |
|||
Player 4 rolled 4 Round score: 7 |
|||
Player 4 rolled 2 Round score: 9 |
|||
Player 4 holds Current score: 82 |
|||
Player 1 rolled 1 Current score: 79 |
|||
Player 2 rolled 3 Round score: 3 |
|||
Player 2 rolled 1 Current score: 96 |
|||
Player 3 rolled 1 Current score: 83 |
|||
Player 4 rolled 6 Round score: 6 |
|||
Player 4 holds Current score: 88 |
|||
Player 1 rolled 4 Round score: 4 |
|||
Player 1 rolled 3 Round score: 7 |
|||
Player 1 holds Current score: 86 |
|||
Player 2 rolled 2 Round score: 2 |
|||
Player 2 rolled 1 Current score: 96 |
|||
Player 3 rolled 2 Round score: 2 |
|||
Player 3 rolled 2 Round score: 4 |
|||
Player 3 rolled 3 Round score: 7 |
|||
Player 3 rolled 4 Round score: 11 |
|||
Player 3 rolled 1 Current score: 83 |
|||
Player 4 rolled 1 Current score: 88 |
|||
Player 1 rolled 6 Round score: 6 |
|||
Player 1 holds Current score: 92 |
|||
Player 2 rolled 4 Round score: 4 |
|||
Player 2 holds Current score: 100 |
|||
Player 1 (Rand): 92 |
|||
Player 2 (Q2Win): 100 |
|||
Player 3 (AL20): 83 |
|||
Player 4 (AL20T): 88</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |