handout #5
CSE143X—Computer Programming I & II
Programming Assignment #3
due: Friday, 10/12/12,
11 pm
This assignment will give you practice with if/else constructs, while loops, strings, and pseudorandom numbers. You are going to write a program that allows the user to play the game Bagels, a variant of the board game Mastermind. In this game, the computer generates a random number that the user has to guess. The computer provides hints based on the value and position of digits guessed. The solution will always be a number made up of the digits 1 through 9 (no zeros).
After displaying an introduction, your program should allow the user to play a series of games and should report some overall statistics when the user no longer wants to play again. For each individual game, your program should repeatedly prompt the user for guesses and provide a clue after each incorrect guess. If no digits match between the guess and the answer, the program prints "bagels." The program prints "fermi" for each correct digit in a correct position and "pica" for each correct digit in the wrong position. All of the fermi clues are reported first so as not to give any extra information to the player.
You should study the sample logs of execution at the end of this writeup and on the class web page because your program must exactly match the behavior and format of these logs.
At a minimum, your program should have the following static methods in addition to method main:
· a method that introduces the game
· a method to play one game with the user (just one game, not multiple games)
· a method to report overall results to the user
You should introduce other methods as well so that no single method has more than 25 lines of code. You are encouraged to include the replace and round1 methods discussed in lecture.
When you ask the user whether or not to play again, you should use the “next()” method of the Scanner class to read a one-word answer from the user. You should continue playing if this answer begins with the letter “y” or the letter “Y”. Notice that the user is allowed to type words like “yes”. You are to look just at the first letter of the user’s response and see whether it begins with a “y” or “n” (either capitalized or not) to determine whether to play again.
Assume that the user always gives an appropriate value for the length of the answer (an integer between 1 and 9), types a legal value when guessing (all digits, correct length, no zeros), and that the user gives you a one-word answer beginning with “y”, “Y”, “n” or “N” when asked whether to play again. You may assume that no game involves more than 9,999 guesses.
You are allowed to add code that checks parameters and throws an exception for illegal parameter values, as in the replace method discussed in lecture. Your methods should throw an IllegalArgumentException for illegal values. This is entirely optional, will not earn you extra points, will not be graded on style, and will not count against the limit of 25 lines per method.
You will notice at the end of the logs
that you are to report various statistics about the series of games played by
the user. You are to report the total
number of games played, the total number of guesses
made (all games included), the average number of guesses per game, and the best
(fewest) number of guesses used in any single game. The average number of guesses per games
should be rounded to one decimal place (you can use either the round1 method or
a printf).
Most Java programmers would solve this
problem with arrays, but you aren’t allowed to solve it that way. Instead, you will be manipulating
strings. You should construct an
appropriate string as the answer and you should read the user’s guess as a
string using the next() method of the Scanner
class. You will find it helpful to use
the replace method discussed in lecture that allows you to construct a new
string that replaces one character of a string with a different character. You will generate clues by manipulating
string variables.
To determine fermi and pica hints, we recommend doing two passes over the digits: the first one to identify fermi matches (matching digits at matching locations) and the second one to identify pica matches (matching digits at different locations). You must be sure that the same digit is not used for two different matches. You will therefore need to mark digits as "used" so that they will not be used again in another match. For example, in the figure below, the numbers with an ‘X’ through them should no longer be considered (correct is “7578” and guess is “5587”):
There was one fermi match and two pica matches, so the correct clue would be “fermi pica pica.”
Here are a few helpful hints to keep in mind.
You should handle the case where the
user guesses the correct number on the first try. Print the following message:
You got it right in 1 guess
As noted above, you are to break up your
program into methods so that no single method has more than 25 lines of code. You can also include more code in your main
method than we normally allow. In
particular, you are required to have a while loop in main that plays multiple
games and prompts the user for whether or not to play another game.
We will once again expect you to use
good programming style and to include useful comments throughout your program. We will expect you to make appropriate
choices about when to store values as int versus double, which if/else constructs
to use, what parameters to pass, and so on.
For this assignment you are limited to
the language features in Chapters 1-5 shown in lecture or the textbook, and you
are not allowed to use the break or continue statement for a loop.
Use whitespace and indentation
properly. Limit lines to 100
characters. Give meaningful names to
methods and variables, and follow Java's naming standards. Localize variables whenever possible. Include a comment at the beginning of your
program with basic description information and a comment at the start of each
method. Some students try to achieve
repetition without properly using while loops, by writing a method that calls
itself; this is not appropriate on this assignment and will result in a
deduction in points
Your program should be stored in a file
called Bagels.java.
Log
of execution (user input bold and underlined)
Welcome to CSE 143x Bagels!
I'll think up a number for you to guess.
Each digit will be between 1 and 9.
Try to guess my number, and I'll say "fermi"
for each digit you get right and in the right
place, and "pica" for each digit you get right
that is in the wrong place.
How many digits this time? 3
Your guess? 123
pica
Your guess? 456
pica pica
Your guess? 265
pica pica
Your guess? 542
You got it right in 4 guesses
Do you want to play again? y
How many digits this time? 3
Your guess? 123
fermi fermi
Your guess? 456
bagels
Your guess? 789
bagels
Your guess? 122
fermi
Your guess? 113
fermi fermi
Your guess? 133
You got it right in 6 guesses
Do you want to play again? n
Overall results:
total games = 2
total guesses = 10
guesses/game = 5.0
best game = 4