Как заставить мою программу читать третье выражение if - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь заставить мою программу перемещать "суши-тарелку" по часовой стрелке в прямоугольную форму, хотя она, похоже, не будет продолжать двигаться после моего третьего if заявления:

from graphics import * 
win =GraphWin("Draw and Animate",640,480)
win.setBackground("wheat1")

#Right
xmove = 1
ymove = 0
#Down
xmove2 = 0
ymove2 = 1
#Left
xmove3 = -1
ymove3 = 0
#Up
xmove4 = 0
ymove4 = -1

sushiplate = Rectangle(Point(300,160),Point(340,180))
sushiplate.setFill("white")
sushiplate.draw(win)

leftsushi = Circle(Point(310,170), 5)
leftsushi.setOutline("Green")
leftsushi.setFill("orange")
leftsushi.draw(win)

rightsushi = Circle(Point(330,170), 5)
rightsushi.setOutline("Green")
rightsushi.setFill("orange")
rightsushi.draw(win)

while(True):
    #Move sushi

    sushiplate.move(xmove4, ymove4)
    leftsushi.move(xmove4, ymove4)
    rightsushi.move(xmove4, ymove4)
    sushicenter = sushiplate.getCenter()
    if (sushicenter.getY()<=130):
        xmove4 = xmove
        ymove4 = ymove 
    if (sushicenter.getX()>=510):
        xmove = xmove2
        ymove = ymove2
    if (sushicenter.getY()>=360):
        xmove2 = xmove3
        ymove2 = ymove3


    update(60)

Мои сушитарелка будет двигаться вверх, вправо, вниз, но продолжит движение вниз, и мой третий оператор if не будет выполняться:

if (sushicenter.getY()>=360):
    xmove2 = xmove3
    ymove2 = ymove3

Ответы [ 3 ]

1 голос
/ 07 мая 2019

Эти условия должны быть на одном уровне и не быть вложенными.Поскольку второй уровень проверяет sushicenter.getY() <= 130, то условие четвертого уровня может быть вызвано только в том случае, если getY() равно >=360 и <=130 и этого никогда не произойдет.Я думаю, что вы хотели сохранить их на одном уровне, чтобы они могли запускаться независимо и не зависеть от других условий.

from graphics import * 
win =GraphWin("Draw and Animate",640,480)
win.setBackground("wheat1")

#Right
xmove = 1
ymove = 0
#Down
xmove2 = 0
ymove2 = 1
#Left
xmove3 = -1
ymove3 = 0
#Up
xmove4 = 0
ymove4 = -1

sushiplate = Rectangle(Point(300,160),Point(340,180))
sushiplate.setFill("white")
sushiplate.draw(win)

leftsushi = Circle(Point(310,170), 5)
leftsushi.setOutline("Green")
leftsushi.setFill("orange")
leftsushi.draw(win)

rightsushi = Circle(Point(330,170), 5)
rightsushi.setOutline("Green")
rightsushi.setFill("orange")
rightsushi.draw(win)

while(True):
    #Move sushi

    sushiplate.move(xmove4, ymove4)
    leftsushi.move(xmove4, ymove4)
    rightsushi.move(xmove4, ymove4)
    sushicenter = sushiplate.getCenter()
    if (sushicenter.getY()<=130):
        xmove4 = xmove
        ymove4 = ymove 
    if (sushicenter.getX()>=490):
        xmove = xmove2
        ymove = ymove2
    if (sushicenter.getY()>=360):
        xmove2 = xmove3
        ymove2 = ymove3
    if(sushicenter.getX()<=120):
        xmove3 = xmove4
        ymove3 = ymove4

    update(60)
0 голосов
/ 08 мая 2019

Проблема в том, что когда-то такое условие срабатывает:

 if (sushicenter.getX()>=510):

Он продолжает срабатывать каждый раз, поскольку в результате происходит изменение направления Y, а объект фиксируется в направлении X. Случаи после этого никогда не срабатывают. Мы можем исправить это, сначала «проверив воды», чтобы увидеть, может ли движение вызвать изменение, а затем сделать движения позже. Моя перезапись вашего кода ниже делает это, но также пытается избавиться от чисел в пользу символов, так как все пронумерованные переменные сбивают с толку, даже для вас, учитывая ошибки в коде:

from graphics import *

WIDTH, HEIGHT = 640, 480
BORDER = 130
RADIUS = 5
DIAMETER = RADIUS * 2

# Right
XMOVE_RIGHT = 1
YMOVE_RIGHT = 0
# Down
XMOVE_DOWN = 0
YMOVE_DOWN = 1
# Left
XMOVE_LEFT = -1
YMOVE_LEFT = 0
# Up
XMOVE_UP = 0
YMOVE_UP = -1

win = GraphWin("Draw and Animate", WIDTH, HEIGHT)
win.setBackground('wheat1')

sushiplate = Rectangle(Point(BORDER - DIAMETER * 2, BORDER - DIAMETER), Point(BORDER + DIAMETER * 2, BORDER + DIAMETER))
sushiplate.setFill('white')
sushiplate.draw(win)

leftsushi = Circle(Point(BORDER - DIAMETER, BORDER), RADIUS)
leftsushi.setOutline('green')
leftsushi.setFill('orange')
leftsushi.draw(win)

rightsushi = Circle(Point(BORDER + DIAMETER, BORDER), RADIUS)
rightsushi.setOutline('green')
rightsushi.setFill('orange')
rightsushi.draw(win)

xmove = XMOVE_RIGHT
ymove = YMOVE_RIGHT

while True:
    # Move sushi

    center = sushiplate.getCenter()
    x, y = center.getX() + xmove, center.getY() + ymove

    if x > WIDTH - BORDER:
        xmove, ymove = XMOVE_DOWN, YMOVE_DOWN
    elif y > HEIGHT - BORDER:
        xmove, ymove = XMOVE_LEFT, YMOVE_LEFT
    elif x < BORDER:
        xmove, ymove = XMOVE_UP, YMOVE_UP
    elif y < BORDER:
        xmove, ymove = XMOVE_RIGHT, YMOVE_RIGHT

    for meal_object in (sushiplate, leftsushi, rightsushi):
        meal_object.move(xmove, ymove)

    update(60)
0 голосов
/ 07 мая 2019

Вы уже находитесь под веткой if (sushicenter.getY()<=130):.sushicenter.getY()>=360 не может быть правдой в этом случае.

...