Python 银行抢劫模拟机

Python 银行抢劫模拟机,python,Python,在我开始讨论我的问题之前,先了解一下这个项目的背景: 我正在尝试创建一个模拟抢劫的程序。强盗、守卫和门都有硬编码值 每次重复while循环,劫匪都会靠近门逃跑。此外,每次循环迭代,警卫都会向强盗靠近。这两个操作都由computeChanges函数处理 如果劫匪在警卫接近他之前在(0,0)到达门口,则劫匪逃跑,并打印警卫的最后位置 如果警卫在强盗到达门口之前抓住了他,则会打印出强盗和警卫的最后位置 我在执行时遇到的问题是,robber和guard的值在传递到computeChanges函数后没有改

在我开始讨论我的问题之前,先了解一下这个项目的背景:

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

每次重复while循环,劫匪都会靠近门逃跑。此外,每次循环迭代,警卫都会向强盗靠近。这两个操作都由computeChanges函数处理

如果劫匪在警卫接近他之前在(0,0)到达门口,则劫匪逃跑,并打印警卫的最后位置

如果警卫在强盗到达门口之前抓住了他,则会打印出强盗和警卫的最后位置

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

我错过了什么?X和Y位置的重新分配应在computeChanges函数的最后两行进行

非常感谢您的帮助



代码:

来自numpy import arctan、sin、cos
从数学导入pi、copysign、sqrt
#用于防止对象相互过度偏移
def正常化速度(速度1、速度2、最大速度):
如果speed1>speed2:
较大=速度1
elif speed2>speed1:
更大=速度2
速度1=速度1/更大*最大速度
速度2=速度2/更大*最大速度
#用于计算给定对象的位置变化
def计算范围(移动X、移动Y、速度、目标X、目标Y):
bigTriangleWidth=movingX-targetX
BigTriangleLight=movingY-targetY
bigTriangleRatio=bigTriangleWidth/BigTriangleWight
bigTriangleAngle=arctan(bigTriangleRatio)
ratioX=sin(大三角角)
changeX=比率*速度
比率=cos(大三角角)
changeY=比率*速度
movingX+=copysign(changeX,bigTriangleWidth*-1)
movingY+=复制符号(变化、大三角灯*-1)
#用于计算两个对象之间的绝对距离,以与closeEnough变量进行比较
定义距离(object1X、object1Y、object2X、object2Y):
diffX=object2X-object1X
diffY=object2Y-object1Y
d=sqrt(diffX**2+diffY**2)
返回abs(d)
#------------------------------------------------------------------------#
#------------------------------------------------------------------------#
X=-10.0
抢劫=100.0
速度=11
guardX=-5.0
guardY=140.0
防护速度=13
正常化速度(速度、防护速度,0.1)
doorX=0.0
doorY=0.0
足够近=0.2
而((absDistance(robertx,roberty,guardX,guardY)>足够近)和(absDistance(robertx,roberty,doorX,doorY)>足够近):
计算机更改(robberX,robberX,robberSpeed,doorX,doorY)
打印(“强盗位置:({0},{1})”。格式(强盗X,抢劫))
计算机更改(guardX、guardY、guardSpeed、robberX、Robble)
打印(“保护位置:({0},{1})”。格式(guardX,guardY))

if(absDistance(Robblex,Robblex,doorX,doorY)您的问题在于python处理变量作用域的方式。是的,在
computeChanges
的最后一行,您正在更改
movingX
movingY
。但是,您只在该函数体的作用域中为该调用更改这些变量。一旦函数完成,这些局部变量就会被丢弃。

您应该返回这两个变量,并更新while循环中的robider和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))

这解决了我问题中提出的问题,非常感谢!最初,我有computeChanges函数返回movingX和movingY,但我没有将对象的x和y值设置为函数的输出。我的新问题是另一个无限循环,这是因为对象相互过度。另一个挑战是不过我还是要谢谢你!再次感谢你的帮助!
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))