我正在用Python做一个小小的塔防项目,并且在定位时遇到了一些我不知道的问题。
所以我有一个塔列表和一个四处移动的敌人列表。
每次主要游戏逻辑的while循环迭代时,我都有一个函数检查每个生成的塔是否都有目标。如果没有,我运行的函数应该找到一个。
for tw in tower_list:
tw.render(window)
if tw.target == None:
print(tw)
tw.target = find_target(tw)
print(tw.target)
这是在find_target
函数中完成的。我正在发送正在寻找目标的塔。
def find_target(tw):
for e in enemy_list:
closest = 100000,100000
print("Checking distance for enemy", e)
dx = tw.x - e.x
dy = tw.y - e.y
if dy < 0:
dy *= -1
if dx < 0:
dx *= -1
if dx <= closest[0] and dy <= closest[1]:
closest = dx, dy
print("Closest one is ",e,"at distane",closest)
return e
我的模拟当前包括3个不同的敌人,我将它们分散开,以便每座塔都应有一个不同的敌人作为目标。但是它总是只检查并返回相同的敌人。
这可能是我忘记的愚蠢之举,但目前我真的想不起来。
答案 0 :(得分:3)
使用笛卡尔距离公式来计算两个点之间的距离。
它将使您始终拥有一个距离值,并确保每次都具有较小的距离。 现在,例如,如果一个敌人在距离每座塔的x轴距离内1内,而所有其他敌人在x轴的距离内2内,即使它们距离更近,也永远不会选择他们
编辑: 请使用上面的公式,因为您的计算不是距离函数 同样在函数中,您在第一次发现小于近似值时返回e。 使其成为最接近的是容纳敌人和距离的元组,因此您的代码应为
def find_target(tw):
closest = (10000, None)
for e in enemy_list:
print("Checking distance for enemy", e)
dx = tw.x - e.x
dy = tw.y - e.y
distance = math.hypot(dx, dy)
if distance < closest[0]
closest[0] = distance
closest[1] = e
print("Closest one is ",closest[1],"at distane",closest[0])
return closest
答案 1 :(得分:0)
我认为您应该对塔进行瞄准,并确定敌人是否在瞄准范围内
self.in_range = False
enemies_closest = []
enemies = [] #whatever enemies you have
for enemy in enemies:
x, y = enemy.x, enemy.y
dis = math.sqrt((self.x - x)**2 + (self.y - y)**2)
if dis < self.range:
self.in_range = True
enemies_closest.append(enemy)
enemies_closest.sort(key=lambda x: x.path_pos)
if len(enemies_closest) > 0:
target = enemies_closest[0]
但是您的方法确实应该没问题...