我正在尝试创建一个游戏角色,用户被要求输入一个介于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);
}
}
关于创建人类,您的代码存在几个问题。
问题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;
}
您应该对用户输入进行验证,例如(强度):
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内部设置“