当前位置: 首页 > 知识库问答 >
问题:

如何捕获一个值并告诉用户再次输入?

祝俊雄
2023-03-14

我正在尝试创建一个游戏角色,用户被要求输入一个介于0-18之间的数字。我输入19以查看代码是否会告诉我再试一次,但它只是忽略它,然后打印出角色。它对魔法量也有同样的作用。用户应在0之间输入

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个答案

葛桐
2023-03-14

关于创建人类,您的代码存在几个问题。

问题1

第一个问题是,您使用一个all-args构造函数创建了Human。这样,永远不会调用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

您可以使用无参数构造函数,然后调用setter,而不是使用all-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(…),因为它是继承的。这仍然行不通。参见问题4。

问题3

您在setForce th(...)和setMagicAmount(...)中有带有范围检查的规则。问题是这两种方法的范围检查都是错误的,您不需要循环。

解决办法

首先检查值。如果在范围之外告诉用户,否则设置值。

对于set豪斯(...)更改为

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;
}
晏经武
2023-03-14

您应该对用户输入进行验证,例如(强度):

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

另一个问题是,在< code>setStrength中有您的验证登录,但它从未被调用,因为您在构造函数中设置了强度。所以解决办法是:

public Character(String name, int strength) {
    setName(name);
    setStrength(strength);
}
 类似资料:
  • 我创建了以下类,用于输入用户的年龄,然后在控制台中显示适当的信息。 运行此程序时,控制台会询问“请输入您的年龄:”

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 问题内容: 我遇到一种情况(在硒测试期间),在这种情况下,用户将收到安全代码。然后,用户必须先输入安全密码,然后才能继续操作。 我不太确定如何获得用户输入的值。我浏览了硒文档,并提出了这个建议。不幸的是,它并不是很有效。 有人可以指出我正确的方向吗? 问题答案: 似乎您必须先接受并关闭提示,然后才能存储和使用该值

  • 问题内容: 我有一种情况(在selenium测试期间),在这种情况下,用户将收到安全代码。然后,用户必须先输入安全代码,然后才能继续操作。 我不太确定如何获得用户输入的值。我浏览了selenium文档,并提出了这个建议。不幸的是,它并不是很有效。 有人可以指出我正确的方向吗? 问题答案: 似乎您必须先接受并关闭提示,然后才能存储和使用该值

  • 然后,在我的测试中,我执行调用的代码。而测试就是在那条线上失败了。我做错了什么?

  • 问题内容: 我想用Cython包装一个包含C ++和OpenMP代码的测试项目,并通过文件与distutils一起构建它。我文件的内容如下所示: 该标志与gcc一起用于针对OpenMP进行编译和链接。但是,如果我只是调用 由于编译器是clang,因此无法识别此标志: 我尝试指定gcc失败: 如何告诉distutils使用gcc? 问题答案: 尝试使用os.environ从setup.py内部设置“