在我制作的游戏中,团队以颜色命名(例如RED,BLUE,CYAN)。我现在要做的就是获得玩家所在团队的名称并绘制玩家的名字和团队(以测试一切是否正常并发现错误)。现在,有一个错误:玩家的名字与其实际上的团队的颜色不同。这就是它的来源;如果我可以绘制玩家所在团队的名称,我可以通过找到团队的名称与玩家的颜色相比,在我的代码中找到错误。 这是我现在的代码,试图获取团队的名称:
import java.awt.Color;
import java.util.ArrayList;
public class Team {
ArrayList<Player> players;
Color color;
public Team(ArrayList<Player> players, Color color) {
this.players = players;
this.color = color;
}
public ArrayList<Player> getPlayers(){
return players;
}
public Color getColor() {
return color;
}
public String getName() {
if(color == Color.red) {
return "red";
}
}
}
我能想到完成此任务的唯一方法是在getName()
方法中重复if语句,但这需要花费大量时间来循环并花费大量时间进行编码。
答案 0 :(得分:3)
首先,您无法与==
进行比较,因为Color是一个类,而不是枚举。
请改用.equals()
方法。
其次(出于同样的原因)您可以创建一个包含所有已知颜色名称的哈希表,并使用Color作为哈希键。
Map<Color, String> knownColorNames; // initialize with all known color names
public String getName() {
return knownColorNames.getOrDefault(color, "unknown color name");
}
如果颜色没有指定名称,则需要返回一些默认名称。
答案 1 :(得分:2)
使用枚举而不是java.awt.color
:
enum Color {
RED, GREEN, CYAN;
@Override
public String toString() {
return super.toString().toLowerCase();
}
}
在你的getName方法中,只需返回color.toString()
。
不需要地图或反射
答案 2 :(得分:1)
作为Public Shared Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs)
Dim sp As SerialPort = CType(sender, SerialPort)
Dim data As String = sp.ReadExisting()
'Mitteilung.
Main.MessageObject.MyMessage("incoming serial data: ", CStr(data), 3)
'Log [LogDeviceToWrapper]
Main.LogObject.MyLog(CStr(data), "LogDeviceToWrapper")
End Sub
方法(我实际上更喜欢)的替代方法,您可以将名称放在地图中。
enum
答案 3 :(得分:1)
我可以建议一张地图。
Map<Color, String> colorNames = new HashMap<>();
然后填充地图。
colorNames.put(Color.BLUE, "blue");
public String getName(Color c){
return colorNames.computeIfAbsent(c, key->Long.toHexString(key));
}
您可以使用文本文件填充地图,也可以浏览Color类并使用反射获取所有静态字段。
这是一种使用反射自动创建映射的方法。
Map<Color, String> names = new HashMap<>();
Field[] fields = Color.class.getDeclaredFields();
for(Field f: fields){
if(f.getType()==Color.class){
names.put((Color)f.get(Color.class), f.getName());
}
}
System.out.println(names.get(Color.YELLOW));
//YELLOW
请注意,由于名称冲突,某些颜色可能会被覆盖。例如。黑色和黑色。
答案 4 :(得分:1)
我改编了它:
import java.awt.Color;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws IllegalAccessException {
Class clazz = Color.class;
Field[] colorFields = clazz.getDeclaredFields();
HashMap<Color, String> singleColors = new HashMap<>();
for (Field cf : colorFields) {
int modifiers = cf.getModifiers();
if (!Modifier.isPublic(modifiers))
continue;
Color c = (Color) cf.get(null);
if (!singleColors.values().contains(c))
singleColors.put(c, cf.getName());
}
System.out.printnln("My Color: " + getName(Color.BLUE));
}
public String getName(Color myColor) {
for (Color c : singleColors.keySet()) {
if (c.equals(myColor)) {
return singleColors.get(c);
}
}
}
}
答案 5 :(得分:1)
你可以使用反射......
这是&#34;概念证明&#34;代码:
public static void main ( String [] args ) throws IllegalArgumentException, IllegalAccessException
{
Field [] names = Color.class.getFields();
HashMap<Color,String> list=new HashMap<Color,String>();
for ( Field name: names ){
try{
list.put((Color)Color.class.getDeclaredField(name.getName()).get(null),name.getName());
}catch (NoSuchFieldException e){}
}
System.out.println( list.get(Color.RED));
System.out.println( list.get(Color.BLUE));
}
输出
RED
BLUE
答案 6 :(得分:0)
<强>开关强> 您可以使用switch语句。然后在实例化时将名称保存为类播放器中的变量。