我试图制作一个吃豆子,所以即时通讯使用阵列[8] [8],其中我有一个吃豆人,2个鬼,墙壁和吃豆子可以吃的点。当pacman吃点时你会开始得到空的空间。
所以我决定制作一个随机的函数,只将ramdonly分配给空的空间,但问题是,随着更多空的空间,你得到的果实开始变得疯狂,并出现在我的阵列中。尽管我有空的空间,我仍然希望获得水果的机会相同。
以下是我正在使用的方法,请帮忙。
public void AppearFruit()
{
for(int i= 0; i<_world.length; i++){
for(int j= 0; j<_world.length; j++){
Random as = new Random();
int fru = as.nextInt(20);
if(fru==10){
if(_world[i][j] instanceof Empty){
_world[i][j] = new Fruit(i,j);
}
}
}
}
}
public void DisappearFruit()
{
for(int i= 0; i<_world.length; i++){
for(int j= 0; j<_world.length; j++){
if (_world[i][j] instanceof Fruit){
if(contfru>=3) {
_mundo[i][j] = new Empty(i,j);
contfru=0;
}
}
}
}
}
答案 0 :(得分:1)
这取决于“获得水果的机会”的含义。
你现在所拥有的东西将独立地给每个空的空间一个20%的机会获得一个水果。因此,如果你有一个2-300个空格的大网格,那么每次AppearFruit
运行时你都会得到10-15个水果。
我不知道contfru
中的DisappearFruit
变量是什么,但我认为它并没有摆脱接近这个速度的水果 - 所以随着时间的推移,越来越多的水果会出现。
修改:更新后,您要求
尽管我有空的空间,但获得水果的机会相同
根据定义,这意味着您当前的方法根本无法工作,因为您为每个空间提供了获得成果的平等机会。将空格的数量加倍会使得到的水果数量翻倍(平均而言)。
听起来你想要一种更像是添加一个水果的方法,它会扫描空白数组并随机将水果分配给其中一个空格。然后你可以调整你调用这种方法的频率 - 也许它恰好每50个回合发生一次,可能每30 + rnd(40)
次转动,也许每60秒发生一次,等等。你可以调整出现多少水果(以及多快)通话的频率。
答案 1 :(得分:0)
好的,我想我明白为什么你会得到很多成果。在您的方法AppearFruit
中,当您指定一个Fruit时,您不会增加countfru,使您方法DisappearFruit
永远不会像预期的那样工作
答案 2 :(得分:0)
现在,每个空白字段出现水果的概率为5%,每次移动 。就像你有一个空字段并将pacman移动10次一样, this 字段的概率是
P_fruit = 1 - (19/20)^10
= 40.1%
我猜,算法并不差,你可以经常把它称之为。
修改强>
你可以通过使用一个低得多的概率来调整行为,但最后,它会是相同的:如果你需要更多水果,只需保持pacman移动。
我将水果生成与运动脱节。想想一个计时器 - 就像每隔30秒触发一个事件,在空的空间上以低概率产生果实。你甚至可以说:我定义了一个概率 p ,在电路板上生成一个水果,然后随机选择一个当前空白空间: (伪代码)
placeFruit(board)
if (random() > 5%) return; // no fruit this time
List fields :== getAllEmptyFields(board);
fruitField :== random(fields.size());
fruitField.add(new Fruit());