1. Practice. Developing "number guessing
game" step by step
In the lesson we will practise using the basic Java tools learned in previous articles. To do it let's
develop the "Guess game". Its rules are as follows:
Computer proposes a number from 1 to 1000.
Human player tries to guess it. One enters a guess and computer tells if the number
matches or it is smaller/greater than the proposed one.
Game continues, until player guesses the number.
Step 1. Class & main function
Let's call the class "NumberGuessingGame" and add empty main function. It's completely valid
program you can compile and run, but it doesn't print anything to the console yet.
public class NumberGuessingGame {
public static void main(String[] args) {
}
}
Step 2. Secret number
To propose a secret number, we declare a variable secretNumber of type int and use
Math.random() function to give it random value in range 1..1000.
public class NumberGuessingGame {
public static void main(String[] args) {
int secretNumber;
secretNumber = (int) (Math.random() * 999 + 1);
System.out.println("Secret number is " + secretNumber); // to be
removed later
}
2. }
Secret number is 230
Don't worry, if you don't understand how things with random work. It's not a subject of the
lesson, so just believe it. Note, that program exposes secret number to player at the moment, but
we will remove the line printing the proposal in the final version.
Step 3. Asking user for a guess
In order to get input from user, we declare another variable guess of type int. Code, reading
input from user is not to be discussed in detail here, so take it on trust.
import java.util.Scanner;
public class NumberGuessingGame {
public static void main(String[] args) {
int secretNumber;
secretNumber = (int) (Math.random() * 999 + 1);
System.out.println("Secret number is " + secretNumber); // to be
removed
// later
Scanner keyboard = new Scanner(System.in);
int guess;
System.out.print("Enter a guess: ");
guess = keyboard.nextInt();
System.out.println("Your guess is " + guess);
}
}
Secret number is 78
Enter a guess: 555
Your guess is 555
3. Step 4. Checking if guess is right
Now let's check if human player's guess is right. If so program should print corresponding
message. Otherwise, tell user that a guess is smaller/greater than the proposed number. To test
the program let's try all three cases (remember that we peeked the secret number).
import java.util.Scanner;
public class NumberGuessingGame {
public static void main(String[] args) {
int secretNumber;
secretNumber = (int) (Math.random() * 999 + 1);
System.out.println("Secret number is " + secretNumber); // to be
removed
// later
Scanner keyboard = new Scanner(System.in);
int guess;
System.out.print("Enter a guess: ");
guess = keyboard.nextInt();
System.out.println("Your guess is " + guess);
if (guess == secretNumber)
System.out.println("Your guess is correct.
Congratulations!");
else if (guess < secretNumber)
System.out
.println("Your guess is smaller than the secret
number.");
else if (guess > secretNumber)
System.out
4. .println("Your guess is greater than the secret
number.");
}
}
Secret number is 938
Enter a guess: 938
Your guess is 938
Your guess is correct. Congratulations!
Secret number is 478
Enter a guess: 222
Your guess is 222
Your guess is smaller than the secret number.
Secret number is 559
Enter a guess: 777
Your guess is 777
Your guess is greater than the secret number.
Things seem to be working ok.
Step 5. Add tries
At the moment user has only one attempt to guess a number, which is, obvious, not sufficient.
Our next step is about giving user as many attempts as one needs. For this purpose let's use do-
while loop, because user must enter a guess at least once.
import java.util.Scanner;
public class NumberGuessingGame {
public static void main(String[] args) {
int secretNumber;
secretNumber = (int) (Math.random() * 999 + 1);
System.out.println("Secret number is " + secretNumber); // to be
removed
// later
Scanner keyboard = new Scanner(System.in);
5. int guess;
do {
System.out.print("Enter a guess: ");
guess = keyboard.nextInt();
System.out.println("Your guess is " + guess);
if (guess == secretNumber)
System.out.println("Your guess is correct.
Congratulations!");
else if (guess < secretNumber)
System.out
.println("Your guess is smaller than the
secret number.");
else if (guess > secretNumber)
System.out
.println("Your guess is greater than the
secret number.");
} while (guess != secretNumber);
}
}
Secret number is 504
Enter a guess: 777
Your guess is 777
Your guess is greater than the secret number.
Enter a guess: 333
Your guess is 333
Your guess is smaller than the secret number.
Enter a guess: 504
6. Your guess is 504
Your guess is correct. Congratulations!
Final step. Make it glow
Just before we consider the program to be complete, let's remove the code, used for debug
purposes.
import java.util.Scanner;
public class NumberGuessingGame {
public static void main(String[] args) {
int secretNumber;
secretNumber = (int) (Math.random() * 999 + 1);
Scanner keyboard = new Scanner(System.in);
int guess;
do {
System.out.print("Enter a guess (1-1000): ");
guess = keyboard.nextInt();
if (guess == secretNumber)
System.out.println("Your guess is correct.
Congratulations!");
else if (guess < secretNumber)
System.out
.println("Your guess is smaller than the
secret number.");
else if (guess > secretNumber)
System.out
.println("Your guess is greater than the
secret number.");
7. } while (guess != secretNumber);
}
}
Enter a guess (1-1000): 500
Your guess is greater than the secret number.
Enter a guess (1-1000): 250
Your guess is smaller than the secret number.
Enter a guess (1-1000): 375
Your guess is smaller than the secret number.
Enter a guess (1-1000): 437
Your guess is smaller than the secret number.
Enter a guess (1-1000): 468
Your guess is smaller than the secret number.
Enter a guess (1-1000): 484
Your guess is greater than the secret number.
Enter a guess (1-1000): 476
Your guess is greater than the secret number.
Enter a guess (1-1000): 472
Your guess is correct. Congratulations!
Extra tasks
If you would like to practise on your own, there are suggestions of possible improvements:
1. Check, if user enters the number in range 1.1000 and force one to re-enter a guess in case
it is out of bounds.
2. Limit the number of attempts.
3. Add more than one round and wins/loses score.
8. In current practice lesson we are going to develop a menu-driven application to manage simple
bank account. It supports following operations:
deposit money;
withdraw money;
check balance.
Application is driven by a text menu.
Skeleton
First of all, let's create an application to run infinitely and ask user for a choice, until quit option
is chosen:
import java.util.Scanner;
public class BankAccount {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int userChoice;
boolean quit = false;
do {
System.out.print("Your choice, 0 to quit: ");
userChoice = in.nextInt();
if (userChoice == 0)
quit = true;
} while (!quit);
}
}
Your choice, 0 to quit: 2
Your choice, 0 to quit: 6
9. Your choice, 0 to quit: 0
Bye!
Draw your attention to boolean variable quit, which is responsible for correct loop interruption.
What a reason to declare additional variable, if one can check exit condition right in while
statement? It's the matter of good programming style. Later you'll see why.
Menu
Now let's add a menu and empty menu handlers using switch statement:
import java.util.Scanner;
public class BankAccount {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int userChoice;
boolean quit = false;
do {
System.out.println("1. Deposit money");
System.out.println("2. Withdraw money");
System.out.println("3. Check balance");
System.out.print("Your choice, 0 to quit: ");
userChoice = in.nextInt();
switch (userChoice) {
case 1:
// deposit money
break;
case 2:
// withdraw money
10. break;
case 3:
// check balance
break;
case 0:
quit = true;
break;
default:
System.out.println("Wrong choice.");
break;
}
System.out.println();
} while (!quit);
System.out.println("Bye!");
}
}
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 1
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 4
11. Wrong choice.
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 0
Bye!
Bank account's functionality
It's time to add principal functionality to the program:
declare variable balance, default value 0f;
add deposit/withdraw/check balance functionality.
import java.util.Scanner;
public class BankAccount {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int userChoice;
boolean quit = false;
float balance = 0f;
do {
System.out.println("1. Deposit money");
System.out.println("2. Withdraw money");
System.out.println("3. Check balance");
System.out.print("Your choice, 0 to quit: ");
12. userChoice = in.nextInt();
switch (userChoice) {
case 1:
float amount;
System.out.print("Amount to deposit: ");
amount = in.nextFloat();
balance += amount;
break;
case 2:
System.out.print("Amount to withdraw: ");
amount = in.nextFloat();
balance -= amount;
break;
case 3:
System.out.println("Your balance: $" + balance);
break;
case 0:
quit = true;
break;
default:
System.out.println("Wrong choice.");
break;
}
System.out.println();
} while (!quit);
System.out.println("Bye!");
13. }
}
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 1
Amount to deposit: 100
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 2
Amount to withdraw: 50
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 3
Your balance: $50.0
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 0
14. Bye!
Safety checks
At the moment program allows to withdraw more than actual balance, deposit and withdraw
negative amounts of money. Let's fix it, using if statement and conditions combinations.
import java.util.Scanner;
public class BankAccount {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int userChoice;
boolean quit = false;
float balance = 0f;
do {
System.out.println("1. Deposit money");
System.out.println("2. Withdraw money");
System.out.println("3. Check balance");
System.out.print("Your choice, 0 to quit: ");
userChoice = in.nextInt();
switch (userChoice) {
case 1:
float amount;
System.out.print("Amount to deposit: ");
amount = in.nextFloat();
if (amount <= 0)
15. System.out.println("Can't deposit nonpositive
amount.");
else {
balance += amount;
System.out.println("$" + amount + " has been
deposited.");
}
break;
case 2:
System.out.print("Amount to withdraw: ");
amount = in.nextFloat();
if (amount <= 0 || amount > balance)
System.out.println("Withdrawal can't be
completed.");
else {
balance -= amount;
System.out.println("$" + amount + " has been
withdrawn.");
}
break;
case 3:
System.out.println("Your balance: $" + balance);
break;
case 0:
quit = true;
break;
default:
System.out.println("Wrong choice.");
16. break;
}
System.out.println();
} while (!quit);
System.out.println("Bye!");
}
}
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 1
Amount to deposit: -45
Can't deposit nonpositive amount.
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 2
Amount to withdraw: 45
Withdrawal can't be completed.
1. Deposit money
2. Withdraw money
3. Check balance
17. Your choice, 0 to quit: 2
Amount to withdraw: -45
Withdrawal can't be completed.
1. Deposit money
2. Withdraw money
3. Check balance
Your choice, 0 to quit: 0
Bye!
Final source
Program is complete. Below you can find final source code.
import java.util.Scanner;
public class BankAccount {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int userChoice;
boolean quit = false;
float balance = 0f;
do {
System.out.println("1. Deposit money");
System.out.println("2. Withdraw money");
18. System.out.println("3. Check balance");
System.out.print("Your choice, 0 to quit: ");
userChoice = in.nextInt();
switch (userChoice) {
case 1:
float amount;
System.out.print("Amount to deposit: ");
amount = in.nextFloat();
if (amount <= 0)
System.out.println("Can't deposit nonpositive
amount.");
else {
balance += amount;
System.out.println("$" + amount + " has been
deposited.");
}
break;
case 2:
System.out.print("Amount to withdraw: ");
amount = in.nextFloat();
if (amount <= 0 || amount > balance)
System.out.println("Withdrawal can't be
completed.");
else {
balance -= amount;
System.out.println("$" + amount + " has been
withdrawn.");
}
19. break;
case 3:
System.out.println("Your balance: $" + balance);
break;
case 0:
quit = true;
break;
default:
System.out.println("Wrong choice.");
break;
}
System.out.println();
} while (!quit);
System.out.println("Bye!");
}
}