Pig the dice game

From Rosetta Code
Revision as of 09:41, 14 September 2012 by rosettacode>Fwend (→‎{{header|D}}: added D)
Pig the dice game is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

The game of Pig is a multiplayer game played with a single six-sided die. The object of the game is to reach 100 points or more. Play is taken in turns. On each person's turn that person has the option of either

  1. Rolling the dice: where a roll of two to six is added to their score for that turn and the player's turn continues as the player is given the same choice again; or a roll of 1 loses the player's total points for that turn and their turn finishes with play passing to the next player.
  2. Holding: The player's score for that round is added to their total and becomes safe from the effects of throwing a one. The player's turn finishes with play passing to the next player.
Task goal

The goal of this task is to create a program to score for and simulate dice throws for a two-person game.

Reference

D

Translation of: Python

<lang d>import std.stdio, std.string, std.algorithm, std.random;

void main() {

   immutable maxScore = 100;
   immutable playerCount = 2;
   int[playerCount] safeScore;
   int player = 0;
   int score = 0;
   while (true) {
       writef(" Player %d: (%d, %d) Rolling? (Y) ", player,
           safeScore[player], score);
       if (canFind(["yes", "y", ""], stdin.readln().strip().toLower())) {
           int rolled = uniform(1, 7);
           writefln(" Rolled %d ", rolled);
           if (rolled == 1) {
               writefln(" Bust! You lose %d but keep %d \n",
                   score, safeScore[player]);
           } else {
               score += rolled;
               continue;
           }
       } else {
           safeScore[player] += score;
        if (safeScore[player] >= maxScore)
           break;
           writefln(" Sticking with %d \n", safeScore[player]);
       }
       score = 0;
       player = (player + 1) % playerCount;
   }
   writefln("\nPlayer %d wins with a score of %d ",
       player, safeScore[player]);

}</lang>

 Player 0: (0, 0) Rolling? (Y) y
 Rolled 3
 Player 0: (0, 3) Rolling? (Y) y
 Rolled 2
 Player 0: (0, 5) Rolling? (Y) n
 Sticking with 5

 Player 1: (0, 0) Rolling? (Y) yes
 Rolled 5
 Player 1: (0, 5) Rolling? (Y) yes
 Rolled 5
 Player 1: (0, 10) Rolling? (Y) yes
 Rolled 1
 Bust! You lose 10 but still keep your previous 0

 Player 0: (5, 0) Rolling? (Y) YES
 Rolled 3
 Player 0: (5, 3) Rolling? (Y) YES
 Rolled 6
 Player 0: (5, 9) Rolling? (Y) YES
 Rolled 3
 Player 0: (5, 12) Rolling? (Y) YES
 Rolled 4
 Player 0: (5, 16) Rolling? (Y) n
 Sticking with 21

 Player 1: (0, 0) Rolling? (Y) Y
 Rolled 4
 Player 1: (0, 4) Rolling? (Y) Y
 Rolled 1
 Bust! You lose 4 but still keep your previous 0

 (...)

 Player 0: (91, 0) Rolling? (Y) 
 Rolled 5
 Player 0: (91, 5) Rolling? (Y) 
 Rolled 6
 Player 0: (91, 11) Rolling? (Y) n
 
Player 0 wins with a score of 102

Perl 6

Works with: niecza version 2012-09-12

<lang perl6>constant DIE = 1..6;

sub MAIN (Int :$players = 2, Int :$goal = 100) {

   my @safe = 0 xx $players;
   for ^$players xx * -> $player {

say "\nOK, player #$player is up now."; my $safe = @safe[$player]; my $ante = 0; until $safe + $ante >= $goal or prompt("#$player, you have $safe + $ante = {$safe+$ante}. Roll? [Yn] ") ~~ /:i ^n/ { given DIE.roll { say " You rolled a $_."; when 1 { say " Bust! You lose $ante but keep your previous $safe."; $ante = 0; last; } when 2..* { $ante += $_; } } } $safe += $ante; if $safe >= $goal { say "\nPlayer #$player wins with a score of $safe!"; last; } @safe[$player] = $safe; say " Sticking with $safe." if $ante;

   }

}</lang> The game defaults to the specified task, but we'll play a shorter game with three players for our example:

