Как поймать значение и сказать пользователю ввести снова? - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь создать игрового персонажа, и пользователю предлагается ввести число от 0 до 18. Я ввожу 19, чтобы увидеть, скажет ли мне код попробовать еще раз, но он просто игнорирует его и затем печатает символ. Это также делает то же самое для количества маги c. Пользователь должен ввести значение от 0 до 50, но если я введу число больше 50, оно все равно будет его печатать. Я хочу, чтобы код сообщал мне, что ввод был неправильным, и попробуйте снова. Можно ли попросить пользователя повторить попытку без исключения?

public class Character {

    private String name;
    private int strength;

    public Character() {
        name = "TBD";
        strength = 15;
    }

    public Character(String name, int strength) {
        this.name = name;
        this.strength = strength;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;   
    }

    public int getStrength() {
        return strength;
    }

    public void setStrength(int strength) {
        int count = 1;
        while (true) { 
            if (strength >= 0 && strength <= 18) {
                System.out.println("Value is out of range 0-18");
                System.out.println("Please try again");
                break;
            }
            else {
                this.strength = strength;
                count = 0;
            }
        }
    }

    public String toString() {
        return "Name: " + name + ", Strength: " + strength;
    }
}
public class Human extends Character {

    private String name;
    private int strength;
    private String weapon;
    private int magicAmount;

    public Human(String name, int strength, String weapon, int magicAmount) {
        this.name = name;
        this.strength = strength;
        this.weapon = weapon;
        this.magicAmount = magicAmount;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getStrength() {
        return strength;
    }

    public void setStrength(int strength) {
        this.strength = strength;
    }

    public String getWeapon() {
        return weapon;
    }

    public void setWeapon(String weapon) {
        this.weapon = weapon;
    }

    public int getMagicAmount() {
        return magicAmount;
    }

    public void setMagicAmount(int magicAmount) {
        int count = 1;
        while (count != 0) {
            if ((magicAmount >= 0 && magicAmount <= 50)) {
                System.out.println("Value is out of range 0-50");
                System.out.println("Please try again");
                break;
            }
            else {
                this.magicAmount = magicAmount;
                count = 0;
            }           
        }
    }

    public String toString() {
        return "Human [Name: " + name + ", Strength: " + strength + ", Weapon: " 
                + weapon + ", Magic Amount: " + magicAmount + "]";
    }
}

    ArrayList<Character> characters = new ArrayList<Character>();

    String keepLooping = "y";

    do {
        System.out.println("Which character would you like to create (Human, Robot, or Animal): ");
        String choice = input.nextLine();

        if (choice.equalsIgnoreCase("Human")) {

            System.out.println("Enter a name for the Human: ");
            String name = input.next();

            System.out.println("Enter the amount of stength for Human (0-18): ");
            int strength = input.nextInt();

            input.nextLine();
            System.out.println("Enter a weapon for Human (Sword or Dagger): ");
            String weapon = input.nextLine();

            System.out.println("Enter the magic amount for your selected weapon (0-50): ");
            int magicAmount = input.nextInt();

            Human charH = new Human(name, strength, weapon, magicAmount);
            characters.add(charH);
        }

        input.nextLine();
        System.out.println("Would you like to create more characters - y or n");
        keepLooping = input.nextLine();
    }

    while (keepLooping.equalsIgnoreCase("y"));

    for (int i = 0; i < characters.size(); i++) {
        Character c = characters.get(i);
        System.out.println(c);
    }
}

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Вы должны выполнить проверку на вводе пользователем, например (сила):

Integer strength = null;
while (strength == null) {
    System.out.println("Enter the amount of stength for Human (0-18): ");
    strength = input.nextInt();

    if (strength < 0 || strength > 18) {
        strength = null;
        System.out.println("Invalid strength, please try again");
    }
}

Другая проблема заключается в том, что у вас есть проверочный логин в setStrength, но это никогда не вызывается, так как вы установить силу в конструкторе. Таким образом, исправление будет:

public Character(String name, int strength) {
    setName(name);
    setStrength(strength);
}
0 голосов
/ 16 февраля 2020

В вашем коде есть несколько проблем, связанных с созданием Человека.

Задача 1

Первая проблема - создание Человека с конструктором всех аргументов. Таким образом, setStrength (...) и setMagicAmount (...) никогда не вызываются.

Решение 1

Используйте сеттеры. Обратите внимание, это все равно не будет работать. См. Задачи 2 и 3.

public Human(String name, int strength, String weapon, int magicAmount) {
    this.name = name;
    //this.strength = strength;
    setStrength(strength); // not this will still not work! Problem 2 and 3
    this.weapon = weapon;
    //this.magicAmount = magicAmount;
    setMagicAmount(magicAmount); // Will still not work. See Problem 3
}

Решение 2

Вместо того, чтобы иметь конструктор all args, вы можете иметь конструктор no args и затем вызывать сеттеры. Все равно не будет работать. Se задачи 2 и 3.

Human human = new Human();
human.setName(name);
human.setStrength(strength); // will not work. See problem 2 and 3
human.setWeapon(weapon);
human.setMagicAmount(magicAmount); // will not work. See problem 3

Задача 2

Класс Human расширяет Характер, но все же вы переопределяете метод setStrength (...) внутри человека. У этого метода нет никаких правил.

Удалите этот метод внутри Human, и будет вызван правильный setStrength (...) из Character с правилами, потому что он наследуется. Это все равно не будет работать. См. Задачу 4.

Задача 3

У вас есть правила внутри setStrength (...) и setMagicAmount (...) с проверками диапазона. Проблема в том, что проверка диапазона для обоих методов неверна и вам не нужна l oop.

Решение

Сначала проверьте значение. Если за пределами диапазона сообщите пользователю, в противном случае установите значение.

Для setStrength (...) измените на

public void setStrength(int strength) {
    if (strength < 0 || strength > 18) { // less than 0 or more than 18
        throw new IllegalArgumentException("Value is out of range 0-18");
    }
    this.strength = strength;
} 

Для setMagicAmount (...) измените на

public void setMagicAmount(int magicAmount) {
    if (magicAmount < 0 || magicAmount > 50) { // less than 0 or more than 50
        throw new IllegalArgumentException("Value is out of range 0-50");
    }
    this.magicAmount = magicAmount;
}
...