有什么方法可以阻止我的敌人从屏幕上掉下来吗?

时间:2019-04-30 21:47:09

标签: python python-3.x turtle-graphics

我正在按照一个简单的代码示例进行一些学习。我对基本屏幕,播放器和敌人进行编码没有问题。但是,当我试图使敌人靠近时,它就会从屏幕上掉下来。

我尝试减慢运动速度,并在使用后将其速度设置为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,然后再向左移动即可。

1 个答案:

答案 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

一旦您过去,我的信念就是立即撤消最近的举动,这应该对我有所帮助。