Output:
> pig help
Usage:
  pig [--players=<Int>] [--goal=<Int>]
> pig --players=3 --goal=20

OK, player #0 is up now.
#0, you have 0 + 0 = 0. Roll? [Yn] 
  You rolled a 6.
#0, you have 0 + 6 = 6. Roll? [Yn] 
  You rolled a 6.
#0, you have 0 + 12 = 12. Roll? [Yn] n
  Sticking with 12.

OK, player #1 is up now.
#1, you have 0 + 0 = 0. Roll? [Yn] 
  You rolled a 4.
#1, you have 0 + 4 = 4. Roll? [Yn] 
  You rolled a 6.
#1, you have 0 + 10 = 10. Roll? [Yn] 
  You rolled a 6.
#1, you have 0 + 16 = 16. Roll? [Yn] n
  Sticking with 16.

OK, player #2 is up now.
#2, you have 0 + 0 = 0. Roll? [Yn] 
  You rolled a 5.
#2, you have 0 + 5 = 5. Roll? [Yn] 
  You rolled a 1.
  Bust!  You lose 5 but keep your previous 0.

OK, player #0 is up now.
#0, you have 12 + 0 = 12. Roll? [Yn] 
  You rolled a 1.
  Bust!  You lose 0 but keep your previous 12.

OK, player #1 is up now.
#1, you have 16 + 0 = 16. Roll? [Yn] n

OK, player #2 is up now.
#2, you have 0 + 0 = 0. Roll? [Yn] 
  You rolled a 6.
#2, you have 0 + 6 = 6. Roll? [Yn] 
  You rolled a 6.
#2, you have 0 + 12 = 12. Roll? [Yn] 
  You rolled a 4.
#2, you have 0 + 16 = 16. Roll? [Yn] 
  You rolled a 6.

Player #2 wins with a score of 22!

Python

<lang python>#!/usr/bin/python3

See: http://en.wikipedia.org/wiki/Pig_(dice)

This program scores and throws the dice for a two player game of Pig

from random import randint

playercount = 2 maxscore = 100 safescore = [0] * playercount player = 0 score=0

while max(safescore) < maxscore:

   rolling = input("Player %i: (%i, %i) Rolling? (Y) "
                   % (player, safescore[player], score)).strip().lower() in {'yes', 'y', }
   if rolling:
       rolled = randint(1, 6)
       print('  Rolled %i' % rolled)
       if rolled == 1:
           print('  Bust! you lose %i but still keep your previous %i'
                 % (score, safescore[player]))
           score, player = 0, (player + 1) % playercount
       else:
           score += rolled
   else:
       safescore[player] += score
       if safescore[player] >= maxscore:
           break
       print('  Sticking with %i' % safescore[player])
       score, player = 0, (player + 1) % playercount
       

print('\nPlayer %i wins with a score of %i' %(player, safescore[player]))</lang>

Samples from a game
Player 0: (0, 0) Rolling? (Y) 
  Rolled 6
Player 0: (0, 6) Rolling? (Y) 
  Rolled 5
Player 0: (0, 11) Rolling? (Y) 
  Rolled 1
  Bust! you lose 11 but still keep your previous 0
Player 1: (0, 0) Rolling? (Y) 
  Rolled 3
Player 1: (0, 3) Rolling? (Y) 
  Rolled 4
Player 1: (0, 7) Rolling? (Y) 
  Rolled 6
Player 1: (0, 13) Rolling? (Y) n
  Sticking with 13
...
Player 0: (78, 10) Rolling? (Y) n
  Sticking with 88
Player 1: (63, 0) Rolling? (Y) 
  Rolled 6
Player 1: (63, 6) Rolling? (Y) 
  Rolled 1
  Bust! you lose 6 but still keep your previous 63
Player 0: (88, 0) Rolling? (Y) n
  Sticking with 88
Player 1: (63, 0) Rolling? (Y) n
  Sticking with 63
Player 0: (88, 0) Rolling? (Y) 
  Rolled 6
Player 0: (88, 6) Rolling? (Y) 
  Rolled 4
Player 0: (88, 10) Rolling? (Y) 
  Rolled 3
Player 0: (88, 13) Rolling? (Y) n

Player 0 wins with a score of 101