尝试同时创建两个对象,但它创建了一个

问题描述 投票:0回答:1

我正在学习Python的同时尝试开发一个简单的游戏。游戏并不复杂,随机汽车(正方形)在屏幕右侧生成,然后向左行驶。我们是一只乌龟,试图避开它们并到达屏幕顶部。

问题是我下面的代码不会同时生成两个对象,它只生成一个。

from turtle import Screen
from turt import Turt
from spawnpoint import SpawnPoint
from cars import Car
import random

screen = Screen()
screen.setup(1000, 700)
screen.title("Cars and Turtle")
screen.bgcolor("gray")

turt = Turt()

is_game_on = True

screen.listen()
screen.onkey(turt.move_up, "Up")

spawn_points_ycords = [300, 200, 100, 0, -100, -200]
spawn_1 = SpawnPoint(spawn_points_ycords[0])
spawn_2 = SpawnPoint(spawn_points_ycords[1])
spawn_3 = SpawnPoint(spawn_points_ycords[2])
spawn_4 = SpawnPoint(spawn_points_ycords[3])
spawn_5 = SpawnPoint(spawn_points_ycords[4])
spawn_6 = SpawnPoint(spawn_points_ycords[5])
spawn_points = [spawn_1, spawn_2, spawn_3, spawn_4, spawn_5, spawn_6]

while is_game_on:
    for n in range(60):
        if n == 59:
            random_spawn = spawn_points[random.randint(0, len(spawn_points)-1)]
            random_spawn_2 = spawn_points[random.randint(0, len(spawn_points)-1)]
            while random_spawn_2 == random_spawn:
                random_spawn_2 = spawn_points[random.randint(0, len(spawn_points) - 1)]
            random_spawn_car = Car(random_spawn.spawn.ycor())
            random_spawn_2_car = Car(random_spawn_2.spawn.ycor())

screen.exitonclick()

我的重生点类代码:

from turtle import Turtle


class SpawnPoint:
    def __init__(self, ycor):
        self.spawn = Turtle()
        self.spawn.hideturtle()
        self.spawn.speed(0)
        self.spawn.penup()
        self.spawn.goto(600, ycor)
        self.spawn.showturtle()
        self.new_car = None

以及我的汽车类别代码:

from turtle import Turtle
import random


class Car:
    def __init__(self, ycor):
        self.body = Turtle()
        self.body.hideturtle()
        self.body.penup()
        self.body.shape("square")
        self.colors = ["black", "red", "orange", "blue", "green", "yellow"]
        self.body.color(self.colors[random.randint(0, len(self.colors)-1)])
        self.body.shapesize(1, 5, 0)
        self.body.speed(2)
        self.body.goto(700, ycor)
        self.body.showturtle()
        self.body.goto(-700, ycor)

我不知道如何解决这个错误。我正在使用 Turtle 模块。

python turtle-graphics python-turtle
1个回答
2
投票

两个汽车对象已创建,但问题是您尚未实现多只乌龟的实时移动,因此第一只乌龟在创建第二只乌龟或开始移动之前完成了它在屏幕上的 5 秒旅程。

当您遇到这样的问题时,我的建议是将问题简化为最小的、可重现的示例。这个过程通过消除噪音使问题变得明显。例如,如果将生成点和目标点移动到可见屏幕上,问题就会变得清晰。

这是一个更简单的演示:

from turtle import Screen, Turtle


class Car:
    def __init__(self, x, y, speed):
        self.x = x
        self.y = y
        self.speed = speed
        self.body = Turtle()
        self.body.shape("square")
        self.body.penup()
        self.body.goto(x, y)

    def move(self):
        self.x -= self.speed
        w = screen.screensize()[0]

        if self.x < -w:
            self.x = w

        self.body.goto(self.x, self.y)


def tick():
    for action in keys_pressed:
        actions[action]()

    for car in cars:
        car.move()

    screen.update()
    screen.ontimer(tick, frame_delay_ms)


screen = Screen()
w, h = screen.screensize()
screen.tracer(0)
t = Turtle()
t.penup()
t.goto(0, -h + 50)
t.left(90)
cars = [
    Car(w, -200, 3),
    Car(w, -100, 5),
    Car(w, 0, 4.5),
    Car(w, 100, 4),
    Car(w, 200, 6),
]
frame_delay_ms = 1000 // 30
step_speed = 10
actions = dict(
    u=lambda: t.forward(step_speed),
)
keys_pressed = set()
screen.onkeypress(lambda: keys_pressed.add("u"), "Up")
screen.onkeyrelease(lambda: keys_pressed.remove("u"), "Up")
screen.listen()
tick()
screen.exitonclick()
© www.soinside.com 2019 - 2024. All rights reserved.