Java 根据用户输入分配枚举
我正在尝试构建一个简单的控制台Tictatcoe游戏。我正试图让用户选择圆圈或交叉来作为游戏。我有一个循环和交叉的枚举 每次运行程序时,我都会得到else输出,即使我输入“圆圈”或“十字” 不是寻找代码答案,只是想看看是否有人能为我指出错误的方向Java 根据用户输入分配枚举,java,Java,我正在尝试构建一个简单的控制台Tictatcoe游戏。我正试图让用户选择圆圈或交叉来作为游戏。我有一个循环和交叉的枚举 每次运行程序时,我都会得到else输出,即使我输入“圆圈”或“十字” 不是寻找代码答案,只是想看看是否有人能为我指出错误的方向 import java.util.Scanner; public class Game { private Model model; private Model player; public Game() {
import java.util.Scanner;
public class Game {
private Model model;
private Model player;
public Game() {
Scanner input = new Scanner(System.in);
System.out.println("Do you want to play as Cross or Circle");
input.nextLine();
if(input.equals(Model.valueOf("CROSS"))) {
player = Model.CROSS;
} else if(input.equals(Model.valueOf("CIRCLE"))) {
player = Model.CIRCLE;
} else {
System.out.println("Invalid choice, please choose either Circle or Cross");
}
}
}
input
是一个Scanner
,永远不会等于枚举实例。您需要存储input.nextLine()
的结果并进行比较
String line = input.nextLine();
if (line.equals("CROSS")) {
...
} else if (line.equals("CIRCLE")) {
...
} else {
...
}
input
是一个Scanner
,永远不会等于枚举实例。您需要存储input.nextLine()
的结果并进行比较
String line = input.nextLine();
if (line.equals("CROSS")) {
...
} else if (line.equals("CIRCLE")) {
...
} else {
...
}
从JDK 11文档中,类Enum的方法
valueOf
返回具有指定名称的指定枚举类型的枚举常量。名称必须与用于在此类型中声明枚举常量的标识符完全匹配。(不允许使用无关的空白字符。)
请注意,对于特定的枚举类型T,可以使用该枚举上隐式声明的公共静态T valueOf(String)方法代替此方法,以从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式公共静态T[]values()方法获得
也许你想这样写你的if
String line = input.nextLine();
if(Model.CROSS == Model.valueOf(line.trim())) {
player = Model.CROSS;
} else if(Model.CIRCLE == Model.valueOf(line.trim())) {
player = Model.CIRCLE;
} else {
System.out.println("Invalid choice, please choose either Circle or Cross");
}
另一个优点是
stringline=input.nextLine()
如何在这里建议另一个答案来自JDK 11 doc类Enum的方法valueOf
返回具有指定名称的指定枚举类型的枚举常量。名称必须与用于在此类型中声明枚举常量的标识符完全匹配。(不允许使用无关的空白字符。)
请注意,对于特定的枚举类型T,可以使用该枚举上隐式声明的公共静态T valueOf(String)方法代替此方法,以从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式公共静态T[]values()方法获得
也许你想这样写你的if
String line = input.nextLine();
if(Model.CROSS == Model.valueOf(line.trim())) {
player = Model.CROSS;
} else if(Model.CIRCLE == Model.valueOf(line.trim())) {
player = Model.CIRCLE;
} else {
System.out.println("Invalid choice, please choose either Circle or Cross");
}
另一个优点是
stringline=input.nextLine()
如何建议此处的另一个答案您试图检查scanner对象是否等于枚举的字符串值,而不是将nextLine()返回值保存到字符串变量,并检查变量是否相等,最好使用equalsIgnoreCase
public Game() {
Scanner scanner = new Scanner(System.in);
System.out.println("Do you want to play as Cross or Circle");
String input = scanner.nextLine();
if(input.equalsIgnoreCase(Model.CIRCLE.name())) {
player = Model.CROSS;
} else if(input.equalsIgnoreCase(Model.CROSS.name())) {
player = Model.CIRCLE;
} else {
System.out.println("Invalid choice, please choose either Circle or Cross");
}
}
您试图检查scanner对象是否等于枚举的字符串值,而不是将nextLine()返回值保存到字符串变量,并检查变量是否相等,最好使用equalsIgnoreCase
public Game() {
Scanner scanner = new Scanner(System.in);
System.out.println("Do you want to play as Cross or Circle");
String input = scanner.nextLine();
if(input.equalsIgnoreCase(Model.CIRCLE.name())) {
player = Model.CROSS;
} else if(input.equalsIgnoreCase(Model.CROSS.name())) {
player = Model.CIRCLE;
} else {
System.out.println("Invalid choice, please choose either Circle or Cross");
}
}
Ops,我发布了另一个解决方案,但我错过了它,请点击这里:-)但我也留下了我的,给一些API知识,在使用该方法之前,该人员需要阅读文档:-)Ops,我发布了另一个解决方案,但我错过了它,更新此:-)但我也留下了一些API知识,在使用该方法之前,该人员需要阅读文档:-)在控制台输入中处理选项时,另一种常用的方法是枚举ex(1)选项A,(2)选项B。。。等等。用户输入与选项关联的数字/字符,这通常会使处理此类情况变得更简单。在您的情况下,您可以使用
string
的equalsIgnoreCase
方法在if语句中进行字符串比较,然后您将不需要使用valueOf
您可以设置直接枚举到player
。在控制台输入中处理选项时,另一种常用的方法是枚举ex(1)选项A,(2)选项B。。。等等。用户输入与选项关联的数字/字符,这通常会使处理此类情况变得更简单。在您的情况下,您可以使用string
的equalsIgnoreCase
方法在if语句中进行字符串比较,然后您将不需要使用valueOf
您可以设置直接枚举到播放器
。