Program which guesses a number - java

Hi guys I'm writing a program which plays a guessing game with the user. You need to think of a number and the program will guess it. Here's my code:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Guess a number between 1 do 100 and i'll guess it");
int min = 0;
int max = 100;
int guess = (max-min)/2 + min;
boolean end = false;
while(!end){
System.out.println("zgaduje " + guess);
String userInput = scan.next();
if(userInput.equalsIgnoreCase("too much")){
max = guess;
}
else if(userInput.equalsIgnoreCase("too small")){
min=guess;
}
else if(userInput.equalsIgnoreCase("correct")){
end = true;
}
guess = (max-min)/2 + min;
}
}
}
So the program guesses a number, and then based on the user input (too small or too much) it guesses again. It does not work as it supposed to, it only displays the first guess over again. Do you have any idea what might be wrong here?

You use scan.next();. For input too much, that will return only too.
To read the whole line, you need to use scan.nextLine();

You should use NextLine instead of next:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Guess a number between 1 do 100 and i'll guess it");
int min = 0;
int max = 100;
int guess = (max-min)/2 + min;
boolean end = false;
while(!end){
System.out.println("guess is" + guess);
String userInput = scan.nextLine();
if(userInput.equalsIgnoreCase("too much")){
max = guess;
}
else if(userInput.equalsIgnoreCase("too small")){
min=guess;
}
else if(userInput.equalsIgnoreCase("correct")){
end = true;
}
guess = (max-min)/2 + min;
}
}

Related

how do i implement user input in loop in the following code?

this is guess number programme using constructor but the issue which I am facing
is not able to express user input in loop.I tried to look for it but not good explanation.
import java.util.Scanner;
import java.lang.Math;
class guessnumber{
public int getRandomNumber(int min, int max) {
return (int) ((Math.random() * (max - min)) + min);
}
public String userinput(int repeats,int rand){
String e;
e="that's it";
if(repeats<rand){
String z="choose higher number";
System.out.println(z);
}
else if (repeats>rand){
String z="choose lower number";
System.out.println(z);
}
return e;
}
public String iscorrect(){
String correct="correct number";
return correct;
}
}
public class guessthenumber {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
guessnumber gun = new guessnumber();
System.out.println("enter number ");
int number = sc.nextInt();
System.out.println("enter max and min number");
int min = sc.nextInt();
int max = sc.nextInt();
int o=gun.getRandomNumber(min,max);
System.out.println(o);
if (number < o || number > o) {
System.out.println(gun.userinput(number, o));}
else if(number==o){
String correct= gun.iscorrect();
System.out.println(correct);
}
}
}
I want to user to keep entering data till correct number is hit
Here's a solution that behaves like you're describing, and how your code currently behaves:
ask for a few numbers up front (minimum, maximum)
determine a random "target" number for the user to guess
ask the user to guess – if they're correct, show a message; if they're incorrect, ask for another guess
repeat until their guess is correct
A few things I did:
introduce a "getNumber()" helper that will make sure the numbers make sense – put some guardrails around what a user can enter to minimize unexpected results if user enters unexpected input
use a "while" loop, go forever – while (true)
if their guess matches the target, use break to stop the loop
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int minimum = getNumber(scanner, 0, "minimum");
int maximum = getNumber(scanner, minimum + 1, "maximum");
int target = (int) ((Math.random() * (maximum - minimum)) + minimum);
while (true) {
System.out.print("enter a guess: ");
int guess = scanner.nextInt();
if (guess == target) {
System.out.println("correct guess! the number was " + target);
break;
} else {
System.out.print("nope, please try again.. ");
}
}
}
static int getNumber(Scanner scanner, int minimumAllowed, String numberType) {
while (true) {
System.out.print("enter " + numberType + " number: ");
int minimum = scanner.nextInt();
if (minimum >= minimumAllowed) {
return minimum;
} else {
System.out.println("too small, must be at least " + minimumAllowed);
}
}
}
Here's a sample run:
enter minimum number: 1
enter maximum number: -3
too small, must be at least 2
enter maximum number: 5
enter a guess: 1
nope, please try again.. enter a guess: 2
nope, please try again.. enter a guess: 3
nope, please try again.. enter a guess: 4
correct guess! the number was 4
You can use while and break statements

Why won't my program loop correctly?

