жаль беспокоить кого-либо, но когда я запускаю свой код (моя первая попытка в реальной игре), все работает нормально, но после того, как я закрыл его, некоторые ошибки печатаются, и я не могу найти кого-либо еще с моей проблемой. Мои файлы называются Space Invaders.py, я использую Pycharm (эти ошибки также возникают с IDLE). Это мой код:
import turtle
import math
print("------------Space Invaders - Python------------")
print("-------------GAME NOT YET COMPLETED------------")
print("This console is simply a status readout.")
wn = turtle.Screen()
wn.bgcolor("black")
wn.title("Space Invaders")
borderPen = turtle.Turtle()
borderPen.speed(0)
borderPen.color("white")
borderPen.penup()
borderPen.setposition(-400, -400)
borderPen.pendown()
borderPen.pensize(3)
for i in range(4):
borderPen.fd(800)
borderPen.lt(90)
borderPen.hideturtle()
player = turtle.Turtle()
player.setheading(90)
player.shape("triangle")
player.color("blue")
player.penup()
player.speed(0)
player.setposition(0, -350)
enemy = turtle.Turtle()
enemy.color("red")
enemy.shape("circle")
enemy.penup()
enemy.speed(0)
enemy.setposition(-300, 250)
movementStepE = 2
movementStepEY = -15
movementStepP = 5
def move_left():
x = player.xcor()
new_x = x - movementStepP
if new_x < -380:
new_x = -380
player.setx(new_x)
def move_right():
x = player.xcor()
new_x = x + movementStepP
if new_x > 380:
new_x = 380
player.setx(new_x)
def distancepyth(x1, x2, y1, y2):
pyth = math.sqrt((x1 - x2) ** 2) + (y1 - y2 ** 2)
return(pyth)
turtle.listen()
turtle.onkeypress(move_left, "Left")
turtle.onkeypress(move_right, "Right")
new_y = 250 # 250
while True:
x = enemy.xcor()
y = enemy.ycor()
new_x = x + movementStepE
if new_x > 380:
movementStepE = movementStepE * -1
new_y = y + movementStepEY
new_x = 380
elif new_x < -380:
movementStepE = movementStepE * -1
new_y = y + movementStepEY
new_x = -380
enemy.setposition(new_x, new_y)
turtle.done()
print("-------PROGRAM TERMINATED INTENTIONALLY-------")
и это ошибки:
Traceback (most recent call last):
File "C:/Users/Noname Antilabelson/PycharmProjects/Space Invaders Game/Code/Space Invaders.py", line 97, in <module>
enemy.setposition(new_x, new_y)
File "C:\Users\Noname Antilabelson\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 1776, in goto
self._goto(Vec2D(x, y))
File "C:\Users\Noname Antilabelson\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 3158, in _goto
screen._pointlist(self.currentLineItem),
File "C:\Users\Noname Antilabelson\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 755, in _pointlist
cl = self.cv.coords(item)
File "<string>", line 1, in coords
File "C:\Users\Noname Antilabelson\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 2469, in coords
self.tk.call((self._w, 'coords') + args))]
_tkinter.TclError: invalid command name ".!canvas"
Извините, если я сделал что-то глупое, ваша помощь будет принята с благодарностью! С уважением - Джейкоб Саттон
Вы также можете поместить оператор try catch вокруг него, например, так:
while True:
try:
x = enemy.xcor()
y = enemy.ycor()
new_x = x + movementStepE
if new_x > 380:
movementStepE = movementStepE * -1
new_y = y + movementStepEY
new_x = 380
elif new_x < -380:
movementStepE = movementStepE * -1
new_y = y + movementStepEY
new_x = -380
enemy.setposition(new_x, new_y)
except: #For more accuracy on catching, try something like 'except _tkinter.TclError:'
break #if error raised
turtle.done()
print("-------PROGRAM TERMINATED INTENTIONALLY-------")
Однако имейте в виду, что без чего-либо вроде "кроме _tkinter.TclError:" любые ошибки просто закроют окно.
Как вы отметили в своем комментарии, while True:
это ваша проблема, поскольку ей не место в среде, управляемой событиями, например черепаха. Закрытие окна - это событие, которое запускается асинхронно в ваш основной цикл. Чтобы сделать его синхронным, мы можем использовать событие ontimer()
. Я сделал это изменение в вашем коде ниже, а также бросил в другие идиомы черепахи и очистку кода:
from turtle import Screen, Turtle
print("------------Space Invaders - Python------------")
print("-------------GAME NOT YET COMPLETED------------")
print("This console is simply a status readout.")
def move_left():
new_x = player.xcor() - movementStepP
if new_x < -380:
new_x = -380
player.setx(new_x)
def move_right():
new_x = player.xcor() + movementStepP
if new_x > 380:
new_x = 380
player.setx(new_x)
def move_enemy():
global new_y, movementStepE
new_x = enemy.xcor() + movementStepE
if new_x > 380:
movementStepE *= -1
new_y += movementStepEY
new_x = 380
elif new_x < -380:
movementStepE *= -1
new_y += movementStepEY
new_x = -380
enemy.setposition(new_x, new_y)
screen.ontimer(move_enemy, 50)
movementStepE = 2
movementStepEY = -15
movementStepP = 5
screen = Screen()
screen.bgcolor("black")
screen.title("Space Invaders")
borderPen = Turtle(visible=False)
borderPen.speed("fastest")
borderPen.color("white")
borderPen.pensize(3)
borderPen.penup()
borderPen.setposition(-400, -400)
borderPen.pendown()
for _ in range(4):
borderPen.forward(800)
borderPen.left(90)
player = Turtle("triangle")
player.speed("fastest")
player.setheading(90)
player.color("blue")
player.penup()
player.setposition(0, -350)
enemy = Turtle("circle")
enemy.speed("fastest")
enemy.color("red")
enemy.penup()
enemy.setposition(-300, 250)
screen.onkeypress(move_left, "Left")
screen.onkeypress(move_right, "Right")
screen.listen()
new_y = 250
move_enemy()
screen.mainloop()
print("-------PROGRAM TERMINATED INTENTIONALLY-------")
С помощью этого изменения консоль показывает:
> python3 test.py
------------Space Invaders - Python------------
-------------GAME NOT YET COMPLETED------------
This console is simply a status readout.
-------PROGRAM TERMINATED INTENTIONALLY-------
>
Даже когда вы закрываете окно, пока противник находится в движении.