HiveBrain v1.2.0
Get Started
← Back to all entries
patternjavaMinor

"Choose a number between 0-9" game

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
betweenchoosegamenumber

Problem

This is a simple "Choose a number between 0-9" Game. It works perfectly but I'd like to know if there's a way to make my code smaller with the exact same functionality.

```
package firstGame;

import java.util.Scanner;

public class Player {

static Scanner p2Name = new Scanner(System.in);
static Scanner p1Name = new Scanner(System.in);
static Scanner p3Name = new Scanner(System.in);

static Scanner p1Num = new Scanner(System.in);
static Scanner p2Num = new Scanner(System.in);
static Scanner p3Num = new Scanner(System.in);

String name;
int age;
int size;

public static void main(String[] args) {

// Create a random number generator (0-9)
int number = (int) (Math.random() * 10);

// Get Player1's name
System.out.print("Player 1, please enter your name : ");
String p1 = p1Name.nextLine();
System.out.println("Welcome " + p1 + "!");

// Get Player1's chosen number
System.out.println("Please enter a number between 0 and 9");
int p1Choice = p1Num.nextInt();
System.out.println("");

// Get Player2's name
System.out.print("Player 2, please enter your name : ");
String p2 = p2Name.nextLine();
System.out.println("Welcome " + p2 + "!");

// Get Player2's chosen number
System.out.println("Please enter a number between 0 and 9");
int p2Choice = p2Num.nextInt();
System.out.println("");

// Get Player3's name
System.out.print("Player 3, please enter your name : ");
String p3 = p3Name.nextLine();
System.out.println("Welcome " + p3 + "!");

// Get Player3's chosen number
System.out.println("Please enter a number between 0 and 9");
int p3Choice = p3Num.nextInt();
System.out.println("");

Solution

static Scanner p2Name = new Scanner(System.in);
        static Scanner p1Name = new Scanner(System.in);
        static Scanner p3Name = new Scanner(System.in);

        static Scanner p1Num = new Scanner(System.in);
        static Scanner p2Num = new Scanner(System.in);
        static Scanner p3Num = new Scanner(System.in);


You don't need all those scanners. One is plenty.

static Scanner scanner = new Scanner(System.in);


Then replace each call using one of the other variables with scanner.

It's possible that you may have to call scanner.nextLine() after calling scanner.nextInt(). I haven't tried it.

@BKSpurgeon in Java

Here's the @BKSpurgeon solution converted to Java:

Program.java

class Program {

    public static void main(String[] args) {
        GameMaster g = new GameMaster(3);
        g.printResults();
    }

}


Player.java

class Player {

    static Scanner scanner = new Scanner(System.in);

    private String name;       
    private int number;

    public Player(int playerPosition) {
        name = inputName(playerPosition);
        printName();
        number = inputNumber();
        //scanner.nextLine(); // uncomment if needed
    }

    private void printName() {
        System.out.println("Welcome "+ name + "!");
    }

    private int inputNumber() {
        System.out.println("Please enter a number between 0 and 9");

        return scanner.nextInt();
    }

    private String inputName(int playerPosition) {
        System.out.println("Player " + playerPosition + ", please enter your name");

        return scanner.nextLine();
    }

    public String calculateResult(int winningNumber) {
        return name + ((winningNumber == number) ? " won!" : ", you lose!");
    }

}


GameMaster.java

public class GameMaster {

    private final int winningNumber;
    private final List players = new ArrayList<>();

    public GameMaster(int playerCount) {
        winningNumber = chooseWinningNumber();

        for (int i = 1; i <= playerCount; i++) {
            players.add(new Player(i));
        }
    }

    public void printResults() {
        for (Player p : players) {
            System.out.println(p.calculateResult(winningNumber));
        }
    }

    private static int chooseWinningNumber() {
        return (int) (Math.random() * 10);
    }

}


I made a few tweaks to comply with Java coding conventions, but the structure is mostly the same.

I haven't tried to run it, so beware of typos, etc.

Code Snippets

static Scanner p2Name = new Scanner(System.in);
        static Scanner p1Name = new Scanner(System.in);
        static Scanner p3Name = new Scanner(System.in);

        static Scanner p1Num = new Scanner(System.in);
        static Scanner p2Num = new Scanner(System.in);
        static Scanner p3Num = new Scanner(System.in);
static Scanner scanner = new Scanner(System.in);
class Program {

    public static void main(String[] args) {
        GameMaster g = new GameMaster(3);
        g.printResults();
    }

}
class Player {

    static Scanner scanner = new Scanner(System.in);

    private String name;       
    private int number;

    public Player(int playerPosition) {
        name = inputName(playerPosition);
        printName();
        number = inputNumber();
        //scanner.nextLine(); // uncomment if needed
    }

    private void printName() {
        System.out.println("Welcome "+ name + "!");
    }

    private int inputNumber() {
        System.out.println("Please enter a number between 0 and 9");

        return scanner.nextInt();
    }

    private String inputName(int playerPosition) {
        System.out.println("Player " + playerPosition + ", please enter your name");

        return scanner.nextLine();
    }

    public String calculateResult(int winningNumber) {
        return name + ((winningNumber == number) ? " won!" : ", you lose!");
    }

}
public class GameMaster {

    private final int winningNumber;
    private final List<Player> players = new ArrayList<>();

    public GameMaster(int playerCount) {
        winningNumber = chooseWinningNumber();

        for (int i = 1; i <= playerCount; i++) {
            players.add(new Player(i));
        }
    }

    public void printResults() {
        for (Player p : players) {
            System.out.println(p.calculateResult(winningNumber));
        }
    }

    private static int chooseWinningNumber() {
        return (int) (Math.random() * 10);
    }

}

Context

StackExchange Code Review Q#162287, answer score: 4

Revisions (0)

No revisions yet.