在我开始讨论我的问题之前,先介绍一下这个项目的一些背景知识:
我正在尝试创建一个模拟抢劫的程序。强盗、守卫和门都有硬编码值。你知道吗
每次重复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))
您的问题在于python处理变量范围的方式。是的,在
computeChanges
的最后一行,您正在更改movingX
和movingY
。但是,您只需在该函数体的作用域中为该调用更改这些变量。一旦函数完成,这些局部变量就会被丢弃。你知道吗您应该返回这两个变量,并更新while循环中robert和guards的位置。你知道吗
相关问题 更多 >
编程相关推荐