Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

I am working on a number guessing game in java. The goal of this game is to guess a 4-digit number according to the game

I am working on a number guessing game in java.

The goal of this game is to guess a 4-digit number according to the game rules. There are a host and a player. The project is designed such that the computer can be either the host or the player. The game works as follows:

1. The host picks a 4-digit number (i.e. any number between 1000 and 9999). Lets call this the base number. In the following example, let's pick 5432 as the base number.

2. The player takes a guess, for example, 1234.

3. The host tells the player how many digits of the guess number match the base number. A match is defined as the same digit in the same position. For example, 1234 and 5432 have 1 match (at position 3); 2345 and 5432 have 0 match even though its the same set of digits, none matches in the exact same position.

4. Based on the number of matches, the player performs some update and takes another guess, say 5533.

5. The host again tells the player the number of matches. This time, 5533 and 5432 have 2 matches.

6. Repeat steps 4 and 5 until the game is over. The game is over when the host tells the player that all 4 digits are matched. Therefore the player has found the base number.

I finished it but when I tried to check it with PlayGame.java, the priorGuesses() method had some problems. It should return all the prior guesses as an int array but all it returned are a bunch of 0 except the first one which returned 1000.

Here is my code(ArrayGame.java):

package guessme;

/**

* An Array-based implementation of the Guess-A-Number game

*/

