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}}==