I'm new to programming and I'm making a guessing game where the program randomly generates a number between 1 and 10, the user then is asked to guess what the number is, the user should be able to keep guessing until he guesses correctly and the system asks them if they want to play again,
In my code I've printed the number that the system has randomly generated so that it is quicker to complete the game whilst testing. When I try and execute the program and enter the number that the system has generated the message that they are correct and asking if they want to play again does not come up.
Any help would be greatly appreciated!
Thank you in advance,
(Also, anything wrong with this question just tell me, it's my first time asking on here)
Here is my code,
import java.util.Scanner;
import java.util.Random;
public class GuessingGame1 {
public static int randomizer() {
Random rand = new Random();
int num = rand.nextInt(10)+1;
System.out.println(num);
int count = 0;
return num;
}
public static int userInput() {
System.out.println("I've thought of a number between 1 and 10");
System.out.println("Enter your guess...");
Scanner scan = new Scanner(System.in);
int guess = scan.nextInt();
return guess;
}
public static String compare() {
int count = 0;
String result = null;
if (userInput() == randomizer()) {
System.out.println("You guessed it - I was thinking of " + randomizer());
count++;
result = "It took you " + count + " guesses.";
return result;
}
else if (userInput() > randomizer()) {
result = "Lower!";
count++;
return result;
}
else if (userInput() < randomizer()) {
result = "Higher";
count++;
}
return result;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Scanner scanLine = new Scanner(System.in);
String playAgain = "";
do {
randomizer();
do {
userInput();
compare
} while (userInput() != randomizer());
System.out.println("Play again? Yes/No");
playAgain = scanLine.nextLine();
} while (playAgain.equalsIgnoreCase("yes") || playAgain.equalsIgnoreCase("y"));
}
}
The problem is that you call twice to Randomizer!
call randomizer once as parameter to compare and return boolean from compare for a match.
You must change your methods something like this
public static String compare(int a,int b) {
int count = 0;
String result = null;
if (a == b) {
System.out.println("You guessed it - I was thinking of " + b);
count++;
result = "It took you " + count + " guesses.";
return result;
}
else if (a > b) {
result = "Lower!";
count++;
return result;
}
else if (a < b) {
result = "Higher";
count++;
}
return result;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Scanner scanLine = new Scanner(System.in);
String playAgain = "";
int a;
int b;
do {
do {
a=userInput();
b= randomizer();
System.out.println(compare(a,b));
} while (a != b);
System.out.println("Play again? Yes/No");
playAgain = scanLine.nextLine();
} while (playAgain.equalsIgnoreCase("yes") || playAgain.equalsIgnoreCase("y"));
}
}
you have left the () in compare and the count will always be zero as it is been initialized when the compare function is called.

Println printing multiple times instead of increasing for each loop

