gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:58:03 25 4
gpt4 key购买 nike

我正在 Twisted 的帮助下用 Python 编写一个游戏服务器。我有一个 Map 类,它生成游戏的 map 。在我的游戏中,我有一个中心点,每隔一定距离就有一圈元素。我想随机化这些项目,但也想对项目进行加权,以便它们在 map 外部更常见。目前,这是我构建 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)

我还有一个带有用于创建项目的初始值设定项的类。

class Item:

def __init__(self, type, posX, posY, size, owner):
self.type = type
self.posX = float(posX)
self.posY = float(posY)
self.size = size
self.owner = owner

这些是我的定义。

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

基于生成方法中的 distanceToRing,我想让 ITEM_SIZE_SMALL 在 distanceToRing 为 1,000,000 时最常见,在 distanceToRing 为 10,000 时最不常见。我还希望 ITEM_SIZE_LARGE 与此相反,而 ITEM_SIZE_MEDIUM 在中间更常见。至于元素类型,我需要 ITEM_TYPE_FIRE 和 ITEM_TYPE_ICE 最常见到 1,000,000。 ITEM_TYPE_WIND 和 ITEM_TYPE_EARTH 在 10,000 左右应该更常见。

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

感谢您的宝贵时间,布赖恩

最佳答案

显然,您需要准确确定每种元素类型/尺寸的概率与距离的关系。最简单的答案是制作一个三角形,其峰值位于您喜欢的位置并具有一致的范围(我要说 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 的峰值,但我认为这并不重要,值得我花时间修复,特别是因为您可能不喜欢这种分布。)

要选择给定权重的项目,我会这样做:

import random

random.seed()

def get_random_index(weights):
n = random.randint(1, sum(weights))
cumsum = 0
for index, weight in enumerate(weights):
cumsum += weight
if n <= cumsum:
return index

def get_random_size(distance):
return item_sizes[get_random_index(get_item_weights(distance))]

itemSize = get_random_size(distanceToRing)

关于python - 根据距某个点的距离从列表中随机选择一个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11605201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com