pygame塔防游戏,发现目标问题

时间:2018-07-13 14:32:43

标签: python pygame

我正在用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个不同的敌人,我将它们分散开,以便每座塔都应有一个不同的敌人作为目标。但是它总是只检查并返回相同的敌人。 enter image description here

这可能是我忘记的愚蠢之举,但目前我真的想不起来。

2 个答案:

答案 0 :(得分:3)

使用笛卡尔距离公式来计算两个点之间的距离。

enter image description here

它将使您始终拥有一个距离值,并确保每次都具有较小的距离。 现在,例如,如果一个敌人在距离每座塔的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]

但是您的方法确实应该没问题...