## Homework 2 User-defined functions: Modifying the craps game from Chapter 5

### Outcomes

After successfully completing this assignment, you will be able to...
• Understand and modify code written by someone else
• Design and implement functions for a C program
• Decide when a variable should be defined locally, or passed as a parameter, or defined globally
• Read mixed data (a mixture of numeric and character data) into a program
• Use enumerated types to make a program more understandable

### Before Starting

Read Chapter 5, particularly sections 5.10 (Random Number Generation) and 5.11 (Example: A Game of Chance). Make sure you thoroughly understand the program in Figure 5.10 before you start working on this assignment. The program from Figure 5.10 is duplicated here for you to download.

### The Assignment

In this assignment you will modify and enhance the craps program. Your program will contain the following enhancements:
• the user will start out with a bank balance of \$1000
• the user will be allowed to play multiple games of craps
• the user will wager money on each game played
The program will be modified so that the portion of the program that plays one game of craps will be packaged as a function. In addition, separate functions will be defined to get the wager, verify the wager, adjust the bank balance after a game is played, and read in a yes or no answer. Here are the specifications for each of the functions:

getWager This function asks the player to input a dollar amount to wager on the next game. The function calls validWager (see below) to check the wager to make sure it doesn't exceed the player's current bank balance, and to make sure that it is greater than 0. As long as the wager is invalid, the player is asked to enter a new wager. Once a valid wager is entered, it is returned to the calling function.

validWager This function checks the wager to make sure it doesn't exceed the player's current bank balance. If the wager is less than or equal to the current bank balance, the function returns 1 (true), otherwise it returns 0 (false).

playGame plays a single game of craps (this is most of the code from Figure 5.10, packaged as a function instead of as a complete program). It returns to the caller one of the enumerated constants WON or LOST.

adjustBalance This function either adds the wager to or subtracts the wager from the player's current balance, depending upon whether the last game played was WON or LOST. The function returns the updated balance.

getYesOrNo This function asks if the player would like to play another game of craps. The function checks the response to make sure it is either 'y' or 'n'. The function will repeatedly ask for a y/n response until a valid response is entered. The answer (either 'y' or 'n') is returned to the calling function.

For each function you should write pre- and post-conditions, design the function as a black box (you don't have to turn in the black box), define a prototype, write a stub, and, once the program compiles successfully with each stub, fill in the function definitions (one at a time).

#### Include files

• stdio.h provides printf, scanf, getchar
• stdlib.h provides rand, srand
• time.h provides time

#### Assumptions and Restrictions

The main function should call getYesOrNo only as long as the player's balance is greater than 0 (once the player's balance goes to 0, the player is not allowed to continue).

#### Sample Execution

```Balance = \$1000.00
Enter wager:  100
Player rolled 5 + 6 = 11
Player wins

Balance = \$1100.00
Do you want to play another game?  (y or n):  y
Enter wager:  1500
Enter a new wager:  900
Player rolled 3 + 1 = 4
Point is 4
Player rolled 4 + 5 = 9
Player rolled 5 + 5 = 10
Player rolled 5 + 6 = 11
Player rolled 3 + 3 = 6
Player rolled 3 + 5 = 8
Player rolled 6 + 2 = 8
Player rolled 1 + 5 = 6
Player rolled 3 + 5 = 8
Player rolled 5 + 6 = 11
Player rolled 3 + 1 = 4
Player wins

Balance = \$2000.00
Do you want to play another game?  (y or n):  q
You must answer y or n.
Do you want to play another game?  (y or n):  y
Enter wager:  2000
Player rolled 6 + 5 = 11
Player wins

Balance = \$4000.00
Do you want to play another game?  (y or n):  n

```

#### A note about mixed numeric and character input

This program will require a deeper understanding of how C does keyboard input. When reading in single characters (like y or n) it is usually easier to use the C function getchar instead of using scanf. getchar returns the next single character from the input stream. Look at the Sample Execution above. You would use a printf statement to output the prompt, "Do you want to play another game? (y or n): ". Now think of what the user types in response...not the single character y, but two characters, y and the ENTER key (the C constant '\n'). You can read in the y with the statement
```  ch = getchar();
```
That still leaves the newline character in the input buffer. This becomes a problem if the user had typed in an invalid response like q instead of y or n, because the next time you try to use getchar to read in a valid response it will read in the newline, not the user's new input value. Similar problems are encountered if you use getchar after reading in a numeric value; scanf reads in the characters for the numeric value, and leaves the next character to be read (the newline character) still in the input buffer. A quick way to fix this problem is to follow each input statement with the loop:
```  while (getchar() != '\n');
```
(Notice the placement of the semi-colon. The loop body is empty.) This loop essentially reads the rest of the characters on the line, and ignores them, until it reaches the end of the line. The next time your program executes an input statement (either scanf or getchar) it will get the input from the next line typed by the user. You may find getYesOrNo the most difficult function to write for this assignment. I suggest you get everything else working in your program first, then add the code that relies on getYesOrNo.

### Deliverables

Write a short text file called README that summarizes your program, how to run it, and detailing any assumptions and any problems you had. From your Linux account, submit your C source code file and your README file using the following turnin command:

/cs/bin/turnin submit cs2301 PROJECT2 craps.c README

Programs submitted after 5pm on November 9 will be tagged as late, and will be subject to the late homework policy.