public class ArrayGame {

// stores the next number to guess

private int guess;

private boolean[] guessArray;

private int count;

private boolean gameOver;

private int bigger;

private int known;

private int lastGuess;

private int perm = 9*10*10*10;

// TODO: declare additional data members, such as arrays that store

// prior guesses, eliminated candidates etc.

// NOTE: only primitive type arrays are allowed, such as int[], boolean[] etc.

// You MAY NOT use any Collection type (such as ArrayList) provided by Java.

/********************************************************

* NOTE: you are allowed to add new methods if necessary,

* but DO NOT remove any provided method, otherwise your

* code will fail the JUnit tests!

* Also DO NOT create any new Java files, as they will

* be ignored by the autograder!

*******************************************************/

// ArrayGame constructor method

public ArrayGame() {

// TODO

guess = 1000;

guessArray = new boolean[perm];

count = 0;

gameOver = false;

bigger = 0;

known = 0;

lastGuess = 0;

for(int i=0;i

guessArray[i] = false;

}

// Resets data members and game state so we can play again

public void reset() {

// TODO

guess = 1000;

guessArray = new boolean[perm];

count = 0;

gameOver = false;

bigger = 0;

known = 0;

lastGuess = 0;

for(int i=0;i

guessArray[i] = false;

}

// Returns true if n is a prior guess; false otherwise.

public boolean isPriorGuess(int n) {

// TODO

return guessArray[n-1000];

}

// Returns the number of guesses so far.

public int numGuesses() {

// TODO

return count;

}

/**

* Returns the number of matches between integers a and b.

* You can assume that both are 4-digits long (i.e. between 1000 and 9999).

* The return value must be between 0 and 4.

*

* A match is the same digit at the same location. For example:

* 1234 and 4321 have 0 match;

* 1234 and 1114 have 2 matches (1 and 4);

* 1000 and 9000 have 3 matches (three 0's).

*/

public static int numMatches(int a, int b) { // DO NOT remove the static qualifier

// TODO

int result = 0;

String aa = Integer.toString(a);

String bb = Integer.toString(b);

for(int i=0;i<4;i++) {

if(aa.charAt(i)==bb.charAt(i)) {

result++;

}

}

return result;

}

/**

* Returns true if the game is over; false otherwise.

* The game is over if the number has been correctly guessed

* or if all candidates have been eliminated.

*/

public boolean isOver() {

// TODO

return gameOver;

}

// Returns the guess number and adds it to the list of prior guesses.

public int getGuess() {

// TODO: add guess to the list of prior guesses.

count++;

guessArray[guess-1000]=true;

return guess;

}

/**

* Updates guess based on the number of matches of the previous guess.

* If nmatches is 4, the previous guess is correct and the game is over.

* Check project description for implementation details.

*

* Returns true if the update has no error; false if all candidates

* have been eliminated (indicating a state of error);

*/

public boolean updateGuess(int nmatches) {

// TODO

if((nmatches-bigger)<=-2)

return false;

if(nmatches==4){

gameOver = true;

return true;

}

bigger = Math.max(nmatches, bigger);

if(nmatches==0){

guess += 1111;

return true;

}

if (nmatches

known += 1;

guess = lastGuess;

}

lastGuess = guess;

guess += Math.pow(10, known);

return true;

}

// Returns the list of guesses so far as an integer array.

// The size of the array must be the number of prior guesses.

// Returns null if there has been no prior guess

public int[] priorGuesses() {

// TODO

int history[] = new int[count];

int i = 0;

if (count == 0)

return null;

for (int j=0;j

if(guessArray[i]){

history[i] = i + 1000;

i++;

}

}

return history;

}

}

Here is the PlayGame.java, this class is designed for you playing as a host and computer as a player.

package guessme;

import javax.swing.JOptionPane;

public class PlayGame {

// Computer as the player of the game

public static void main(String[] args) {

ArrayGame gamer = new ArrayGame();

JOptionPane.showMessageDialog(null, "Think of a number between 1000 and 9999. Click OK when you are ready...",

"Let's play a game", JOptionPane.INFORMATION_MESSAGE);

int guess=0, nmatches=0;

while(!gamer.isOver()) {

// take guess

guess = gamer.getGuess();

String userInput = JOptionPane.showInputDialog("I guess your number is " + guess + ". How many digits are matched?");

if (userInput == null)

System.exit(0);

try {

nmatches = Integer.parseInt(userInput.trim());

}

catch(Exception exception) {

JOptionPane.showMessageDialog(null, "Invalid. Please enter a number between 0 and 4", "Warning",

JOptionPane.WARNING_MESSAGE);

continue;

}

// the number of matches must be between 0 and 4

if (nmatches < 0 || nmatches > 4) {

JOptionPane.showMessageDialog(null, "Invalid. Please enter a number between 0 and 4", "Warning",

JOptionPane.WARNING_MESSAGE);

continue;

}

// update based on user input

if(gamer.updateGuess(nmatches)==false) {

JOptionPane.showMessageDialog(null, "Something is wrong. I don't think your number exists...", "Mistake",

JOptionPane.INFORMATION_MESSAGE);

System.exit(0);

}

}

System.out.println("I got it. Your number was "+guess+".");

System.out.println("I did it in "+gamer.numGuesses()+" rounds. Here is the list of my guesses:");

for(int g : gamer.priorGuesses()) {

System.out.print(g+" ");

}

System.out.println("");

}

}

Here is the HostGame.java, designed for you to play as a player and computer as a host.

package guessme;

import java.util.Random;

import java.util.Scanner;

public class HostGame {

// Computer as the host of the game

public static void main(String[] args) {

Random rnd = new Random();

Scanner conIn = new Scanner(System.in);

int groundtruth = rnd.nextInt(9000)+1000;

System.out.println("I have thought of a number for you to guess. Let's play!");

int nguesses = 0;

while(true) {

// take guess

System.out.print("What's your guess? Input a 4-digit integer: ");

int guess;

try {

guess = conIn.nextInt();

} catch(Exception e) {

conIn.nextLine();

System.out.println("Invalid input!");

continue;

}

if(guess<1000 || guess>9999) {

System.out.println("Your number is out of range!");

continue;

}

nguesses ++;

int nmatches = ArrayGame.numMatches(guess, groundtruth);

if(nmatches==4) {

System.out.print("You have won! ");

break;

}

else {

System.out.println("Almost there. Number of matches: "+nmatches);

}

}

System.out.println("The number I had was "+groundtruth);

System.out.println("You got it in "+nguesses+" rounds.");

conIn.close();

}

}

Can someone tell me the reasons and a solution? Thanks.

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

More Books

Students also viewed these Databases questions

Question

Have you encountered break-even analysis in your work? LO.1

Answered: 1 week ago