I'm a novice coder looking for some help. I had to write this program where the user guesses a number between 0 and 100 and then in response is told if it is higher or lower. Below is the code. My question is, sometimes when I put in a number, usually 99 the program terminates and I have no idea why. I have been looking at the code for 2 hours and cannot figure out what causes the program to terminate. Any help would be appreciated.
import java.util.Scanner;
import java.util.Random;
public class Proj71 {
private static int userNumber;
private static int firstguess = 1;
private static int numguess1;
private static int numguess2;
private static int totalguess;
private static Random generator = new Random();
private static Scanner reader = new Scanner(System.in);
private static int compNumber = generator.nextInt(100);
public static void main(String[] args) {
UserGuess();
UserHighGuess();
UserLowGuess();
UserEquals();
}
private static void UserGuess() {
System.out.println("What number am I thinking of between 0 and 100?: ");
userNumber = reader.nextInt();
}
private static void UserHighGuess() {
while (userNumber > compNumber) {
System.out.println("Lower! Try again: ");
userNumber = reader.nextInt();
numguess1++;
}
}
private static void UserLowGuess() {
while (userNumber < compNumber) {
System.out.println("Higher! Try again: ");
userNumber = reader.nextInt();
numguess2++;
}
}
private static void UserEquals() {
if (userNumber == compNumber) {
totalguess = numguess1 + numguess2 + firstguess;
System.out.println("You got it!");
System.out.println("Total number of guess: " + totalguess);
}
}
}
Thanks,
Jmanlikescake (sorry if this post is really bad)
The issue is with the structure of the program.
You are calling
UserGuess();
UserHighGuess();
UserLowGuess();
UserEquals();
What if the number was 50, and the user guessed 30? We'd be in the body of UserLowGuess().
Then imagine the user entered 55. The UserLowGuess() would be broken out of as the userNumber is greater than the compNumber. So then, you would be in UserEquals. But since 55 is not equal to 50, the if statement will not be entered and the program will exit.
I would recommend putting this into one while loop, not three. I haven't tested this, FYI.
This loops continuously accepting user input until a match is found.
public static void main(String[] args) {
UserGuess();
}
private static void UserGuess() {
System.out.println("What number am I thinking of between 0 and 100?: ");
userNumber = reader.nextInt();
totalguess = 1;
while (userNumber != compNumber) {
if (userNumber > compNumber) {
System.out.println("Lower! Try again: ");
} else if (userNumber < compNumber) {
System.out.println("Higher! Try again: ");
}
userNumber = reader.nextInt();
totalguess++;
}
System.out.println("You got it!");
System.out.println("Total number of guess: " + totalguess);
}
Related
This question already has answers here:
Examples of Recursive functions [closed]
(22 answers)
Closed 5 years ago.
I am a student currently using java and I am having a hard time programming a high and low guessing game. I cannot use looping or "while" code. Any thoughts? This is what I have as of now:
public class FinalProject1
{
public static void main(String [] args)
{
System.out.println("Number Guessing Game 1-1000\nGuess a number");
guess();
}
public static int random()
{
int x = (int)(1000*Math.random() + 1);
return x;
}
public static void guess()
{
int num = random();
int tries = 0;
Scanner keyboard = new Scanner(System.in);
String inputString = keyboard.nextLine();
int input = Integer.parseInt(inputString);
if (input > num)
{
System.out.println("Guess a higher number");
inputString = keyboard.nextLine();
}
else if (input < num)
{
System.out.println("Guess a lower number");
inputString = keyboard.nextLine();
}
else if (num == input)
{
System.out.println("You Win");
}
}
}
A few things..
Your > & < checks for higher and lower are backwards
You need to be using recursion in order to produce your intended behavior without any loops.
public static void main(String [] args)
{
System.out.println("Number Guessing Game 1-1000\nGuess a number");
int num = random();
Scanner keyboard = new Scanner(System.in);
guess(keyboard, num);
}
public static int random()
{
int x = (int)(1000*Math.random() + 1);
return x;
}
public static void guess(Scanner keyboard, int goal)
{
String inputString = keyboard.nextLine();
int input = Integer.parseInt(inputString);
if (input < goal)
{
System.out.println("Guess a higher number");
guess(keyboard, goal);
}
else if (input > goal)
{
System.out.println("Guess a lower number");
guess(keyboard, goal);
}
else if (input == goal)
{
System.out.println("You Win");
}
}
Basically what's happening is that we are getting their response and checking if it's > or < the result, telling them, and the immediately calling the guess() method again in order to repeat this process until they get it right.
Wrapping your head around recursion can be fairly difficult in the beginning, just keep practicing
First, your logic is flawed. If input > num then user guessed too high, and needs to guess a lower number.
Others have suggested to use recursion, and that's the common solution for your problem, and is likely what you need to do, since you likely have just learned about recursion.
But, since I like to be contrary, I'd do it by starting a new thread, like this:
public class FinalProject1 implements Runnable {
private Scanner keyboard = new Scanner(System.in);
private int num = random();
public static void main(String[] args) {
System.out.println("Number Guessing Game 1-1000\nGuess a number");
new Thread(new FinalProject1()).start();
}
public static int random() {
return (int) (1000 * Math.random() + 1);
}
#Override
public void run() {
String inputString = this.keyboard.nextLine();
int input = Integer.parseInt(inputString);
if (input > this.num) {
System.out.println("Guess a lower number");
new Thread(this).start();
} else if (input < this.num) {
System.out.println("Guess a higher number");
new Thread(this).start();
} else if (this.num == input) {
System.out.println("You Win");
}
}
}
i'm learning Java with the book think Java : how to think like a computer scientist ? and there is no exercise answers in the book, usually i end up finding similar exercices on different websites but not for this one because i have precise instructions. Can you please tell me if it's correct.
I think the problem is solved, the job is done, but is there an easier way to do it ?
Thanks a lot
Exercise 5-7.
Now that we have conditional statements, we can get back to the “Guess My Number” game from Exercise 3-4.
You should already have a program that chooses a random number, prompts the user to guess it, and displays the difference between the guess and the chosen number.
Adding a small amount of code at a time, and testing as you go, modify the program so it tells the user whether the guess is too high or too low, and then prompts the user for another guess.
The program should continue until the user gets it right. Hint: Use two methods,
and make one of them recursive.
import java.util.Random;
import java.util.Scanner;
public class GuessStarter {
public static void Lower(int number,int number2) {
Scanner in = new Scanner(System.in);
System.out.print("Too Low , try again ");
number2 = in.nextInt();
if (number2==number) {
System.out.println("You're right");}
else if (number2>number)
Higher(number,number2);
else
Lower(number,number2); }
public static void Higher(int number,int number2) {
Scanner in = new Scanner(System.in);
System.out.print("Too high , try again ");
number2 = in.nextInt();
if (number2==number) {
System.out.println("You're right");}
else if (number2>number)
Higher(number,number2);
else
Lower(number,number2); }
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Random random = new Random();
int number = random.nextInt(100) + 1;
int number2;
System.out.print("Type a number: ");
number2 = in.nextInt();
if (number2==number) {
System.out.println("You're right");}
else if (number2>number)
Higher(number,number2);
else
Lower(number,number2);}
}
Don't know if it'll be useful now or not, but, as I was solving the same solution, thought of letting it know if someone finds it useful:
import java.util.Random;
import java.util.Scanner;
/**
* Created by RajU on 27-Jun-17.
*/
public class GuessNumber2 {
static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
message("I'm thinking of a number between 1 and 10 (including both).\n" +
"Can you guess what it is?\n" +
"Type a number: ");
int userNumber = input.nextInt();
tryAgain(userNumber, calculateRandom(10));
}
public static int calculateRandom(int n) {
Random random = new Random();
return random.nextInt(n) + 1;
}
public static void tryAgain(int userNumber, int generateRandom) {
if (userNumber == generateRandom) {
message("You're absolutely right!");
} else {
if (userNumber > generateRandom) {
message("Think of a lesser number: ");
} else {
message("Think of a greater number: ");
}
userNumber = input.nextInt();
tryAgain(userNumber, generateRandom);
}
}
public static void message(String m) {
System.out.print(m);
}
}
I just completed this exercise. It's pretty interesting to see some different approaches! Here's my take on it:
import java.util.Random;
import java.util.Scanner;
public class GuessGameLevelUp {
/*
* A guessing game where you try to guess a random number between and including 1 and 100.
* This version allows you to continue guessing until you get the right answer.
* When you're off, a hint will let yet know whether your most recent guess was too high or low.
*/
public static void main (String [] args) {
//Generates a random number for the game
Random random = new Random();
int answer = random.nextInt(100) +1;
//Introduces the game and gives a prompt
System.out.println("I'm thinking of a number between and including "
+ "1 and 100, can you guess which?");
System.out.print("Take a guess: ");
//Enables guess value input and parrots guess
Scanner in = new Scanner(System.in);
int guess;
guess = in.nextInt();
System.out.println("Your guess is: "+guess);
//Stacks a new class to determine the outcome of the game
tooHighTooLow(answer, guess);
}
public static void tooHighTooLow(int a, int g) {
//Triggers and parrots guess if correct
if (a==g) {
System.out.print("Correct! The number I was thinking of was: "+g);
//Triggers "Too Low" prompt and uses recursive to offer another attempt
} else if (a>g) {
System.out.print("Too Low! Try again: ");
Scanner in = new Scanner(System.in);
g = in.nextInt();
System.out.println("Your guess is: "+g); //Parrots guess
tooHighTooLow(a, g);
//Triggers "Too High" prompt and uses recursive to offer another attempt
}else
System.out.print("Too high! Try again: ");
Scanner in = new Scanner(System.in);
g = in.nextInt();
System.out.println("Your guess is: "+g); //Parrots guess
tooHighTooLow(a, g);
}
}
I got stuck on this one too, but your code helped me in arriving at a solution. Here's what I came up with:
import java.util.Random;
import java.util.Scanner;
public class Ch5Ex7 {
public static void compareNumbers(int userNumber,int randomNumber) {
if(userNumber == randomNumber) {
System.out.println("You got it!");
} else if ( userNumber > randomNumber ) {
System.out.println("Too high. Guess again: ");
Scanner in = new Scanner(System.in);
userNumber = in.nextInt();
compareNumbers(userNumber, randomNumber);
} else {
System.out.print("Too low. Guess again: ");
Scanner in = new Scanner(System.in);
userNumber = in.nextInt();
compareNumbers(userNumber,randomNumber);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Random random = new Random();
int randomNumber = random.nextInt(100) + 1;
int userNumber;
System.out.print("Type a number: ");
userNumber = in.nextInt();
compareNumbers(userNumber, randomNumber);
}
}
Thanks for pointing me in the right direction!
Hi guys sorry I'm a newbie to Java, this is one of the exercise in my class.
I supposed to ask user input 5 numbers, then compare them if they are the same number that entered before.
These are my code so far, but I can't get it work.
Thanks.
import java.util.Scanner;
public class Source {
private static int num = 0;
private static int[] enterednum = new int[5];
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
for(int count = 0; count < enterednum.length; count++) {
System.out.println("Enter a number.");
num = input.nextInt();
compare(enterednum);
}
System.out.println("These are the number you have entered: ");
System.out.println(enterednum);
}
public static void compare(int[] enterednum) {
for(int count = 0; count < 6; count++)
if(num == enterednum[count])
System.out.println("The number has been entered before.");
}
}
You may want something like this:
import java.util.Scanner;
public class Source
{
private static int enterednum[]=new int[5];
public static void main(String args[])
{
int num=0; // make this local variable since this need not be class property
Scanner input = new Scanner(System.in);
for(int count=0;count<enterednum.length;count++)
{
System.out.println("Enter a number.");
num = input.nextInt();
compare(num, count);
enterednum[count] = num; // store the input
}
System.out.println("These are the number you have entered: ");
// print numbers in array instead the array
for(int count=0;count<enterednum.length;count++)
{
System.out.println(enterednum[count]);
}
}
// change the method signature to let it get the number of input
public static void compare(int num, int inputcount)
{
for(int count=0;count<inputcount;count++)
{
if(num==enterednum[count])
System.out.println("The number has been entered before.");
}
}
}
You can do this way if you need.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Source {
public static void main(String[] args) throws IOException {
// I used buffered reader because I am familiar with it :)
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// Create a Set to store numbers
Set<Integer> numbers = new HashSet<>();
for (int i = 0; i < 5; i++) {
System.out.print("Enter a number: ");
String line = in.readLine();
int intValue = Integer.parseInt(line);
// You can check you number is in the set or not
if (numbers.contains(intValue)) {
System.out.println("You have entered " + intValue + " before");
} else {
numbers.add(intValue);
}
}
}
}
import java.util.Scanner;
public class program4
{
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
System.out.println(" Hello and welcome to the program ");
System.out.println("Enter your number.");
int number = input.nextInt();
int integerDoubled;
System.out.println("Your result is" + doubleNumber(number));
System.out.println(" thank you for using my program ");
}
public static int doubleNumber (int x){
int integerDoubled;
return integerDoubled = (x*2);
}
if (integerDoubled < 100 ); {
less_100(integerDoubled);
} else if ;
greater_100(integerDoubled);
public static int less_100 (int integerDoubled)
{
int integerDoubled;
return integerDoubled =(x*2);
}
public static int greater_100 (int integerDoubled)
{
int integerDoubled;
return integerDoubled =(x*3);
}
}
}
I think the error is in the If statement but i don't know how to fix it.
I know integerDoubled is a local variable and i should make it global but I'm not sure how to do that. should i put the if statement together with the doubleNumber function??
If you formatted your code (your IDE will do this for you), you would see that the if statement is not inside a method as it must be. If you use your IDE correctly, finding and correcting such error would be much faster and you barely have to think about it.
I tried to make sense of your program this is what I came up with
import java.util.Scanner;
public class T
{
public static int doubleNumber (int x){
int integerDoubled;
return integerDoubled = (x*2);
}
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
System.out.println(" Hello and welcome to the program ");
System.out.println("Enter your number.");
int number = input.nextInt();
int integerDoubled=doubleNumber(number);
System.out.println("Your result is" + integerDoubled);
System.out.println(" thank you for using my program ");
if (integerDoubled < 100 ) {
less_100(integerDoubled);
}
else
greater_100(integerDoubled);
}
public static int less_100 (int integerDoubled)
{
return integerDoubled =(integerDoubled*2);
}
public static int greater_100 (int integerDoubled)
{
return integerDoubled =(integerDoubled*3);
}
}
Trying to make my first program "A Basic Mind Game".
Every time I try to run it nothing shows up and don't know what's wrong.
Hope that you can give me some hand or advice.
BTW, I'm pretty much a NOOB at Java Programing so take it easy with the comments :)
Here is the code:
import java.util.*;
import java.util.Scanner.*;
import java.util.ArrayList.*;
public class Main {
public static void start() {
int answer = (int) (Math.random() * 1000 + 1) ;
int tries = 0 ;
int player ;
String name = "name" ;
String quit = "quit";
String y = "yes";
String n = "no";
String guess = ("player") ;
String another = ("Y") ;
Scanner input = new Scanner (System.in);
System.out.println( " Welcome to Guessing Game " ) ;
System.out.print("Please enter a number between 1 and 1000 : ");
player = input.nextInt();
long startTime = System.currentTimeMillis();
int currentGuess = -1;
while(another.equalsIgnoreCase("y")) {
do
{
if (guess.equalsIgnoreCase(quit))
{
System.out.println("Leaving Us So Soon?");
System.exit(0);
}
try {
currentGuess = Integer.parseInt(guess);
} catch (NumberFormatException nfe)
{
System.out.println("Stupid Guess I Wont Count That.");
player = input.nextInt();
tries++;
}
if (currentGuess < answer )
{
System.out.println("too low");
player = input.nextInt();
tries++;
}
else if(currentGuess > answer )
{
System.out.println("too high");
player = input.nextInt();
tries++;
}
//if the guess is invalid
if (currentGuess < 0 || currentGuess > 1000)
{
System.out.println("Stupid Guess I Wont Count That.");
player = input.nextInt();
tries++;
}
else if (currentGuess == answer)
{
//stop stop watch
long endTime = System.currentTimeMillis();
//calculate game time
long gameTime = endTime - startTime;
System.out.println("You Rock Dude, Good Job!");
System.out.println("You guessed " + tries + " times in " + (int)(gameTime/1000) + " seconds.");
System.out.println("Please enter your name.");
name = input.nextLine();
}
} while (player != answer);
Scanner playGame = new Scanner(System.in);
System.out.print("Want to go again?(y/n).....");
another = playGame.nextLine();
}
}
public static void main(String[] args) {
}
}
Your main method is empty.
The main method contains the code that will run when the application starts. If the main method is empty, nothing will happen when you run your application.
If this isn't a troll I'll be stunned. The reason nothing shows up is because in your
static void main method you don't have any code for the program to execute.
Java's main method is main. Thus, you must run your code from main:
public static void main(String[] args) {
start();
}
public static void main(String[] args)
{
start();
}
Make that change and see if it's better.
Sounds like homework, however this should do the trick.
public static void main(String[] args) {
Main.start();
}
After your "public class Main{ " line, put "start();" then proceed your code.