根据与点的距离从列表中随机选择一个项目?

2024-10-01 04:44:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Twisted的帮助下用Python编写一个游戏服务器。我有一个为游戏生成地图的Map类。在我的游戏中,我有一个中心点,每向外一定距离都有一圈物品。我想随机化的项目,但也权重项目,使他们更常见的外部地图。目前,这是我构建映射的代码,更改了一些变量和函数名:

def generate():
    centralItem = Item(ITEM_TYPE_GOLD, 0, 0, ITEM_SIZE_GIANT, None)
    self.items.append(centralItem)
    distance = 10000
    numberOfRings = 100
    for ring in range(numberOfRings):
        itemsInRing = (ring + 1) * 100
        distanceToRing = (ring + 1) * distance
        for item in range(itemsInRing):
            angle = math.radians(float(360) / itemsInRing) * item
            xPos = math.cos(angle) * distanceToRing
            yPos = math.sin(angle) * distanceToRing
            # set variable itemSize using method described above (details below)
            # set variable itemType using method described above (details below)

我还有这个类,它有一个用于创建项的初始值设定项。在

^{pr2}$

这是我的定义。在

ITEM_TYPE_FIRE = 0
ITEM_TYPE_ICE = 1
ITEM_TYPE_WIND = 2
ITEM_TYPE_EARTH = 3
ITEM_TYPE_GOLD = 4

ITEM_SIZE_SMALL = 200
ITEM_SIZE_MEDIUM = 350
ITEM_SIZE_LARGE = 500
ITEM_SIZE_GIANT = 1000

基于generate方法中的distanceToRing,我想让ITEM_SIZE_SMALL在距离为1000000时最常见,在distanceToRing为10000时最不常见。我也希望它的大小与它的对立面相反,中间的介质更常见。至于物品类型,我需要的物品类型是1000000的最常见物品。项_型风和项_型土应更常见于10000。在

我知道有很多问题要问,但如果你能提出一种处理这种分配的方法并加以解释,我想我可以解决。另外,我提前为我缺乏Python技巧而道歉。我使用它的时间还不够长,不足以理解最佳实践甚至一些基础知识。在

谢谢你的时间, 布莱恩


Tags: 项目游戏距离sizetype地图mathitem
1条回答
网友
1楼 · 发布于 2024-10-01 04:44:38

显然,你需要确切地决定每种物品类型/尺寸的概率与距离的关系。最简单的答案是在你喜欢的地方画一个三角形,它的峰值在你喜欢的地方,范围是一致的(我要说10000到1000000),如下所示:

item_sizes = [ITEM_SIZE_SMALL, ITEM_SIZE_MEDIUM, ITEM_SIZE_LARGE]

def get_item_weights(distance):
    return [1010000 - distance, 1000000 - abs((505000-distance)*2), distance]
这将给你10000的大部分小物品,大部分是1000000的大物品,中间有大约25/50 / 25的分割物。也许你不喜欢这样做,但我没办法知道。当构建随机进程时,可能需要一些尝试和错误才能找到您喜欢的东西。(从技术上讲,由于505000不是一个有效的距离,中间权重将在990000处达到峰值,但我认为这并不重要,值得我花时间修正,尤其是因为您可能不喜欢这种分布。)

为了选择一个给定权重的项目,我会做如下操作:

^{pr2}$

itemSize = get_random_size(distanceToRing)

相关问题 更多 >