I'm trying to make this code print out the number of games played (gameNum). Instead, it always sets gameNum to 2, and prints out the last println the number of times that the game was played. I feel like I made a dumb mistake here, but I am having trouble finding it. Could you please give me a hint instead of the answer? I'd like to figure this out on my own. If not, then feel free to go ahead and write the answer.
Thanks!
import java.util.*;
public class Testing_gameNum {
public static final int amt = 1;
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
guessCounter(console);
}
public static int game(Scanner console) {
Random rand = new Random();
int guess = 0;
int guessNum = 0;
System.out.printf("I'm thinking of a number...", amt);
System.out.println();
int num = 1;
do {
System.out.println("Your guess? ");
guess = console.nextInt();
guessNum += guessNum;
} while (guess != num);
return guessNum;
}
public static void guessCounter(Scanner console) {
int gameNum = 1;
int guessNum = game(console);
if (guessNum == 1){
System.out.printf("You won in %d guesses!", guessNum);
System.out.println();
}
gameNum = gameNum + 1;
System.out.println("Do you want to play again?");
String play = console.next();
if (play.equals("y")) {
guessCounter(console);
}
System.out.println("Number of games: " + gameNum);
}
}
Try something like this:
public class Testing_gameNum
{
public static final int amt = 1;
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
guessCounter(console);
}
public static int game(Scanner console)
{
Random rand = new Random();
int guess = 0;
int guessNum = 0;
System.out.printf("I'm thinking of a number...", amt);
System.out.println();
int num = 1;
do
{
System.out.println("Your guess? ");
guess = console.nextInt();
guessNum += amt;
}
while (guess != num);
return guessNum;
}
public static void guessCounter(Scanner console)
{
int gameNum = 1;
do
{
int guessNum = game(console);
if (guessNum == 1)
{
System.out.printf("You won in %d guesses!", guessNum);
System.out.println();
}
gameNum = gameNum + 1;
System.out.println("Do you want to play again?");
String play = console.next();
}
while (play.equals("y"))
System.out.println("Number of games: " + gameNum);
}
}
Check for every place gameNum is used. I found it i.e. in the method guessCounter(Scanner console) - and only there.
So every time you call this method, the value of gameNum is initialized to 1. After the game is won, you increment it by 1 and later on print it, hence the 2 in the output.
Move int gameNum = 1; out of the method guessCounter(Scanner console). This should help.
Aside of this please review also the code block
if (play.equals("y")) {
guessCounter(console);
}
Imagine a player goes on and on, always selecting "y". With every game round, you create another level of recursion. This "do you want to play again" could be implemented by a do-while loop, this will avoid the recursion.
You've defined guessCounter to be a recursive method, but that's probably not what you want for several reasons. First, each time you call guessCounter, you're creating a new gameNum and setting it to 1. You play the game and increment it to 2, but then recurse and never touch that variable again, which is the cause of your bug. Additionally, (although this is unlikely to happen in usual play), you could overflow your stack if you play the game enough times. Each time you play the game, the computer needs to remember the point in code that it needs to return to when it completes that call of guessCounter. Eventually you will run out of memory to store those pointers. Recursion is good for certain problems, but it's better to use loops most of the time.
How about using a loop rather than recursion.
I solved my question! Here's the code (explanation below):
public class Testing_gameNum {
public static final int amt = 1;
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
guessCounter(console);
}
public static int game(Scanner console) {
Random rand = new Random();
int guess = 0;
int guessNum = 0;
System.out.printf("I'm thinking of a number...", amt);
System.out.println();
int num = 1;
do {
System.out.println("Your guess? ");
guess = console.nextInt();
guessNum ++;
} while (guess != num);
return guessNum;
}
public static void guessCounter(Scanner console) {
int gameNum = 0;
String play = "y";
do {
int guessNum = game(console);
gameNum += 1;
if (guessNum == 1) {
System.out.printf("You won in %d guesses!", guessNum);
System.out.println();
}
System.out.println("Do you want to play again?");
play = console.next();
} while (play.equals("y"));
System.out.println("Number of games: " + gameNum);
}
}
MY PROBLEMS: gameNum was resetting each time I called guessCounter. I needed a do/while loop; that way, I could initialize gameNum inside the method, and then loop only the section of the method that needed to be repeated. The repetitive println was linked with that same issue: it was reprinted each time I called guessCounter, as opposed to just the part of the code I wanted repeated.
Thanks for your help, everyone!

High or low game without looping or "while" code [duplicate]

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 am getting error messages concerning my coding. I know Scanf is not a java function, so I am hoping to get help converting it

I know that scanf is not a java function, so i'm hoping someone can help me to understand how to convert this. Research on this topic is difficult to piece together.
This is my code:
import java.util.Scanner;
public class Average {
Scanner Scanner = new Scanner (System.in);
int main (){
int counter;
int number;
int total;
float average;
total = 0;
counter = 0;
System.out.println("Enter the number 0 to end: ");
Scanf("%d", &number);
While (number != 0) {
total = total + number;
counter = counter + 1;
System.out.println("Enter the number 0 to end: ");
Scanf("%d", &number);
}
if(counter != 0) {
average = (float) total / counter;
System.out.println("Average is %.2f\n", average);
} else {
System.out.println("No valid numbers have been entered.");
return 0;
}
}
}
use input like this`
public class seting{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);`
int total = 0;
System.out.printlnln("Enter the value of total :");
total = scan.nextInt(); // use integer input
}
}
You cannot use the same name for the object as for the class. Change Scanner initialization as follows:
Scanner scanObj = new Scanner(System.in);
Replace all your scanf statements with the below:
number = scanObj.nextInt();
These are the changes done to your code:
import java.util.Scanner;
public class one {
public static void main(String[] args) {
Scanner Scanner = new Scanner (System.in);
int counter;
int number = 1;
int total;
float average;
total = 0;
counter = 0;
while(number != 0){
System.out.println("Enter the number 0 to end: ");
number = Scanner.nextInt();
System.out.printf("%d", number);
total = total + number;
counter = counter + 1;
}
if(counter != 0){
average = ((float)total /(float)counter);
System.out.printf("Average is %.2f\n", average);
}
else{
System.out.println("No valid numbers have been entered.");
//return 0;
}
}
}
First the Scanner takes the value the user entered. number = Scanner.nextInt(); This must be done inside your while loop since its the one that check the condition.
The next thing I changed was average = (float) total / counter;
This casts the total value only to a float. use brackets to both ends.
average = ((float)total /(float)counter); like this

Categories