抢劫银行司徒

2024-06-16 11:22:03 发布

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

在我开始讨论我的问题之前,先介绍一下这个项目的一些背景知识:

我正在尝试创建一个模拟抢劫的程序。强盗、守卫和门都有硬编码值。你知道吗

每次重复while循环,劫匪都会靠近门逃跑。而且,每次循环迭代,守卫都在向劫匪靠近。这两个操作都由computeChanges函数处理。你知道吗

如果劫匪在(0,0)到达门口时,警卫还没有找到他,则劫匪逃跑,并打印警卫的最后位置。你知道吗

如果保安在劫匪到达门口之前抓住了他,就会打印劫匪和保安的最后位置。你知道吗

我在执行时遇到的问题是,robert和guard的值在传递到computeChanges函数后没有变化。这将导致无限循环。你知道吗

我错过了什么?X和Y位置的重新分配应该发生在computeChanges函数的最后两行。你知道吗

感谢所有的帮助。你知道吗



代码:

from numpy import arctan, sin, cos
from math import pi, copysign, sqrt

# Used to prevent objects from overshooting one another
def normalizeSpeed(speed1, speed2, maxSpeed):
    if speed1 > speed2:
        larger = speed1
    elif speed2 > speed1:
        larger = speed2
    speed1 = speed1 / larger * maxSpeed
    speed2 = speed2 / larger * maxSpeed

# Used to compute the change in position for given object
def computeChanges(movingX, movingY, speed, targetX, targetY):
    bigTriangleWidth = movingX - targetX
    bigTriangleHeight = movingY - targetY
    bigTriangleRatio = bigTriangleWidth / bigTriangleHeight
    bigTriangleAngle = arctan(bigTriangleRatio)

    ratioX = sin(bigTriangleAngle)
    changeX = ratioX * speed
    ratioY = cos(bigTriangleAngle)
    changeY = ratioY * speed

    movingX += copysign(changeX, bigTriangleWidth * -1)
    movingY += copysign(changeY, bigTriangleHeight * -1)


# Used to calculate the absolute distance between two objects to be compared to the closeEnough variable
def absDistance(object1X, object1Y, object2X, object2Y):
    diffX = object2X - object1X
    diffY = object2Y - object1Y
    d = sqrt(diffX ** 2 + diffY ** 2)
    return abs(d)

#------------------------------------------------------------------------#
#------------------------------------------------------------------------#

robberX = -10.0
robberY = 100.0
robberSpeed = 11

guardX = -5.0
guardY = 140.0
guardSpeed = 13

normalizeSpeed(robberSpeed, guardSpeed, 0.1)

doorX = 0.0
doorY = 0.0

closeEnough = 0.2

while ((absDistance(robberX, robberY, guardX, guardY) > closeEnough) and (absDistance(robberX, robberY, doorX, doorY) > closeEnough)):
    computeChanges(robberX, robberY, robberSpeed, doorX, doorY)
    print("Robber position: ({0}, {1})".format(robberX, robberY))
    computeChanges(guardX, guardY, guardSpeed, robberX, robberY)
    print("Guard position: ({0}, {1})".format(guardX, guardY))

if (absDistance(robberX, robberY, doorX, doorY) <= closeEnough):
    print("The robber escapes!\nguardX = {0}\nguardY = {1}".format(guardX, guardY))
elif (absDistance(robberX, robberY, guardX, guardY) <= closeEnough):
    print("The guard catches the robber!\nrobberX = {0}\nrobberY = {1}\nguardX = {2}\nguardY = {3}".format(robberX, robberY, guardX, guardY))

Tags: thetolargerspeed1robberyspeed2closeenoughrobberx
1条回答
网友
1楼 · 发布于 2024-06-16 11:22:03

您的问题在于python处理变量范围的方式。是的,在computeChanges的最后一行,您正在更改movingXmovingY。但是,您只需在该函数体的作用域中为该调用更改这些变量。一旦函数完成,这些局部变量就会被丢弃。你知道吗

您应该返回这两个变量,并更新while循环中robert和guards的位置。你知道吗

def computeChanges(movingX, movingY, speed, targetX, targetY):
    ...
    return movingX, movingY

...

while ((absDistance(robberX, robberY, guardX, guardY) > closeEnough) and (absDistance(robberX, robberY, doorX, doorY) > closeEnough)):
    robberX, robberY = computeChanges(robberX, robberY, robberSpeed, doorX, doorY)
    print("Robber position: ({0}, {1})".format(robberX, robberY))
    gaurdX, gaurdY = computeChanges(guardX, guardY, guardSpeed, robberX, robberY)
    print("Guard position: ({0}, {1})".format(guardX, guardY))

相关问题 更多 >