我正在按照一个简单的代码示例进行一些学习。我对基本屏幕,播放器和敌人进行编码没有问题。但是,当我试图使敌人靠近时,它就会从屏幕上掉下来。
我尝试减慢运动速度,并在使用后将其速度设置为0,然后在“安全”后将其重置为原始速度。这是行不通的。
import turtle
import os
wn = turtle.Screen()
wn.bgcolor("black")
wn.title("Space Invaders")
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 = 1
enemydropspeed = 40
def move_left():
x=player.xcor()
x -= playerspeed
if x < -280:
x = -280
player.setx(x)
def move_right():
x=player.xcor()
x += playerspeed
if x > 280:
x = 280
player.setx(x)
turtle.listen()
turtle.onkey(move_left,"Left")
turtle.onkey(move_right,"Right")
while True:
# move the enemy
x = enemy.xcor()
x += enemyspeed
这些都是无效的...我想
if enemy.xcor() < -280:
y = enemy.ycor()
y -= enemydropspeed
enemyspeed *= -1
enemy.sety(y)
if enemy.xcor() > 280:
y = enemy.ycor()
y -= enemydropspeed
enemyspeed *= -1
enemy.sety(y)
enemy.setx(x)
wn.mainloop()
运行此命令时,敌人将移动到屏幕的“右侧”,然后仅掉下边缘,只需将其向下移动40,然后再向左移动即可。
答案 0 :(得分:1)
我已经对您的游戏进行了重新设计,使其表现如您所描述。主要变化是我消除了while True:
循环,该循环在像Turtle这样的事件驱动环境中没有位置。我已将其替换为计时器事件:
# Space invaders
from turtle import Screen, Turtle
SIZE = 600
BORDER_WIDTH = 3
CURSOR_SIZE = 20
PLAYER_SPEED = 15
ENEMY_DROP_SPEED = CURSOR_SIZE * 2
# event handlers for left and right buttons
def move_left():
x = player.xcor() - PLAYER_SPEED
if x < CURSOR_SIZE/2 - SIZE/2:
x = CURSOR_SIZE/2 - SIZE/2
player.setx(x)
def move_right():
x = player.xcor() + PLAYER_SPEED
if x > SIZE/2 - CURSOR_SIZE/2:
x = SIZE/2 - CURSOR_SIZE/2
player.setx(x)
# main game loop
def move_everything():
global enemyspeed
# move the enemy
x, y = enemy.position()
x += enemyspeed
if not CURSOR_SIZE/2 - SIZE/2 <= x <= SIZE/2 - CURSOR_SIZE/2:
y -= ENEMY_DROP_SPEED
x -= enemyspeed
enemyspeed *= -1
enemy.setposition(x, y)
screen.ontimer(move_everything, 50)
enemyspeed = 5
# setup the screen
screen = Screen()
screen.bgcolor("black")
screen.title("Space Invaders")
# draw border
border = Turtle(visible=False)
border.speed('fastest')
border.color("white")
border.pensize(BORDER_WIDTH)
border.penup()
border.setposition(-SIZE/2 - BORDER_WIDTH, -SIZE/2 - BORDER_WIDTH)
border.pendown()
for _ in range(4):
border.forward(SIZE + BORDER_WIDTH*2)
border.left(90)
# create the player turtle
player = Turtle("triangle")
player.color("blue")
player.penup()
player.speed('fastest')
player.sety(CURSOR_SIZE/2 - SIZE/2)
player.setheading(90)
# create the enenmy
enemy = Turtle("circle")
enemy.color("red")
enemy.speed('fastest')
enemy.penup()
enemy.setposition(CURSOR_SIZE/2 - SIZE/2, SIZE/2 - CURSOR_SIZE/2)
# bind to keyboard
screen.onkey(move_left, "Left")
screen.onkey(move_right, "Right")
screen.listen()
move_everything()
screen.mainloop()
就您的原始代码而言,当到达边缘时,它似乎不再发抖,而是回到边缘。靠近边缘的x坐标:
277
278
279
280
281
282
281
282
281
282
一旦您过去,我的信念就是立即撤消最近的举动,这应该对我有所帮助。