问题描述
我正在实现Cluedo游戏的简单版本。 游戏中有3种类型的牌,角色,武器和房间。 由于一张卡只不过是一个字符串(即除了名称之外没有任何功能或信息存储在卡中),我选择不使用卡接口,每种类型都扩展卡。 相反,我在游戏中有三个枚举:
public enum Character {Scarlett, Mustard, White, Green, Peacock, Plum;}
public enum Weapon {Candlestick, Dagger, LeadPipe, Revolver, Rope, Spanner;}
public enum Room {Kitchen, Ballroom, Conservatory, BilliardRoom, Library, Study, Hall;}
然而,有一种情况是将三种类型的卡放在一起并均匀地分配给游戏的每个玩家。 例如,一个玩家可能拥有2个角色的手,2个武器和1个房间,另一个玩家可能拥有3个房间和2个角色,所以卡的总数即使是什么类型也无关紧要。
这就是为什么我想知道是否有办法从Java中的所有三个枚举中随机选择一个单独的值?
或者我不应该首先做这三个enum的事情? (设计不当)
1楼
一种简单的方法是将所有枚举成员收集到一个Object[]
,然后从中获取一个随机元素。
请注意,枚举也可以实现一个接口,因此您甚至可以在所有枚举中使用一些共享API。
通常你会发现自己在enum的值上写了很多switch
语句;
这些接口方法的动态调度大多可以取而代之。
进一步注意,每个枚举成员都可以提供自己的方法实现。
2楼
我认为你应该保持原样,但是然后将它们全部放在同一个列表中:
List<Enum> enums = new ArrayList<>();
enums.addAll(Arrays.asList(Character.values()));
enums.addAll(Arrays.asList(Weapon.values()));
enums.addAll(Arrays.asList(Room.values()));
然后你获取该列表的随机值。 更接近你在现实生活中所做的事情。
3楼
你可以写这样的东西:
public enum Character {Scarlett, Mustard, White, Green, Peacock, Plum;}
public enum Weapon {Candlestick, Dagger, LeadPipe, Revolver, Rope, Spanner;}
public enum Room {Kitchen, Ballroom, Conservatory, BilliardRoom, Library, Study, Hall;}
private static final Random RANDOM = new Random(); // random number generator - declared static, because we need only one for whole program
private static final int TOTAL_CARDS = Character.values().length + Weapon.values().length + Room.values().length; // sum up all enum lenghts - in this case, it will be 6 + 6 + 7 = 19
private Enum<?> getRandomCard() {
int randomNumber = RANDOM.nextInt(TOTAL_CARDS); // we "roll a dice" to get some random number. Let's assume that we get "15"
if (randomNumber < Character.values().length) { // is 15 less then 6? No, so we skip this part
return Character.values()[randomNumber];
}
randomNumber -= Character.values().length; // randomNumber = 15 - 6 = 9
if (randomNumber < Weapon.values().length) { // is 9 < 6 ? No, so we skip this
return Weapon.values()[randomNumber];
}
randomNumber -= Weapon.values().length; // randomNumber = 9 - 6 = 3
if (randomNumber < Room.values().length) { // Is 3 < 7 ? Yes!
// so it means that our "dice" has chosen a Room with array index 3
// We call Room.values() to get all room types as an array and then we pick one with index 3
return Room.values()[randomNumber];
}
return null; // should never happen
}
如果您对此不了解,请告诉我 - 我会添加一些评论。
但是,我相信Oskar Kjellin提出的解决方案比这个更优雅:)