Original question can be found here
I took the advice I got to heart, and re-wrote it. Once again I'd appreciate any advice as to how I can improve this using best practices.
Jar.java
package com.tn.jar;
public class Jar {
private String itemName;
private int numberOfItems;
private int numberToGuess;
private int numberOfGuesses;
/*
* Default constructor
*/
public Jar() {
this.numberOfGuesses = 0;
}
/*
* Getters
*/
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public int getNumberOfItems() {
return numberOfItems;
}
public void setNumberOfItems(int numberOfItems) {
this.numberOfItems = numberOfItems;
}
public int getNumberToGuess() {
return numberToGuess;
}
/*
* Setters
*/
public void setNumberToGuess(int numberToGuess) {
this.numberToGuess = numberToGuess;
}
public int getNumberOfGuesses() {
return numberOfGuesses;
}
public void setNumberOfGuesses(int numberOfGuesses) {
this.numberOfGuesses = numberOfGuesses;
}
public void incrementNumberOfGuesses() {
numberOfGuesses++;
}
}
Prompter.java
package com.tn.jar;
import java.util.Random;
import java.util.Scanner;
public class Prompter {
private Jar jar;
private Scanner scanner;
/*
* Public constructor
*/
public Prompter(Jar jar) {
this.jar = jar;
this.scanner = new Scanner(System.in);
}
/*
* Method that actually starts the game
*/
public void play() {
adminSetup();
playerSetup();
}
/*
* Admin setup
*/
private void adminSetup() {
printTitle("Administrator setup");
setupGame();
}
/*
* Player setup
*/
private void playerSetup() {
printTitle("Player");
gameExplanation();
areYouReady();
getGuess();
}
/*
* Setup game.
* The user is prompted with a couple of questions for filling the jar instance.
*/
private void setupGame() {
String itemName = askQuestion("Name of items in the jar: ");
String numberOfItems = askQuestion("Maximum of lentils in the jar: ");;
while(isNan(numberOfItems)) {
numberOfItems = askQuestion("Maximum of lentils in the jar: ");
}
jar.setItemName(itemName);
jar.setNumberOfItems(Integer.parseInt(numberOfItems));
jar.setNumberToGuess(new Random().nextInt(Integer.parseInt(numberOfItems)) + 1);
}
/*
* User must confirm whether or not he is ready to play before the game starts.
*/
private void areYouReady() {
do {
System.out.print("Ready? (press ENTER to start guessing): ");
} while (scanner.nextLine().length( ) > 0);
}
/*
* The user can guess the answer. It will loop until the answer is correct.
*/
private void getGuess() {
do {
System.out.print("Guess: ");
jar.incrementNumberOfGuesses();
} while(guess() != jar.getNumberToGuess());
printResult();
}
/*
* Utility method for getting the users guess
*/
private int guess() {
String answer = scanner.nextLine();
while(isNan(answer)) {
System.out.print("Guess: ");
answer = scanner.nextLine();
}
return Integer.parseInt(answer);
}
/*
* Some explanation before the game starts.
*/
private void gameExplanation() {
System.out.printf("Your goal is to guess how many lentils are in the jar. Your guess should be between 1 and %d%n", jar.getNumberOfItems());
}
/*
* Utility method that accepts input.
*/
private String askQuestion(String question) {
System.out.print(question);
String result = scanner.nextLine();
return result;
}
/*
* Utility method for printing out headers
*/
private void printTitle(String title) {
System.out.printf("%n%s%n=========================%n%n", title.toUpperCase());
}
/*
* When the user answers correctly, he recieves the game stats.
*/
private void printResult() {
System.out.printf("%nCongratulations - you guessed that there are %d" +
" lentils in the jar! It took you %d" +
" guess(es) to get it right.%n", jar.getNumberToGuess(), jar.getNumberOfGuesses());
}
/*
* Utility method for checking if the string read by the system can be parsed as an integer
*/
private static boolean isNan(String string) {
try {
Integer.parseInt(string);
} catch(NumberFormatException nfe) {
return true;
}
return false;
}
}
Game.java
package com.tn.jar;
public class Game {
public static void main(String[] args) {
Jar jar = new Jar();
Prompter prompter = new Prompter(jar);
prompter.play();
};
}