这几乎可以肯定是一个非常新手的问题,但由于我是一个完全的新手,我对此没有意见。
简单地说,我想知道如何在一个简单的游戏中制作一个战利品丢弃系统,在这个系统中,当你达到某个目标时,你有机会获得比其他物体更多的物品。如果有任何开源的python游戏有这个功能,请参考我的。
下面是我所知道的方法:给出一个样本A,B,C,D,E,F,选择3个项目。
这真的很简单,但是,当我想要从样本中选择一些东西比其他东西更频繁时,我该怎么办,即:给定样本A,B,C,D,E,F有3个被选择,没有重复,但有A被选择的时间有30%,B 25%,C 20%,D 15%,E 5%,F 5%。
或者,也许更好的是,没有限制(或范围限制,例如。3-5个项目)的金额选择,但在样本中的每个项目被选择在不同的速率和没有重复,所以我可以做A 20%,B 20%,C 15%,D 10%,E 2%,F 1%。
希望这是有意义的。
发布于 2010-08-21 05:45:30
这里有一个简单的,懒惰的方法。
给定(item,weight)对的列表。
loot = [ (A,20), (B,20), (C,15), (D,10), (E,2), (F,1) ]请注意,权重不一定要加上任何东西,它们只需要是整数即可。
一次性准备步骤。
choices = []
for item, weight in loot:
choices.extend( [item]*weight )现在只剩下random.choice( choices )了。
发布于 2010-08-21 22:09:30
当你把这个问题描述为一个“非常新手”的问题时,你有点出乎我的意料。它并不像看起来那么简单,这取决于你想要什么样的行为。BarsMonster的答案很好,如果你不介意一个幸运的玩家可以赢得所有的物品,而一个倒霉的玩家可能一无所有。
如果你想总是选择一定数量的项目,那么我会使用S.Lott的方法来选择一个项目,但要重复使用它。如果您不想允许同一项被多次选择,则必须从loot中删除所选的项,然后在选择之间重新构建choices。例如(非常粗糙的伪代码):
items_won = random.randint(3, 5)
for i in range(items_won):
item_won = s_lott_weighted_selection()
inventory.add(item_won)
loot.remove(item_won)发布于 2010-08-21 05:36:16
伪代码:
if(random()<0.2)addloot(a);
if(random()<0.15)addloot(b);
if(random()<0.1)addloot(c);
if(random()<0.02)addloot(d);
if(random()<0.01)addloot(e);其中,random是一个从0到1的随机数。这就是它在所有MMORPG中的工作方式。
https://stackoverflow.com/questions/3535046
复制相似问题