簡體   English   中英

物體未向“正確”方向移動

[英]the object doesn't move to the 'right' direction

您好,這是我的第一篇文章,我是近三個月的編程初學者。

目前,我正在努力減少制作Snake游戲所必須要做的問題,而我現在正在制作蛇游戲機。

我正在嘗試使“ body”塊與“ player”塊完整無缺,理想情況下,我希望代碼向上移動,然后向右移動以到達“ player”塊。

但是,按照我編寫代碼的方式,“ body”塊在向上移動以具有與“ player”塊相同的y坐標后不會立即移動。

我認為為什么會導致此問題的原因是省略號,其中主體塊不斷上下移動以使正確的坐標與玩家塊的y坐標相匹配。

因此,我嘗試將elif移除到if,但是很明顯,這會使主體塊向對角線移動到播放器塊,我不希望這樣做,而只希望該塊水平或垂直移動到播放器塊。

我還重新組織了elif語句,只是為了測試問題出在哪里,在elif之間切換會導致最后一個elif不起作用,或者如果我的下移是,則使左移不起作用在左右移動之前。

我想我也試圖在“ 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()

我想要的編碼結果是:主體塊(左下角)垂直(向上)移動,直到與玩家塊對齊(右上角),然后主體塊水平(右)移動,直到與玩家相遇街區中心。

我認為您的代碼存在問題,因為您正在使用>=<= (大於或等於/小於或等於)而不是>< (嚴格大於/小於)。

根據您的描述,一旦身體與播放器在同一y坐標上,它就應開始向播放器左右移動。 在身體運動狀況的第一行中,您具有以下內容:

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

即使物體在相同的y坐標上,這也將評估為true ,因此永遠不會執行x移動條件。

如果改用此方法:

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

如果身體與玩家的y坐標相同,則該條件將不再為true,因此它將繼續至下一個條件,即沿水平方向移動。

但是,我認為我可以建議一種更簡單的方法。 在Snake中,主體代碼塊通常緊隨播放器代碼塊-如果這是預期的功能,則可以簡單地將主體代碼塊的坐標更新為上一次迭代中的播放器的坐標。 只需在更新之前記錄玩家的坐標,然后將身體的坐標設置為您記錄的坐標即可。

如果要在此之后添加更多的正文段,則可以將每個分段的坐標設置為之前的正文段的先前坐標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM