该对象未向“正确”方向移动

时间:2019-08-12 11:46:18

标签: python

您好,这是我的第一篇文章,并且我是近三个月的编程初学者。

目前,我正在努力减少制作Snake游戏所必须要做的问题,而现在我正在使蛇游戏者动起来。

我正在尝试使“ body”块与“ player”块完整无缺,理想情况下,我希望代码向上移动,然后向右移动以到达“ player”块。

但是,按照我编写代码的方式,“ body”块在向上移动以具有与“ player”块相同的y坐标后不会立即移动。

我认为为什么会导致此问题的原因是省略号,其中主体块不断上下移动以使正确的坐标与玩家块的y坐标相匹配。

因此,我尝试将elif移除到if,但是很明显,这会使主体块向对角线移动到玩家块,我不希望这样,而只希望该块水平或垂直移动到玩家块。

我还重新组织了elif语句,只是为了测试问题出在哪里,在elif之间切换会导致最后一个elif不起作用,或者如果我的's'使左移不起作用向下运动在左右运动之前。

我想我也曾尝试在“ w” if语句上方添加新的if语句,因为我认为body块不会正确移动,因为body块检测到它与y坐标不相同播放器块,因此它优先优先上移。但是那也没有解决。

那这里是什么问题?

from graphics import *
import keyboard
width = 200
height = 200

def main():
    keyW = False
    keyA = False
    keyS = False
    keyD = False
    radius = 10
    length = radius * 2

    win = GraphWin("MOVEMENTS", width, height)
    win.setBackground("black")

    player = Rectangle(Point(width-40,20), Point(width-20,40))
    player.setFill("green")
    player.setWidth(2)
    player.draw(win)

    body = Rectangle(Point(20,height-40), Point(40,height-20))
    body.setFill("green")
    body.setWidth(2)
    body.draw(win)

    while(True):
        if keyboard.is_pressed("w") and keyS==False:
            keyW = True
            keyA = False
            keyS = False
            keyD = False
        elif keyboard.is_pressed("a") and keyD==False:
            keyW = False
            keyA = True
            keyS = False
            keyD = False
        elif keyboard.is_pressed("s") and keyW==False:
            keyW = False
            keyA = False
            keyS = True
            keyD = False
        elif keyboard.is_pressed("d") and keyA==False:
            keyW = False
            keyA = False
            keyS = False
            keyD = True

        if keyW==True:
            player.move(0,-0.05)
        elif keyA==True:
            player.move(-0.05,0)
        elif keyS==True:
            player.move(0,0.05)
        elif keyD==True:
            player.move(0.05,0)

        if body.getCenter().getY() >= player.getCenter().getY(): # W
            body.move(0,-0.05)
        elif body.getCenter().getX() >= player.getCenter().getX(): # A
            body.move(-0.05,0)
        elif body.getCenter().getY() <= player.getCenter().getY(): # S
            body.move(0,0.05)
        elif body.getCenter().getX() <= player.getCenter().getX(): # D
            body.move(0.05,0)

main()

我想要的编码结果是: 主体块(左下角)垂直(向上)移动,直到与播放器块对齐(右上角),然后主体块水平(右)移动,直至与播放器块中心对齐。

1 个答案:

答案 0 :(得分:0)

我认为您的代码存在问题,因为您使用的是>=<=(大于或等于/小于或等于)而不是> <(严格大于/小于)。

根据您的描述,一旦身体与玩家在同一y坐标上,它便应开始向玩家左右移动。在身体运动状态的第一行,您有以下内容:

if body.getCenter().getY() >= player.getCenter().getY(): # W

即使身体在相同的true坐标上,这也将求值为y,因此x的运动条件永远不会得到执行。

如果您改为使用此:

if body.getCenter().getY() > player.getCenter().getY(): # W

如果身体与玩家在同一y坐标上,则条件将不再为真,因此它将继续至下一个条件,其中涉及沿水平方向移动。

但是,我认为我可以建议一种更简单的方法。在Snake中,主体代码块通常紧随播放器代码块-如果这是预期的功能,则可以简单地将主体代码块的坐标更新为上一次迭代中的播放器的坐标。只需在更新之前记录玩家的坐标,然后将身体的坐标设置为您记录的坐标即可。

如果要在此之后添加更多的身体部位,则可以将每个身体部位的坐标设置为之前的身体部位的先前坐标。