practice

19
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 }

Upload: daman-toor

Post on 15-Jul-2015

202 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Practice

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

}

Page 2: Practice

}

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

Page 3: Practice

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

Page 4: Practice

.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);

Page 5: Practice

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

Page 6: Practice

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.");

Page 7: Practice

} 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.

Page 8: Practice

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

Page 9: Practice

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

Page 10: Practice

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

Page 11: Practice

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: ");

Page 12: Practice

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!");

Page 13: Practice

}

}

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

Page 14: Practice

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)

Page 15: Practice

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.");

Page 16: Practice

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

Page 17: Practice

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");

Page 18: Practice

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.");

}

Page 19: Practice

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!");

}

}