Почему враг не двигается?

У меня проблема все работает кроме когда противник должен двигаться вправо пишет ошибка строка, самая последняя строка. Это началось, когда я сделал свою пулю; до этого все работало нормально. Я не знаю, почему он это делает, но я не могу понять это; это странно. Пожалуйста, помогите, большое спасибо, и, пожалуйста, не осуждайте мою читабельность, потому что я только начал писать код. Вот сообщение File "E:\Code\Space Invaders.py", строка 106, в файле evil.setx(x)

 import turtle
 import os

 wn = turtle.Screen()
 wn.bgcolor("black")
 wn.title('Space Invasders')

 border_pen = turtle.Turtle()
 border_pen.speed(0)
 border_pen.color('white')
 border_pen.penup()
 border_pen.setposition(-300,-300)
 border_pen.pendown()
 border_pen.pensize(3)
 for side in range(4):
    border_pen.fd(600)
    border_pen.lt(90)
 border_pen.hideturtle()

 player = turtle.Turtle()
 player.color('blue')
 player.shape('triangle')
 player.penup()
 player.speed(0)
 player.setposition(0, -250)
 player.setheading(90)
 playerspeed = 15

 enemy = turtle.Turtle()
 enemy.color('red')
 enemy.shape('circle')
 enemy.penup()
 enemy.speed(0)
 enemy.setposition(-200, 250)

 enemyspeed = 2

 bullet = turtle.Turtle()
 bullet.color('yellow')
 bullet.shape('triangle')
 bullet.penup()
 bullet.speed(0)
 bullet.setheading(90)
 bullet.shapesize(0.5, 0.5)
 bullet.setposition(player.xcor(), player.ycor() + 10)
 bullet.ht()
 bulletspeed = 20

 player_alive = True

 if enemy.xcor() == player.xcor() and enemy.ycor() == player.ycor():
    player_alive = False


 def fire():

        x = player.xcor()
        y = player.ycor() + 10
        bullet.st()
        bullet.setposition(x, y)

 def right():
    x = player.xcor()
    x += playerspeed
    if x > 280:
        x = 280
    player.setx(x)


 def left():
    x = player.xcor()
    x -= playerspeed
    if x < -280:
        x = - 280
    player.setx(x)


 wn.onkey(left, "Left")
 wn.onkey(right, "Right")
 wn.onkey(fire, "space")
 wn.listen()
 wn.mainloop()

 while player_alive == True:
    x = enemy.xcor()
    x += enemyspeed
    enemy.setx(x) #this line is messed up

person Jonah.Jackson    schedule 20.01.2020    source источник
comment
Что произойдет, если вы замените x = -280 на x = -280? Не знаю, почему у вас есть место там   -  person KILLtheWEEZEL    schedule 20.01.2020
comment
поместите комментарий к строке, на которую он жалуется, и дайте нам точное сообщение об ошибке   -  person hkBst    schedule 20.01.2020
comment
я не могу воспроизвести описанное поведение. Можете ли вы опубликовать полное сообщение об ошибке?   -  person YFrog    schedule 20.01.2020
comment
@KILLtheWEEZEL Хотя x = - 5 не должно иметь пробела между - и 5, в соответствии со стандартными шаблонами кодирования, я считаю, что технически это нормально. Переход к онлайн-REPL python показывает, что это не гарантированная ошибка - по крайней мере, некоторые компиляторы принимают ее, и я ожидаю, что большинство. Тем не менее, OP должен включать точное сообщение об ошибке, а также должно быть добавлено дополнительное предложение, указывающее точную строку кода, на которую делается ссылка, с дублированием этой строки как однострочный кодовый блок.   -  person SherylHohman    schedule 21.01.2020
comment
Я посчитал строки и пришел к выводу, что строка 75 является player.setx(x) в кодовом блоке def left():. Это правильно?   -  person SherylHohman    schedule 21.01.2020
comment
Кстати, в Space Invaders написано с ошибкой ;)   -  person SherylHohman    schedule 21.01.2020
comment
у меня была неправильная линия Шерил Хохман   -  person Jonah.Jackson    schedule 21.01.2020


Ответы (1)


Это проблема:

wn.mainloop()

while player_alive == True:
    x = enemy.xcor()
    x += enemyspeed
    enemy.setx(x) #this line is messed up

Метод mainloop() должен быть последним вызовом в вашей программе — его вызов переключает обработку событий на цикл обработки событий tkinter. Код, следующий за ним, не будет выполняться до тех пор, пока мир черепах не будет закрыт.

Для немедленного исправления я предлагаю вам переместить вызов mainloop() до окончания цикла while:

while player_alive:
    x = enemy.xcor()
    x += enemyspeed
    enemy.setx(x)

wn.mainloop()

Для долгосрочного исправления я предлагаю вам использовать не цикл while, а событие ontimer().

person cdlane    schedule 21.01.2020