我认为我的游戏应该可以平稳运行,但请确保它只是冻结了。我真的不知道从哪里开始,因为没有错误消息:
import turtle
import random
# create sprite
class Sprite(turtle.Turtle):
def __init__(self, sprite_shape, color, startx, starty):
super().__init__( shape=sprite_shape)
self.speed(0)
self.penup()
self.color(color)
self.goto(startx, starty)
self.speed = 1
def move(self):
self.forward(self.speed)
# Boundary detection
if self.xcor() > 300:
self.setx(300)
self.rt(90)
elif self.xcor() < -300:
self.setx(-300)
self.lt(120)
if self.ycor() > 300:
self.sety(300)
self.lt(90)
elif self.ycor() < -300:
self.sety(-300)
self.lt(120)
def is_collision(self, other):
return self.distance(other) < 20
# create enemy
class Enemy(Sprite):
def __init__(self , spriteshape, color, startx, starty):
Sprite.__init__(self , spriteshape, color, startx, starty)
self.speed = 4
self.setheading(random.randint(0,360))
#Set up the screen
wn = turtle.Screen()
wn.bgcolor("black")
wn.title("Space Invaders")
#Draw border
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(6)
border_pen.fd(600)
border_pen.lt(90)
border_pen.fd(600)
border_pen.lt(90)
border_pen.fd(600)
border_pen.lt(90)
border_pen.fd(600)
border_pen.lt(90)
border_pen.hideturtle()
#create the base
base = turtle.Turtle()
base.speed(0)
base.color("blue")
base.penup()
base.setposition(0, -280)
base.pendown()
base.pensize(3)
base.forward(295)
base.right(90)
base.forward(15)
base.right(90)
base.forward(592)
base.right(90)
base.forward(15)
base.right(90)
base.forward(390)
base.hideturtle()
#Create the player turtle
player = turtle.Turtle()
player.color("yellow")
player.shape("square")
player.penup()
player.speed(0)
player.setposition(0, -250)
player.setheading(90)
player.shapesize(2.5)
playerspeed = 15
#Create the player turtle
player = turtle.Turtle()
player.color("yellow")
player.shape("square")
player.penup()
player.speed(0)
player.setposition(0, -250)
player.shapesize(2.3)
player_speed = 35
# player movement
def move_left():
x = player.xcor() - player_speed
if x < -280:
x = - 280
player.setx(x)
def move_right():
x = player.xcor() + player_speed
if x > 280:
x = 280
player.setx(x)
# keybindings
turtle.listen()
turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")
# create sprite
enemy = Enemy('circle', 'red', -200, 250)
# main game loop
def play():
enemy.move()
# check for collision
if enemy.is_collision(player):
x = random.randint(-250, 250)
y = random.randint(-250, 250)
enemy.setposition(-250, 250)
enemy.setheading(250)
wn.ontimer(play, 10 )
play()
if enemy.is_collision(base):
player.hideturtle()
enemy.hideturtle()
base.hideturtle()
print ("Game Over")
play()
我希望敌人能够移动,但是它被冻结在空中。玩家移动,但留下一个副本。我无法测试重生系统在与基地碰撞后是否能正常工作。
答案 0 :(得分:1)
我看到两个问题
您需要mainloop()
,以便turtle(或更确切地说是turtle使用的tkinter
)可以运行循环,该循环从系统中(一次又一次)获取键/鼠标事件并运行侦听器。它还使用此循环来运行添加了timer()
的元素。
您的缩进错误符合wn.ontimer(play, 10)
。您必须在play()
的末尾使用它才能再次运行它,但是您必须在if enemy.is_collision(player):
内使用它,因此它不会被执行。
移动红色圆圈的代码,我可以使用键移动黄色正方形
# main game loop
def play():
enemy.move()
# check for collision
if enemy.is_collision(player):
x = random.randint(-250, 250)
y = random.randint(-250, 250)
enemy.setposition(-250, 250)
enemy.setheading(250)
if enemy.is_collision(base):
player.hideturtle()
enemy.hideturtle()
base.hideturtle()
print ("Game Over")
wn.ontimer(play, 10)
# start
play()
turtle.mainloop()
答案 1 :(得分:0)
我在下面重新处理了您的代码,解决了一些问题和样式问题。我注意到的主要问题是:您将base
乌龟与所绘制的形状与base
乌龟与碰撞所混淆;在Sprite
中,您将turtle的speed()
方法重新定义为实例变量; @furas(+1)通过play()
解决的那些问题需要ontimer()
子句中的else
才能使游戏正确退出:
from turtle import Screen, Turtle
from random import randint
CURSOR_SIZE = 20
WIDTH, HEIGHT = 600, 600
MARGIN = 50
BASE_HEIGHT = 15
PEN_SIZE = 5
PLAYER_SIZE = 50
SPRITE_SIZE = CURSOR_SIZE
PLAYER_SPEED = PLAYER_SIZE/2
ENEMY_SPEED = SPRITE_SIZE/4
# Create sprite
class Sprite(Turtle):
def __init__(self, sprite_shape, color, startx, starty):
super().__init__(shape=sprite_shape)
self.hideturtle()
self.speed('fastest')
self.penup()
self.color(color)
self.goto(startx, starty)
self.showturtle()
self.steps = 1
def move(self):
self.forward(self.steps)
# Boundary detection
if self.xcor() > WIDTH/2 - SPRITE_SIZE/2:
self.setx(WIDTH/2 - SPRITE_SIZE/2)
self.rt(90)
elif self.xcor() < SPRITE_SIZE/2 - WIDTH/2:
self.setx(SPRITE_SIZE/2 - WIDTH/2)
self.lt(120)
if self.ycor() > HEIGHT/2 - SPRITE_SIZE/2:
self.sety(HEIGHT/2 - SPRITE_SIZE/2)
self.lt(90)
elif self.ycor() < SPRITE_SIZE/2 - HEIGHT/2:
self.sety(SPRITE_SIZE/2 - HEIGHT/2)
self.lt(120)
def is_collision(self, other):
return self.distance(other) < SPRITE_SIZE/2
# Create enemy
class Enemy(Sprite):
def __init__(self, spriteshape, color, startx, starty):
super().__init__(spriteshape, color, startx, starty)
self.steps = ENEMY_SPEED
self.setheading(randint(0, 360))
def is_collision(self, other):
return self.distance(other) < PLAYER_SIZE/2
# Set up the screen
wn = Screen()
wn.setup(WIDTH + MARGIN * 2, HEIGHT + MARGIN * 2)
wn.bgcolor('black')
wn.title("Space Invaders")
# Draw border
border_pen = Turtle()
border_pen.hideturtle()
border_pen.speed('fastest')
border_pen.color('white')
border_pen.pensize(PEN_SIZE)
border_pen.penup()
border_pen.setposition(-WIDTH/2, -HEIGHT/2)
border_pen.pendown()
for _ in range(2):
border_pen.fd(WIDTH)
border_pen.lt(90)
border_pen.fd(HEIGHT)
border_pen.lt(90)
# Create the base
base = Turtle()
base.hideturtle()
base.shape('square')
base.color('blue', 'black')
base.penup()
base.setposition(0, BASE_HEIGHT/2 - HEIGHT/2 + PEN_SIZE)
base.shapesize(BASE_HEIGHT / CURSOR_SIZE, (WIDTH - PEN_SIZE*2) / CURSOR_SIZE, PEN_SIZE)
base.showturtle()
# Create the player turtle
player = Turtle()
player.hideturtle()
player.shape('square')
player.shapesize(PLAYER_SIZE / CURSOR_SIZE)
player.color('yellow')
player.speed('fastest')
player.penup()
player.setposition(0, PLAYER_SIZE/2 - HEIGHT/2 + BASE_HEIGHT + PEN_SIZE)
player.setheading(90)
player.showturtle()
# player movement
def move_left():
x = player.xcor() - PLAYER_SPEED
if x < PLAYER_SIZE - WIDTH/2:
x = PLAYER_SIZE/2 - WIDTH/2
player.setx(x)
def move_right():
x = player.xcor() + PLAYER_SPEED
if x > WIDTH/2 - PLAYER_SIZE:
x = WIDTH/2 - PLAYER_SIZE/2
player.setx(x)
# Keybindings
wn.onkey(move_left, 'Left')
wn.onkey(move_right, 'Right')
wn.listen()
# Create sprite
enemy = Enemy('circle', 'red', randint(SPRITE_SIZE - WIDTH/2, WIDTH/2 - SPRITE_SIZE), randint(0, HEIGHT/2 - SPRITE_SIZE))
# main game loop
def play():
enemy.move()
# check for collision
if enemy.is_collision(player):
x = randint(SPRITE_SIZE - WIDTH/2, WIDTH/2 - SPRITE_SIZE)
y = randint(0, HEIGHT/2 - SPRITE_SIZE)
enemy.setposition(x, y)
enemy.setheading(randint(0, 360))
if enemy.ycor() <= BASE_HEIGHT - HEIGHT/2 + SPRITE_SIZE/2:
player.hideturtle()
enemy.hideturtle()
base.hideturtle()
print("Game Over")
else:
wn.ontimer(play, 25)
# start
play()
wn.mainloop()