Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java从3个不同的枚举中获取随机值_Java_Random_Enums - Fatal编程技术网

Java从3个不同的枚举中获取随机值

Java从3个不同的枚举中获取随机值,java,random,enums,Java,Random,Enums,我正在实现一个简单版本的Cluedo游戏。 游戏中有三种类型的牌:角色牌、武器牌和房间牌。由于一张卡只不过是一个字符串(即除了名称之外,没有其他功能或信息存储在卡中),因此我选择不使用卡接口,并且每种类型都扩展卡。相反,我的游戏中有三个枚举: public enum Character {Scarlett, Mustard, White, Green, Peacock, Plum;} public enum Weapon {Candlestick, Dagger, LeadPipe, Revol

我正在实现一个简单版本的Cluedo游戏。 游戏中有三种类型的牌:角色牌、武器牌和房间牌。由于一张卡只不过是一个字符串(即除了名称之外,没有其他功能或信息存储在卡中),因此我选择不使用卡接口,并且每种类型都扩展卡。相反,我的游戏中有三个枚举:

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中从所有三个枚举中随机选择一个值


或者我一开始就不应该做这件事?(设计糟糕)

一种简单的方法是将所有枚举成员收集到一个
对象[]
,然后从中获取一个随机元素


请注意,枚举还可以实现接口,因此您甚至可以在所有枚举中共享一些API。通常,您会发现自己在enum的值上编写了许多
switch
语句;这些方法大多可以被针对此类接口方法的动态调度所取代。进一步注意,每个enum成员都可以提供自己的方法实现。

我认为您应该保持原样,然后将它们都放在同一个列表中:

List<Enum> enums = new ArrayList<>();
enums.addAll(Arrays.asList(Character.values()));
enums.addAll(Arrays.asList(Weapon.values()));
enums.addAll(Arrays.asList(Room.values()));
List enums=new ArrayList();
addAll(Arrays.asList(Character.values());
addAll(Arrays.asList(arm.values());
enums.addAll(Arrays.asList(Room.values());

然后从列表中取随机值。更接近于你在现实生活中所做的事情。

你可以这样写:

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
}
公共枚举字符{思嘉、芥末、白色、绿色、孔雀、李子;}
公共枚举武器{烛台、匕首、铅管、左轮手枪、绳子、扳手;}
公共枚举室{厨房、舞厅、温室、台球馆、图书馆、书房、大厅;}
私有静态最终随机数=新随机数();//随机数生成器-声明为静态,因为整个程序只需要一个
私有静态最终整数总计卡=Character.values().length+arm.values().length+Room.values().length;//将所有枚举长度相加-在本例中,它将是6+6+7=19
私有枚举getRandomCard(){
int randomNumber=RANDOM.nextInt(TOTAL_CARDS);//我们“掷骰子”得到一些随机数。我们假设得到“15”
如果(randomNumber
如果你不明白这其中的任何部分,请让我知道-我会补充一些意见


然而,我相信奥斯卡·克杰林提出的解决方案比这个要优雅得多:)

这可能是一个有用的答案。但是试试这段代码,答案对其他读者没有帮助。相反,您应该添加有关代码的最低限度的描述,这将有助于其他未来的读者。;)@幸运的是,我扩展了我的答案:)“枚举也可以实现接口”,这帮了大忙!原来我确实需要一个卡接口!谢谢!