See submission details below for all due dates and submission details. Note there are multiple submission parts.
This assignment should be completed individually to maximize learning. It is important that you adhere to the Course Policies, particularly the section on Programming Assignments. Also relevant is the JMU Honor Code.
In this program, you will implement a simplified text version of the 7 Little Words — game. (For those of you who may not know, 00000111 interpreted as a base 2 number is 7 in base 10.) The 7 Little Words website explains the game and will allow you to play it. Our text version is very similar, but breaks every solution word into only two pieces, then displays those words in text boxes vertically instead of as a graphical grid. Our version does not give the hint of how many letters a solution is but otherwise works very similar to the game on the website. The clues must be solved in order and the user can ask for multiple hints for each clue. Hints can be the first letter of the solution, the first "slice" or part of the solution word in the puzzle, or the whole word.
You will be writing two classes for this assignment, Generator.java
and TerminalUI.java
and one test class, GeneratorTest.java
. The methods for the first two classes will have methods as described below. Note that each method must be implemented exactly as described. See the example input
and output
below for the form of the interaction with the user.
TerminalUI.java
public static String promptForString(Scanner in, String message, int min)
This method will prompt the user using the message passed to it, read in the user's response as a String from the Scanner in
and then return the response as a String. If the user enters a string with a length (number of letters/char) strictly less than the length indicated by min
, then they will be reprompted.
Example: TerminalUI.promptForString(in, "Enter string", 2)
where the user enters "m" would reprompt until a longer word is entered. If the first string of 2 or more letters the user enters is "magnetism", the string returned will be magnetism. Note that if quotes are included in the user's entry they will be included in the String returned by the method. Below is an example from running TerminalUIDriver.
Enter string: m Enter string: Enter string: magnetism Your string was magnetism
public static int promptForInt(Scanner in, String message, int max)
This method will prompt the user using the message passed to it, read in the user's response as an integer from the Scanner in and then return the response as an int
. If the user enters an integer that is strictly less than one or greater than max
, then they should be reprompted for a new integer.
Example: TerminalUI.promptForInt(in, "Enter integer 1-12", 12)
where the user enters 0 would reprompt until an integer between 1 and 12 inclusive is entered. If the first number the user enters that is within the range 1-12 is 12, the int
returned will be 12. Below is an example from running TerminalUIDriver
.
Enter integer 1-12: 0 Enter integer 1-12: 13 Enter integer 1-12: 12 Your integer was 12
public static void promptNDisplayHints(Scanner in, String solution)
This method will prompt the user to see if they want a hint as described below, then print out the correct hint, reprompting as long as the user asks for a proper hint. If the user enters an "n" or any other response than a proper hint, the prompting stops.
Example: TerminalUI.promptNDisplayHints(in, "magnetism")
where the user enters each kind of hint in order, would display each hint in order. Below is an example from running TerminalUIDriver
.
Want a hint? Enter "f" for first letter "s" for first slice "w" for whole word "n" for none: f m Want a hint? Enter "f" for first letter "s" for first slice "w" for whole word "n" for none: s magn Want a hint? Enter "f" for first letter "s" for first slice "w" for whole word "n" for none: w magnetism Want a hint? Enter "f" for first letter "s" for first slice "w" for whole word "n" for none: n
Generator.java
public static String[] wordSplicer(String[] solutions)
This method will split each of the words of the solutions array in half. If the word has an odd number of characters the smaller piece will be the first slice and the longer the second slice. A "board" array of half words will be returned. board array will have twice as many elements as the solutions array and the first two elements will be the two halves of first solution word, the third and fourth elements the two halves of the second solution word, etc. Note that this method should return null if the solutions array is null or of zero length. If there are words in the solutions array they will be a minimum of two letters (char). The algorithm used for this section should work with any reasonable size solutions array.
Example: Generator.wordSplicer(new String[] {"tofutti", "magnetism"})
would return {"tof", "utti", "magn", "etism"}.
public static String[] randomizer(String[] board, int seed)
This method will return a new copy of board
such that the slices in the board are in a new random order in the board. The original array should not be changed. If the board is null
or the number of slices in the board is less than 2, null should be returned. The algorithm used to randomize the array should be to step through the array from beginning to the end, switching each element in the array with an element at another "random" index in the array. This random index should be found by instantiating an object of the Random class using the seed parameter as the seed and then obtaining consecutive random indices by invoking the nextDouble()
method on the Random object.
Generator.randomizer(new String[] {"tof", "utti", "magn", "etism", "edi", "fice", "gri", "nder", "groun", "dling", "thes", "aurus","bu", "ll"}, 0)
would return {"dling", "aurus", "edi", "tof", "fice", "gri", "magn", "ll", "bu", "utti", "nder", "etism", "groun", "thes"}.
public static String clueToString(String[] clues)
This method will create a string that will print out the clues. Each clue should be on it's own line with the user referenced number (i.e. first element is 1 as opposed to 0), followed immediately by a ')', followed by a space, and then the clue. If the clues array is null or empty, the method should return the empty string ("").
Example:Generator.clueToString(new String[] {"a small bird", "common flavor"})
would return "1) a small bird\n2) common flavor\n".
public static String boardToString(String[] board)
This method will create a string that will print out the board. Each slice should look like it is in a box. Each slice will be preceded and followed by a line of dashes as long as the slice plus an additional 9 dashes. The line with the slice will be as follows: a |, followed by a space, followed by the user referenced number (i.e. first element is 1 as opposed to 0) formatted as two digits, followed by a space, followed by |, followed by a space, and then the clue, followed by a space and then a final |.
Example:Generator.boardToString(new String[] {"tof", "utti"})
would return
"------------\n| 01 | tof |\n------------\n-------------\n| 02 | utti |\n-------------\n".
This assignment requires you to use both of the testing techniques you have learned so far. TerminalUI.java
should be tested first using TerminalUIDriver.java
and test.in and test.exp files as in PA2. The driver code is provided for you below along with one test. Generator.java
should be tested using JUnit and your GeneratorTest.java file will be submitted as part of your submission. Note that the examples given in the method explanations above are provided in JUnit below. Don't forget to include tests for invalid inputs as described for each method.
You should test TerminalUI with several of your own tests, but included here is a pa4TUItest1.in and a pa4TUItest1.exp to give you one verified command-line test.
Below is a set of tests you may find helpful for testing Generator.java.
Assert.assertArrayEquals("Error in test1: wordSplicer", new String[] {"tof", "utti", "magn", "etism"}, Generator.wordSplicer(new String[] {"tofutti", "magnetism"})); Assert.assertArrayEquals("Error in test1: randomizer", new String[] {"dling", "aurus", "edi", "tof", "fice", "gri", "magn", "ll", "bu", "utti", "nder", "etism", "groun", "thes"}, Generator.randomizer(new String[] {"tof", "utti", "magn", "etism", "edi", "fice", "gri", "nder", "groun", "dling", "thes", "aurus","bu", "ll"}, 0)); Assert.assertEquals("Error in test1: clueToString", "1) a small bird\n2) common flavor\n", Generator.clueToString(new String[] {"a small bird", "common flavor"})); String actualBoard = Generator.boardToString(board); Assert.assertEquals("Error in test1: boardToString", "------------\n| 01 | tof |\n------------\n-------------\n| 02 | utti |\n-------------\n", actualBoard);
This assignment has two parts that should be completed in order. By the first deadline you should submit TerminalUI.java
, Generator.java
(stubs that return the examples given above only), and GeneratorTest.java
(one test per method only). By the second deadline you must submit your completed code for all three TerminalUI.java
, Generator.java
, and GeneratorTest.java
through AutoLab.
Read this entire document and complete the code for TerminalUI.java
, the stubs for Generator.java
that return the examples above, and a version of GeneratorTest.java
that has at least one good test for each method. This submission cannot be late!. You must submit by the deadline to get any credit.
Upload your completed Generator.java
, GeneratorTest.java
, and your TerminalUI.java files through AutoLab.
You must implement the above in java, creating a file called TerminalUI.java
, Generatot.java
and GeneratorTest.java
. Before uploading your files, be sure to complete carefully complete the steps below. If you are having trouble getting started, see the Hints section further below.
Your submission will be graded using the following criteria:
Requirement | Points |
---|---|
PART A: TerminalUI.java | 10 |
PART A: Generator.java (stubs) | 5 |
PART A: GeneratorTest.java (100% coverage of stubs) | 10 |
PART A: Checkstyle | 5 |
PART B: Checkstyle | 5 |
PART B: Instructor grading based on style, code quality, comments. | 5 |
PART B: Loop with nested if-else statement (PromptNDisplayHints) | 5 |
PART B: While/do-while context loop (promptForString, promptForInt) | 10 |
PART B: Basic for context loop (clueToString) | 5 |
PART B: Pass arrays as method arguments and return values (wordSplicer) | 5 |
PART B: Manipulate, initialize, copy and compare elements of arrays of Strings (wordSplicer, randomizer) | 10 |
PART B: Generate random numbers based on an algorithm (randomizer) | 5 |
PART B: Use nested loops (boardToString) | 5 |
PART B: JUnit tests 100% coverage and passing | 15 |
Don't put off submission until the last possible minute! Any submission system may become bogged down when it receives a large number of submissions. You may have some unanticipated difficulties uploading your code. It is your responsibility to take these possibilities into account and submit early enough to ensure that the submission process is completed before the deadline. It is recommended that you submit once early, after you have a set of stubs completed, to make sure that you have all of the method and class definitions exactly right.
It would be wise to implement the code in the following order.
Why did we use the colors above (input/output)?
This assignment was originally designed by Dee Weikle and Alvin Chao.