As always, make sure your programs are in the correct directory (cs21/labs/04). We will only grade files submitted by handin21 in this directory.
As your programs become larger, it is even more important to develop good habits:
The above are mandatory and you will be graded on them.
We strongly advise you to write your programs incrementally and test them as you go. No one writes interesting programs all at once. As you write, test that your program does what you expect (even if it doesn't yet do what you want). If it surprises you, make sure you understand what's happening before writing more code.
If we have provided sample input and output, make sure your program matches the expected behavior! You should also test your program using inputs and outputs that are not shown here; after all, we will. Come up with your own test cases and verify that the program is producing the right output on them.
In this lab we will use python's random module. Remember, to import the random module, add this above any functions you define:
from random import *
To generate a random integer between a and b, use randrange(a,b+1).
To randomly select an item from a list, use choice(L).
rnum = randrange(1,11) # generate random number between 1 and 10 L = ["jeff","lisa","joshua"] rname = choice(L) # pick item from list L
If you are in lab and waiting for help, see our
getting-the-most-out-of-lab doc.
Even if you have no idea why your program isn't working, there are always things
you can do to help debug the program and make progress.
Write a function called candyheart(), in a file named hearts.py, that returns a candy heart message (a string). In your function you should create a list of 5-10 candy heart messages (see below), and then randomly choose one of the messages and return it. NOTE: to get the messages to "fit" on the candy hearts, they usually have one word on each line. You can easily do this by putting the newline character in your message (e.g., "WINK\nWINK").
In the main function of your hearts.py program, use a simple for loop to call the candyheart() function 5 times, and print out the returned string.
Here is a sample run of the program.
$ python hearts.py WINK WINK ALL MINE MY BABY LOVE YOU! LOVE YOU!
Note: extra challenges are just for fun (i.e., no bonus points). Please only attempt them after completing your regular assignment.
Add some extra "ASCII-art" to the string returned by candyheart().
$ python hearts.py $ $ $ $ $ $ $ $ $ $ $ $ $ $$ $ $ $ $ ALL $ $ MINE $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $$ $ $ $ $ BE $ $ TRUE $ $ $ $ $ $ $ $
Using random numbers, we can simulate a simple horse race. Imagine you have 4 horses, and they are all racing toward the finish line. We can show the progress of the race using a repeating bar graph:
1: 2: 3: 4: --------------------------------------------------------------------------- 1:HH 2:H 3:HHHHH 4:H --------------------------------------------------------------------------- 1:HHHHHHH 2:HHHHH 3:HHHHHH 4:HHHHHH ---------------------------------------------------------------------------
In the three "timesteps" shown above, horse #3 gets off to a fast start, but horse #1 quickly catches up.
Write a program called horserace.py that simulates a 4-horse race. During each "timestep" of the race, your program should:
Hint: note the use of "for each horse" above. YES, you should use a python list to store the horse info, and a "for" loop to update the horses. You will also need a "while" loop to handle the simulated race.
In the race shown here, my finish line is 75 characters from the start. Here is how the end of the above race might look:
1:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 2:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 3:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 4:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH --------------------------------------------------------------------------- 1:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 2:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 3:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 4:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH --------------------------------------------------------------------------- 1:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 2:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 3:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 4:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ---------------------------------------------------------------------------
And here's how the whole thing might look:
Once the race is over, determine and display which horse won the race.
Two-Dice Pig is a variation of the dice game Pig. We are going to write a simplified one-player version of two-dice pig.
In our version, two dice are rolled over and over until a total score of 100 is reached. Based on the results of rolling the two dice, the scoring each time is as follows:
Here is how a single run of the program might look:
$ python twodice.py 1. 2 1 score = 0 2. 5 6 score = 11 3. 4 3 score = 18 4. 1 1 score = 0 5. 4 6 score = 10 6. 2 2 score = 14 7. 6 5 score = 25 8. 6 6 score = 37 9. 6 4 score = 47 10. 3 4 score = 54 11. 6 1 score = 54 12. 4 4 score = 62 13. 3 1 score = 62 14. 4 6 score = 72 15. 4 3 score = 79 16. 4 6 score = 89 17. 6 5 score = 100
For this program, we want you to practice writing functions, so please follow the directions below:
In a file called twodice.py, first write a roll() function that simulates rolling two 6-sided dice. Your function should return a python list that contains the results of rolling the two dice.
Add a main() function that uses a simple for loop to both call the roll() function and print the results, ten times.
Here's an example (please format the output as shown below):
$ python twodice.py 1. 1 5 2. 6 4 3. 6 5 4. 6 2 5. 3 4 6. 5 4 7. 1 5 8. 3 3 9. 5 4 10. 1 2
Once the above is working, add a score(L) function that has one parameter, a python list. This is the same list that was returned from the roll() function earlier. This function should calculate and return the score of the rolled dice (see scoring rules above).
In your for loop in main(), add in the call to score() and display the results. Note: in the output below, the score shown is the total game score, not the value returned by the score() function. You will need to add this total game score to your main() function, as well. You will also need to come up with a way to reset this total game score to zero when double ones are rolled!
$ python twodice.py 1. 5 5 score = 10 2. 6 2 score = 18 3. 2 4 score = 24 4. 5 6 score = 35 5. 2 6 score = 43 6. 1 4 score = 43 7. 4 5 score = 52 8. 1 1 score = 0 9. 3 6 score = 9 10. 1 1 score = 0
Run the above code a few times to make sure it works for all cases!
Once you have the above working, change the for loop in main() to a while loop. Have your program keep rolling until it reaches a total game score of 100 (or more).
Here's an example of the full program:
$ python twodice.py 1. 3 1 score = 0 2. 6 3 score = 9 3. 1 2 score = 9 4. 6 6 score = 21 5. 1 3 score = 21 6. 5 6 score = 32 7. 6 4 score = 42 8. 1 1 score = 0 9. 6 3 score = 9 10. 1 4 score = 9 11. 2 2 score = 13 12. 3 1 score = 13 13. 2 1 score = 13 14. 6 2 score = 21 15. 2 1 score = 21 16. 1 4 score = 21 17. 1 6 score = 21 18. 4 6 score = 31 19. 2 4 score = 37 20. 3 1 score = 37 21. 1 3 score = 37 22. 6 5 score = 48 23. 5 2 score = 55 24. 3 1 score = 55 25. 3 1 score = 55 26. 6 3 score = 64 27. 3 1 score = 64 28. 4 2 score = 70 29. 2 4 score = 76 30. 3 1 score = 76 31. 6 4 score = 86 32. 3 6 score = 95 33. 1 2 score = 95 34. 4 1 score = 95 35. 3 1 score = 95 36. 5 4 score = 104
Change your program to run the game many times (1000?), and calculate the average number of rolls needed to reach a total score of 100.
How would the average number of rolls change as we increase the required
total game score (200, 300, 400, ...)?
Don't forget to run handin21!