我正在为一个小项目做一个小班。这是一个基于文本的RPG游戏,我正在尝试为NPC的死亡创建一个drop类。我已经创建了两个Math.random方法(它们完全相同,只是为了方便起见命名不同)。丢弃物品id (名称)的随机数量,并获取丢弃物品的稀有性。这一切都很好,但它只随机化一次(在启动或运行时),并且不会随机化之后的数量。我还在两个数字之间进行随机化,例如,25和50,随机数不低于25或高于50。
我的问题是:在每次NPC死后,我如何随机化二维数组或一般数组中的整数,这样首先获得的随机数会发生变化,并且不会保持不变。因为现在,它停留在选择的数字上。如果这个数字是25,那么下一次我杀掉的npc,这个数字仍然是25..和25.和25.诸若此类。我需要它随机化或者改变。
请帮帮忙,谢谢。
public class DropConfig {
private static final int
ALWAYS = 0,
VERY_COMMON = rate(1, 9),
COMMON = rate(10, 20),
UNCOMMON = rate(30, 40),
RARE = rate(50, 60),
VERY_RARE = rate(70, 80),
SUPER_RARE = rate(90, 100);
public static final int[][] NPC_DROPS = {
// Normal NPC's
{1, 526, 1, ALWAYS},
{2, 526, 1, ALWAYS},
{3, 526, 1, ALWAYS},
{1, 995, drop(1, 50), ALWAYS},
{2, 995, drop(1, 50), ALWAYS},
{3, 995, drop(1, 50), ALWAYS},
// Moderate NPC's
{9, 526, 1, ALWAYS},
{9, 995, drop(250, 500), UNCOMMON},
{9, 555, drop(2, 7), VERY_COMMON},
{9, 995, drop(5, 50), VERY_COMMON},
{9, 1050, 1, RARE},
};
public static int rate(int min, int max) {
return 1 + (int)(Math.random() * ((max - min) + 1));
}
//Same as rate, different name for looks.
public static int drop(int min, int max) {
return 1 + (int)(Math.random() * ((max - min) + 1));
}下面是我调用drops方法的地方
public void npcDeath() {
int npc = 0;
if (npc == null)
return;
for(npc = 0; npc < DropConfig.NPC_DROPS.length; npc++) {
if(npc == DropConfig.NPC_DROPS[npc][0]) {
if(Misc.random(DropConfig.NPC_DROPS[npc][3]) == 0) { //Drops ALWAYS item
Item(DropConfig.NPC_DROPS[npc][1], DropConfig.NPC_DROPS[npc][2]);
}
}
}
}发布于 2012-05-01 17:26:43
如果我理解正确的话,您可能希望在每次使用此NPC_DROPS数组时重新初始化通过调用drop()初始化的NPC_DROPS数组的元素。
嗯,NPC_DROPS是一个常量,所以它不会改变。使用以下方法在每次访问它时生成它:
public static int[][] generateNpcDrops(){
return new int[][] {
// Normal NPC's
{1, 526, 1, ALWAYS},
{2, 526, 1, ALWAYS},
{3, 526, 1, ALWAYS},
{1, 995, drop(1, 50), ALWAYS},
{2, 995, drop(1, 50), ALWAYS},
{3, 995, drop(1, 50), ALWAYS},
// Moderate NPC's
{9, 526, 1, ALWAYS},
{9, 995, drop(250, 500), UNCOMMON},
{9, 555, drop(2, 7), VERY_COMMON},
{9, 995, drop(5, 50), VERY_COMMON},
{9, 1050, 1, RARE},
}
}
...
public void npcDeath() {
int npc = 0;
if (npc == null)
return;
int[][] npcDrops = DropConfig.generateNpcDrops();
for(npc = 0; npc < npcDrops.length; npc++) {
if(npc == npcDrops[npc][0]) {
if(Misc.random(npcDrops[npc][3]) == 0) { //Drops ALWAYS item
Item(c, npcDrops[npc][1], npcDrops[npc][2]);
}
}
}
}发布于 2012-05-01 17:27:19
您希望将函数作为常量来放置。在像Scala这样的语言中,你可以很自然地做到这一点,但在Java中,你必须更努力一点。
在每种情况下,您都需要调用一个函数来获取实际值。
您可以使用枚举和匿名方法,但最简单的方法是对范围进行编码。
public static int rate(int min, int max) { // same for drop.
int range = max - min;
return (range << 16) | (min & 0xFFFF);
}
public static int eval(int minMax) {
int min = (short) minMax;
int range = (short) (minMax >> 16);
if (range == 0)
return min; // plain number.
else
return min + (int) (Math.random() * (range + 1));
}您需要调用eval()将您的编码范围转换为随机数。
发布于 2012-05-01 17:28:15
创建一个具有相同种子的Random实例,您将获得相同的“随机”数字。你有没有考虑过使用SecureRandom?SecureRandom和随机之间的区别在于,SecureRandom在每次调用时都会产生不确定的输出。
https://stackoverflow.com/questions/10395748
复制相似问题