Питон черепаха дракон игра препятствия пауза - PullRequest
0 голосов
/ 08 марта 2019

Почему моя игра-дракон не работает правильно? Когда дракон прыгает, препятствие останавливается. Я хочу, чтобы когда дракон прыгнул препятствие продолжает двигаться. Это та же игра, что и игра-дракон, найденная в интернете, где препятствия встречаются одно за другим. Но это не работает должным образом. В чем логическая ошибка?

import turtle
import random
import time

win = turtle.Screen()
win.title("Dragon game")
win.bgcolor("white")
win.setup(width=800, height=300)

base_line = turtle.Turtle()
base_line.speed(0)
base_line.back(300)
base_line.fd(600)

dragon = turtle.Turtle()
dragon.shape("square")
dragon.speed(0)
dragon.color("black")
dragon.penup()
dragon.goto(-250, 10)
dragon.pendown()
dragon.setheading(90)

dragon_state = "steady"
number_of_obstacles = 10

obstacles_list = []

for i in range(number_of_obstacles):
    obstacles_list.append(turtle.Turtle())


for i in obstacles_list:
    i.hideturtle()
    i.color("black")
    i.shape("square")
    i.shapesize(1, 2)

    i.penup()
    i.speed(0)
    i.setheading(90)

    i.setposition(400, 5)

    i.showturtle()


def jump_dragon():
    global dragon_state
    if dragon_state == "steady":
        dragon_state = "jump"
    dragon.penup()
    dragon.speed(1)
    x = dragon.xcor()
    y = dragon.ycor() + 90
    dragon.setposition(x, y)
    y = dragon.ycor() - 90

    dragon.setposition(x, y)

    dragon.showturtle()


win.listen()
win.onkey(jump_dragon, "space")
index = 0

while True:

    x = random.randint(300, 505)

    while index < 10:

        s = random.randint(1, 4)
        x = x - 10

        obstacles_list[index].penup()
        obstacles_list[index].speed(1)
        obstacles_list[index].goto(x, 5)

        if dragon.distance(obstacles_list[index]) < 20:
            dragon_state = "steady"
            obstacles_list[index].hideturtle()
            print("Collision", index)
            x = random.randint(300, 405)
            index += 1
        elif obstacles_list[index].xcor() < -290:
            obstacles_list[index].hideturtle()
            index += 1


win.mainloop()

1 Ответ

0 голосов
/ 09 марта 2019

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

Чтобы сделать это, мы сначала подбрасываем while True:, которому нет места в мире, управляемом событиями, как черепаха. На его место мы помещаем событие таймера, которое срабатывает через равные промежутки времени. Далее мы разбиваем горизонтальное движение препятствия и вертикальное движение дракона на маленькие чередующиеся движения. Ниже моя переделка вашего кода на основе вышеизложенного - я упростила вашу логику препятствий, чтобы этот пример был простым:

from turtle import Screen, Turtle

def jump_dragon():
    global dragon_state, dragon_direction

    if dragon_state == "steady":
        dragon_state = "jump"
        dragon_direction = 1
        dragon.forward(10)

def play():
    global dragon_state, dragon_direction

    if dragon_state == "jump":
        dragon.forward(dragon_direction * 10)

        y = dragon.ycor()

        if y >= 100:
            dragon_direction *= -1
        elif y <= 10:
            dragon_state = "steady"

    obstacle.forward(10)

    if obstacle.xcor() < -290:
        obstacle.hideturtle()
        obstacle.goto(290, 20)
        obstacle.showturtle()
    elif dragon.distance(obstacle) < 20:
        print("Collision")
        obstacle.hideturtle()
        obstacle.goto(290, 20)
        obstacle.showturtle()

    win.ontimer(play, 75)

win = Screen()
win.title("Dragon game")
win.setup(width=800, height=300)

base_line = Turtle(visible=False)
base_line.speed('fastest')
base_line.back(300)
base_line.forward(600)

dragon = Turtle("square", visible=False)
dragon.speed('slow')
dragon.setheading(90)
dragon.penup()
dragon.goto(-250, 10)
dragon.showturtle()

dragon_state = "steady"
dragon_direction = 1

obstacle = Turtle("square", visible=False)
obstacle.shapesize(2, 1)
obstacle.speed('fastest')
obstacle.penup()
obstacle.setheading(180)
obstacle.setposition(290, 20)
obstacle.showturtle()

win.onkey(jump_dragon, "space")
win.listen()

play()

win.mainloop()

Я также переработал другие части кода для стиля и ясности.

...