作为一个相当环保的Java程序员,我给自己设定了一个巨大的挑战,试图编写一个简单的文本冒险。不出所料,我已经遇到了困难!
我正在尝试为我的 Location 类提供一个属性来存储它包含的出口。为此,我使用了一个布尔数组,基本上保存表示每个出口的真/假值。我不完全相信
a) 这是最有效的方法
b)我正在使用正确的代码来填充数组。
我将感谢任何和所有的反馈,即使是一个完整的代码超载!
目前,在实例化位置时,我生成一个字符串,并通过该字符串发送到 setExits 方法:
String e = "N S U";
secretRoom.setExits(e);
在“位置”类中,设置“出口”如下所示:
public void setExits(String e) {
if (e.contains("N"))
bexits[0] = true;
else if (e.contains("W"))
bexits[1] = true;
else if (e.contains("S"))
bexits[2] = true;
else if (e.contains("E"))
bexits[3] = true;
else if (e.contains("U"))
bexits[4] = true;
else if (e.contains("D"))
bexits[5] = true;
}
老实说,我认为这看起来特别笨拙,但我想不出另一种方法来做到这一点。我现在也不完全确定如何编写获取Exits方法...
欢迎任何帮助!
好的,首先,您的 setExits()
方法将无法按预期工作,链接的 if-elseif 将最大程度地执行 1 个代码分支,例如:
if (e.contains("N"))
bexits[0] = true;
else if (e.contains("W"))
bexits[1] = true;
即使e
同时包含N
和W
,也只会设置bexits[0]
。此外,此方法只会添加出口(例如调用setExits("")
不会删除任何现有出口。
我会将该方法更改为:
bexits[0] = e.contains("N");
bexits[1] = e.contains("W");
...
另外,我肯定不会记得北在索引0上,西在索引1上,...因此,通常的做法是使用最终的静态常量来命名索引:
public static final int NORTH = 0;
public static final int WEST = 1;
...
然后,您可以在< code>setExits方法中编写:
bexits[NORTH] = e.contains("N");
bexits[WEST] = e.contains("W");
...
(更具可读性)
最后,如果您希望代码更合理地排列,则可以创建一个 Exits
类,表示可用的出口,并由布尔数组提供支持。然后,在创建 String 的位置,可以改为创建此类,并节省自己生成然后解析字符串的工作。
编辑:
@gexicide回答说,有一个非常方便的类EnumSet
,它可能比bollean数组更适合表示出口。
是否有任何理由使用String
s执行此操作并且不传入布尔值
,即
public void setExits(boolean N, boolean E, boolean S, boolean W, boolean U, boolean D)
还是有二传手?
public void setNorthOpen(boolean open)
{
bexits[4] = open;
}
其次,你为什么把出口存储为一个布尔数组,这是一个小的有限集,为什么不
boolean N,S,E,W,U,D;
因此,您不需要跟踪数组中每个方向的数字。
也
这是一个正确的答案(如果不是像@gexicide那样完全最佳),但我完全鼓励任何人在这里看看其他答案,看看如何以不同的方式在Java中完成工作。
以备将来参考
有效的代码属于代码复查,而不是堆栈溢出。尽管正如@kajacx所指出的,这段代码实际上不应该工作。
最有效的表达方式如下:
使用枚举
s 作为出口,并使用枚举集
来存储它们。枚举集
是一种有效的 Set
实现,它使用位字段来表示枚举常量。
这是你如何做到这一点:
public enum Exit { North, West, South, East, Up, Down; }
EnumSet<Exit> set = EnumSet.noneOf(Exit.class); // An empty set.
// Now you can simply add or remove exits, everything will be stored compactly
set.add(Exit.North); // Add exit
set.contains(Exit.West); // Test if an exit is present
set.remove(Exit.South); //Remove an exit
Enum set将在内部将所有出口存储在一个长中
,因此您的代码具有表现力,快速,并节省大量内存。
问题内容: 作为一个相当环保的Java程序员,我给自己设定了尝试编写简单文本冒险的艰巨挑战。毫不奇怪,我已经遇到了困难! 我试图给我的Location类一个属性来存储退出包含的属性。我为此使用了一个布尔数组,以实质上保存代表每个出口的true / false值。我并不完全相信 a) 这是最有效的方法,并且 b) 我正在使用正确的代码填充数组。 我希望收到所有反馈,即使是对完整的代码进行大修! 目前
Arrays 类提供了一个 fill() 方法,可以在指定位置进行数值填充。fill() 方法虽然可以填充数组,但是它的功能有限制, 只能使用同一个数值进行填充。语法如下: 其中,array 表示数组,value 表示填充的值。 例 1 声明一个 int 类型的 number 数组,然后通过 for 语句进行遍历,在该语句中调用 Arrays 类的 fill() 方法来填充数组,并输出数组中元素的
问题内容: 我知道该怎么做,但是我发誓您可以像[[0] = {0,0,0,0};那样填写;你是怎么做到的?我确实尝试过Google,但没有任何帮助。 问题答案: 您也可以将其作为声明的一部分:
抱歉,如果这个问题已经提出,我已经做了深入的搜索,什么都没有。 现在,我知道: 会在左边用0填充我的价格,所以25的价格会导致00025 如果我想把它们垫在右边,结果是25000呢?如何仅使用String.format模式?
本文向大家介绍用Java填充字节数组,包括了用Java填充字节数组的使用技巧和注意事项,需要的朋友参考一下 可以使用java.util.Arrays.fill()方法填充Java中的字节数组。此方法将所需的字节值分配给Java中的字节数组。java.util.Arrays.fill()所需的两个参数是数组名称和要存储在数组元素中的值。 演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程
问题内容: 我正在编写一个从整数n创建2D数组的程序。然后,我必须用从1到n n数组大小的 值填充数组, 并检查它是否是一个幻方。 我现在的方式是按照从1到n n数组大小的 顺序填充 数组。我该如何随机? 我的代码: 问题答案: 创建一个随机的数字列表以添加到您的数组中,如下所示: