背景:我对编码很新。我正在编写一个基于文本的单人RPG作为学习方法。
所以,我有一个ArrayList,我用它来存储Item类的对象。我想根据扫描器的用户输入检查ArrayList是否存在项(来自Item类的对象)。
如果可能的话,我认为如果我将一个Item传递给开关(基于用户输入)而不是一个字符串,我以后必须“翻译”以使ArrayList与它一起使用它会更清晰。
这可能吗?或者我必须按照我在以下代码中写出的方式进行操作?或者有一种更好的,完全不同的方式去做它我不知道的吗?
public class Test{
//New Array that will store a player's items like an inventory
static ArrayList<Item> newInvTest = new ArrayList<>();
//Placing a test item into the player's inventory array
//The arguments passed in to the constructor are the item's name (as it would be displayed to the player) and number of uses
static Item testWand = new Item("Test Wand", 5);
//Method for when the player wants to interact with an item in their inventory
public static void useItem(){
System.out.print("Which item do you wish to use?\n: ");
Scanner scanner5 = new Scanner(System.in);
String itemChoice = scanner5.nextLine();
itemChoice = itemChoice.toLowerCase();
switch (itemChoice){
case "testwand":
case "test wand":
boolean has = newInvTest.contains(testWand);
if(has == true){
//the interaction occurs
}else{
System.out.println("You do not possess this item: " + itemChoice);
}
}
}
提前感谢您的回答。
答案 0 :(得分:0)
Expression的类型必须是char,byte,short,int,Character,Byte,Short,Integer,String或枚举类型(第8.9节),否则会发生编译时错误。
来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11
这意味着您无法将项目本身传递到交换机中。但是,如果您想拥有可读代码,可能是您的其他团队成员,如果您在一个小组中工作,那么您可以使用散列图和枚举进行切换。
例如:
public enum ItemChoice {
SWORD, WAND, CAT
}
然后是hashmap
HashMap<String, ItemChoice> choice = new HashMap<String, ItemChoice>();
然后使用您期望的值加载hashmap,例如:
choice.put("Wand", ItemChoice.WAND)
然后,您可以轻松地从用户输入中获取枚举值,然后在您的开关中使用它。它比你目前检查字符串的方法更广泛,但它更具可读性,你可以称之为“更干净”。
如果您使用当前的方法,请使用字符串进行检查。然后我建议你从字符串 itemChoice 中删除“”空格,这样就不会对案例进行处理,例如:
case "testwand":
case "test wand":
但相反,你只需要一个案例
case "testwand":
这并没有真正影响任何事情,但既然你没有再次使用布尔值,那么你可以这样做
if(newInvTest.contains(testWand)){
// the interaction occurs
// boolean has is not needed anymore!
}
对于未来的建议,您可能想要创建一个Player对象,这样您就可以将ArrayList保存在播放器对象中,而不是静态变量。此外,它还可以让您轻松地从播放器中轻松保存数据,例如玩家拥有的金额,杀戮次数,级别编号等等......尝试坚持面向对象的编程更好。
例如,您将拥有:
public class Player {
private ArrayList<Item> newInvTest = new ArrayList<>();
private String name;
private int currentLevel;
public String getName(){
return name
}
public int getCurrentLevel(){
return currentLevel
}
public ArrayList<Item> getInventory(){
return newInvTest;
}
}
因此,如果您想获取清单,则可以引用实例变量,而不是静态变量。将这些变量分配给Player对象更有意义,因为它们属于播放器。所以你可以得到这样的清单:
player.getInventory();