Есть ли способ, которым я могу остановить падение моего врага с экрана? - PullRequest
2 голосов
/ 01 мая 2019

Я следую простому примеру кода, чтобы немного научиться.У меня нет проблем с кодированием основного экрана, игрока и врага.Однако, когда я пытаюсь приблизить противника, он просто падает с экрана.

Я пытался замедлить движение, а также установить скорость, с которой оно падает до 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

создание enenmy

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 Ответ

1 голос
/ 01 мая 2019

Я переработал вашу игру, чтобы она вела себя так, как вы описываете.Основное изменение - я исключил петлю while True:, которой нет места в управляемой событиями среде, такой как черепаха.Я заменил его на событие таймера:

# 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

Мое убеждение в том, что немедленная поддержка самого последнего хода после того, как вы прошли, должна помочь, что я сделал выше.

...