【问题标题】:the object doesn't move to the 'right' direction对象没有向“正确”方向移动
【发布时间】:2019-08-12 20:34:32
【问题描述】:

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

目前我正在尝试减少制作 Snake 游戏所必须做的问题,我现在正在制作蛇玩家的移动。

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

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

我认为导致这个问题的原因是身体块不断上下移动以匹配正确的坐标到玩家块的 y 坐标的 elif。

所以我尝试将 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()

我想要的编码结果是: 身体块(左下角)垂直移动(向上)直到它与玩家块齐平(右上角),然后身体块水平移动(右)直到它遇到玩家块中心。

【问题讨论】:

  • 但是这个动作取决于头部的正确位置?不像你在移动中所做的那样在绝对坐标上。 (如果蛇从左到右屏幕,按 D 应该使蛇向下移动)

标签: python


【解决方案1】:

我认为您的代码的问题在于您使用的是&gt;=&lt;=(大于或等于/小于或等于)而不是&gt;&lt;(严格来说大于小于/小于)。

根据您的描述,一旦身体与玩家在同一y 坐标上,它应该开始向左或向右移动到玩家。在你的身体运动状态的第一行,你有这个:

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

即使身体在同一个y 坐标上,这也会计算为true,因此x 运动条件永远不会被执行。

如果你改用这个:

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

如果身体与玩家位于同一y 坐标上,则条件将不再为真,因此它将继续下一个条件,即水平移动。

但是,我想我可以建议一种更简单的方法来执行此操作。在 Snake 中,通常身体块完全跟随玩家块 - 如果这是预期的功能,您可以简单地将身体块的坐标更新为前一次迭代的玩家坐标。只需在更新之前记录玩家的坐标,然后将身体的坐标设置为您记录的坐标。

如果您想在其后添加更多的身体片段,那么您可以将每个身体片段的坐标设置为之前身体片段的先前坐标。

【讨论】:

  • 我忘了在描述中提到它,但我尝试在 if/elif 语句中将 >= 替换为 >,但问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多