Python 中的文本冒险游戏 - 从具有加权属性的文本文件中随机选择项目



我目前正在为Python中的文本冒险游戏创建一个库存系统。 我在文本文件中有一个项目列表,逗号后有它们的稀有项目。例如

potion, 1
sword, 2
legendary armour, 7

我已经尝试了一些导入文件和随机选择的变体,但我似乎无法自己找到解决方案。

基本操作是...

  • 玩家完成等级(等级从1-30)。
  • 在关卡结束时,游戏从文本文件中随机挑选 3 个物品。
  • 玩家选择其中一个项目。

这些物品需要根据其稀有度与当前玩家等级进行加权,因此玩家等级越高,提供稀有物品的机会就越大。


到目前为止,我已经尝试将项目和重量导入不同的列表,但将它们与级别进行比较很复杂。

我还考虑过根据每个级别制作单独的文本文件,并复制每个项目来测量权重,但这只会为项目制作数千行。

一定有我没有考虑的方法。

只是回答问题的随机部分,random.choices对此很有用。 您可以根据物品rarity和玩家level设置"权重"。 例如:

读入数据:

from io import StringIO
import csv
with StringIO("potion,1nsword,2nlegendary armour,7n") as fd:
items = {item: float(rarity) for item, rarity in csv.reader(fd)}

为您提供一个字典,其中键设置为项目名称,值设置为稀有度的数值。 请注意,像pandas这样的库可以使这种事情变得更容易。

然后,我会通过计算从rarity到玩家的距离来计算"重量",level0.5**abs(rarity - level)。 这将给出稀有度和玩家等级相似的大数字(将等级除以调整),而较小的权重则不太相似

然后,这可用于选择以下选项:

from random import choices
level = 3
weights = [0.5**abs(rarity - level) for rarity in items.values()]
drops = choices(list(items.keys()), weights=weights, k=2)

这将从概率与weights成正比的项目中采样。 在这种情况下,上述项目将是(~31%,~62%,~8%)。

上面的加权函数是对称的,所以当玩家等级高时,他们只会得到高等级的物品。 如果您不希望这样,那么您可以使用"Sigmoid 函数"之类的东西,随着玩家等级的增加逐渐显示更高级别的物品。 这看起来像1/(1 + math.exp(rarity - level))

最新更新