4.5 Case Study: A Game of Chance

  • Requirements statement:

    You roll two six-sided dice, each with faces containing one, two, three, four, five and six spots, respectively. When the dice come to rest, the sum of the spots on the two upward faces is calculated.

  • If the sum is 7 or 11 on the first roll, you win.
  • If the sum is 2, 3 or 12 on the first roll (called “craps”), you lose (i.e., the “house” wins).
  • If the sum is 4, 5, 6, 8, 9 or 10 on the first roll, that sum becomes your “point.”
  • To win, you must continue rolling the dice until you “make your point” (i.e., roll that same point value).
  • You lose by rolling a 7 before making your point.

  • Script that simulates the game:
# fig04_02.py
"""Simulating the dice game Craps."""
import random

def roll_dice():
    """Roll two dice and return their face values as a tuple."""
    die1 = random.randrange(1, 7)
    die2 = random.randrange(1, 7)
    return (die1, die2)  # pack die face values into a tuple

def display_dice(dice):
    """Display one roll of the two dice."""
    die1, die2 = dice  # unpack the tuple into variables die1 and die2
    print(f'Player rolled {die1} + {die2} = {sum(dice)}')

die_values = roll_dice()  # first roll
display_dice(die_values)

# determine game status and point, based on first roll
sum_of_dice = sum(die_values)

if sum_of_dice in (7, 11):  # win
    game_status = 'WON'
elif sum_of_dice in (2, 3, 12):  # lose
    game_status = 'LOST'
else:  # remember point
    game_status = 'CONTINUE'
    my_point = sum_of_dice
    print('Point is', my_point)

# continue rolling until player wins or loses
while game_status == 'CONTINUE':
    die_values = roll_dice()
    display_dice(die_values)
    sum_of_dice = sum(die_values)

    if sum_of_dice == my_point:  # win by making point
        game_status = 'WON'
    elif sum_of_dice == 7:  # lose by rolling 7
        game_status = 'LOST'

# display "wins" or "loses" message
if game_status == 'WON':
    print('Player wins')
else:
    print('Player loses')
In [1]:
run fig04_02.py
Player rolled 5 + 4 = 9
Point is 9
Player rolled 6 + 3 = 9
Player wins
In [2]:
run fig04_02.py
Player rolled 6 + 6 = 12
Player loses
In [3]:
run fig04_02.py
Player rolled 4 + 3 = 7
Player wins
In [5]:
run fig04_02.py
Player rolled 1 + 5 = 6
Point is 6
Player rolled 5 + 4 = 9
Player rolled 6 + 3 = 9
Player rolled 1 + 6 = 7
Player loses

Function roll_dice—Returning Multiple Values Via a Tuple

  • Simulates rolling two dice on each roll.
  • Sometimes it’s useful to return more than one value, as in roll_dice, which returns both die values as a tuple—an immutable sequences of values.
  • To create a tuple, separate its values with commas—known as packing a tuple.
  • Parentheses are optional, but we recommend using them for clarity.

Function display_dice

  • Assigning a tuple to a comma-separated list of variables unpacks the tuple.
  • Number of variables to the left of = must match the number of elements in the tuple; otherwise, a ValueError occurs.

First Roll

  • When the script begins executing, we roll the dice and display the results.
  • You can win or lose on the first roll or any subsequent roll—game_status keeps track of the win/loss status.
  • The in operator in the following expression tests whether the tuple (7, 11) contains sum_of_dice’s value
    sum_of_dice in (7, 11)
    
  • The operator’s right operand can be any iterable.
  • The preceding concise condition is equivalent to
    (sum_of_dice == 7) or (sum_of_dice == 11)
    

Subsequent Rolls

Displaying the Final Results


©1992–2020 by Pearson Education, Inc. All Rights Reserved. This content is based on Chapter 4 of the book Intro to Python for Computer Science and Data Science: Learning to Program with AI, Big Data and the Cloud.

DISCLAIMER: The authors and publisher of this book have used their best efforts in preparing the book. These efforts include the development, research, and testing of the theories and programs to determine their effectiveness. The authors and publisher make no warranty of any kind, expressed or implied, with regard to these programs or to the documentation contained in these books. The authors and publisher shall not be liable in any event for incidental or consequential damages in connection with, or arising out of, the furnishing, performance, or use of these programs.