# 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.