Коробчатые клоны не опускаются как оригиналы - PullRequest
0 голосов
/ 22 сентября 2019

Я создал код, который генерирует пару случайных красных прямоугольников, и они должны двигаться вниз, а затем синий прямоугольник (игрок) должен увернуться от них, используя клавиши со стрелками.Я сделал клоны, но они не будут падать, как оригинальная красная коробка, есть только 1 коробка, которая падает, и это, вероятно, будет оригинальная коробка.

Это код:

from turtle import Screen, Turtle
import turtle
import random
import time
import sys
width = 800
height = 600
p_x = 0 #player x
p_y = 0 #player y

e_x = 0 #enemy x
e_y = 0 #enemy y
e_s = 2 #enemy speed

wn = turtle.Screen()
wn.bgcolor('Black')
wn.setup(width, height)

#player
p = Turtle()
p.penup()
p.shape('square')
p.color('blue')
p.penup()

#enemy
e = Turtle()
e.penup()
e.goto (0, 400)
e.pendown()
e.shape('square')
e.color('red')
e.penup()

#pen
pen = turtle.Turtle()
pen.speed(0)
pen.color("black")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)

alive = True

#main loop

while alive == True:
    #player movment
    def p_up():
        check_collision()
        p_y = p.ycor()
        p_y += 20
        p.sety(p_y)

    def p_down():
       check_collision()
       p_y = p.ycor()
       p_y -= 20
       p.sety(p_y)

    def p_right():
        check_collision()
        p_x = p.xcor()
        p_x += 20
        p.setx(p_x)

    def p_left():
        check_collision()
        p_x = p.xcor()
        p_x -= 20
        p.setx(p_x)

    #keyboard bindind
    p.penup()
    wn.listen()
    wn.onkeypress(p_up, 'Up')
    wn.onkeypress(p_down, 'Down')
    wn.onkeypress(p_right, 'Right')
    wn.onkeypress(p_left, 'Left')

    #end game
    def end():
            wn.bgcolor('white')
            alive = False
            pen.write("you touched a box", align="center", font=("Courier", 24, "normal"))
            alive = False

    #collision
    def check_collision():
        if p.distance(e) < 20:
            end()

    #bringing enemy to the top, and then to a random spot on the y axis 
    for i in range (1, 5):
        e.clone()
        e.hideturtle()
        e_x = random.randint(-300, 300)
        e_y = 300
        print(random)
        e.goto(e_x, e_y)
        e.showturtle()

    #ememy moving down
    for i in range (1, 300):
        check_collision()
        e_y = e.ycor()
        e_y -= e_s
        e.sety(e_y)

    e.hideturtle()

while True:
    wn.update()

1 Ответ

0 голосов
/ 22 сентября 2019

Ваш код беспорядок, поэтому простого решения для ваших проблем не существует.В частности:

Вы пытаетесь создать несколько врагов, но ваша функция check_collision() и код движения предназначены только для обработки одного врага.

Вы делаете e.clone(), но не можете сохранить результат, поэтомуэто просто засоряет экран.Черепахи, по сути, являются глобальными объектами, которые не собирают мусор, поэтому вместо клонирования новых используйте старые.

Удвоенные циклы while кажутся странными:

while alive == True:
    # ...

while True:
    wn.update()

В частности,update() не имеет большого смысла, если только tracer() не был задушен.Таким образом, этот второй цикл фактически ничего не делает.

Бесконечные, или длительные, игровые циклы не имеют смысла в управляемом событиями мире, таком как черепаха.Имеет больше смысла использовать screen.ontimer().

Вот мое переписывание вашего кода, который, я считаю, делает то, что вы хотите:

from turtle import Screen, Turtle
from random import randint

WIDTH, HEIGHT = 800, 600
FONT = ("Courier", 24, "normal")

# end game
def end():
    global alive

    screen.bgcolor('white')
    pen.write("You touched a box!", align="center", font=FONT)
    alive = False

    screen.update()

# collision
def check_collision():
    screen.update()

    for enemy in enemies:
        if player.distance(enemy) < 20:
            end()
            break

# player movement
def p_up():
    player.sety(player.ycor() + 20)
    check_collision()

def p_down():
    player.sety(player.ycor() - 20)
    check_collision()

def p_right():
    player.setx(player.xcor() + 20)
    check_collision()

def p_left():
    player.setx(player.xcor() - 20)
    check_collision()

# main loop
def move():

    for enemy in enemies:
        if enemy.ycor() < -300:
            enemy.hideturtle()
            enemy.goto(randint(-400, 400), 300)
            enemy.velocity = randint(4, 8)
            enemy.showturtle()
        else:
            enemy.sety(enemy.ycor() - enemy.velocity)

        check_collision()

        if not alive:
            break

    if alive:
        screen.ontimer(move, 50)

alive = True

screen = Screen()
screen.bgcolor('Black')
screen.setup(WIDTH, HEIGHT)
screen.tracer(False)

# player
player = Turtle()
player.shape('square')
player.color('blue')
player.penup()

# enemy
enemy_prototype = Turtle()
enemy_prototype.hideturtle()
enemy_prototype.shape('square')
enemy_prototype.color('red')
enemy_prototype.penup()

enemies = []

for _ in range(3):
    enemy = enemy_prototype.clone()
    enemy.goto(randint(-400, 400), 300)
    enemy.velocity = randint(4, 8)
    enemy.showturtle()
    enemies.append(enemy)

# pen
pen = Turtle()
pen.hideturtle()
pen.penup()
pen.sety(260)

# keyboard bindind
screen.onkeypress(p_up, 'Up')
screen.onkeypress(p_down, 'Down')
screen.onkeypress(p_right, 'Right')
screen.onkeypress(p_left, 'Left')
screen.listen()

move()

screen.mainloop()
...