Python Pygame塔防游戏,寻找目标的问题

Python Pygame塔防游戏,寻找目标的问题,python,pygame,Python,Pygame,我正在用Python做一个小型的塔防项目,我在目标定位方面遇到了一些问题,我想不出来 所以我有一个塔的列表和一个四处移动的敌人的列表 每次主游戏逻辑的while循环迭代时,我都有一个函数来检查生成的每个塔是否都有一个目标。如果他们没有,我运行一个函数,应该可以找到一个 for tw in tower_list: tw.render(window) if tw.target == None: print(tw) tw.target = find_ta

我正在用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
def find_目标(tw):
对于敌人列表中的e:
最近值=100001000000
打印(“检查敌人的距离”,e)
dx=tw.x-e.x
dy=tw.y-e.y
如果dy<0:
dy*=-1
如果dx<0:
dx*=-1

如果dx使用carthesian距离公式计算两点之间的距离

它将使您始终拥有一个距离值,并保证每次都拥有较小的距离。 例如,现在如果一个敌人在x轴距离每座塔1的范围内,而所有其他敌人在x轴距离2的范围内,他们将永远不会被选中,即使他们可能更近

编辑: 请使用上述公式,因为您的计算不是距离函数 同样,在函数中,当您第一次发现比closer更小的东西时,返回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            
def find_目标(tw):
最近=(10000,无)
对于敌人列表中的e:
打印(“检查敌人的距离”,e)
dx=tw.x-e.x
dy=tw.y-e.y
距离=数学形下压(dx,dy)
如果距离小于最近距离[0]
最近[0]=距离
最近的[1]=e
打印(“最近的一个是”,最近的[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]
self.in_范围=False
最接近的敌人
敌人=[]#不管你有什么敌人
对于敌人中的敌人:
x、 y=敌人.x,敌人.y
dis=数学sqrt((self.x-x)**2+(self.y-y)**2)
如果dis0:
目标=敌人\u最近[0]

但是你的方法真的应该很好…

可能就是这样。。。多谢了,在我真正弄明白原因后,看起来不是这样,但我不明白为什么。它只对敌人列表中的e运行,一旦aka,它只检查1元素,而不是所有3元素,直到我改变距离函数,因为你的计算根本不是距离函数。原因是您的返回在循环内,而不是在循环的末尾。您不能在第一次找到一个element@Havok224这很可能是正确的解决方案。如果有任何其他问题,您需要发布一个。顺便说一句,你可以使用
math.hypot
这里:
distance=math.hypot(dx,dy)
。是的,我的计算方法非常糟糕,但我甚至没有发现缩进问题。再次感谢。请提供一个。这将使我们更容易帮助你。