我正在努力开发一个简单的游戏,同时我还在学习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 模块.

推荐答案

创建了两个Car对象,但问题是您还没有为多个 turtle 实现实 timeshift 动,所以第一个 turtle 在第二个 turtle 创建或开始移动之前完成了它在屏幕上的5秒旅程.

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

下面是一个更简单的演示:

from turtle import Turtle


t = Turtle()
tt = Turtle()
t.speed(2)
tt.speed(2)

t.goto(100, 100)
tt.goto(200, 100)

t.Screen().exitonclick()

当您运行这个程序时,您将看到t在大约一秒钟内从0,0移动到t,t.只有当t到达目的地时,tt才会开始移动.在每一行添加print条语句是另一种方式,可以看到每goto条语句都会完全阻止脚本,直到缓慢移动完成.你所期望的同 timeshift 动并不是乌龟的默认行为.

典型的解决方案是使用tracer(0)来禁用Turtle用来平滑goto的内部更新/渲染循环.完成此操作后,您可以随意重新定位乌龟并呼叫turtle.update()来渲染帧.重新实现流畅的动作由你决定,这并不难做到.

同样值得注意的是,您的exitonclick呼叫永远不会到达,并且forif n == 59:的循环是毫无意义的.Car永远不会被垃圾收集,可能不应该在初始化器中做这么多工作.不过,你的班级要得到using composition rather than inheritance分的赞誉.

我还提醒您,在您确信基本功能是可操作的之前,不要增加复杂性,如多个类和文件.如果像移动这样简单的东西没有像您预期的那样工作,那么所有其他的事情只会阻碍调试.经常运行您的代码,在工作时建立对其行为的保证.

以下是你可能如何开始重新设计你的项目的快速草图.这是根据我推荐的real-time setup for turtle美元计算的.

import turtle


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

    def move(self):
        self.x -= self.speed
        w = turtle.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()

    turtle.update()
    win.ontimer(tick, frame_delay_ms)


if __name__ == "__main__":
    w, h = turtle.screensize()
    turtle.tracer(0)
    t = turtle.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),
    )
    win = turtle.Screen()
    keys_pressed = set()
    win.onkeypress(lambda: keys_pressed.add("u"), "Up")
    win.onkeyrelease(lambda: keys_pressed.remove("u"), "Up")
    win.listen()
    tick()
    win.exitonclick()

Python相关问答推荐

Geopandas未返回正确的缓冲区(单位:米)

ConversationalRetrivalChain引发键错误

OpenGL仅渲染第二个三角形,第一个三角形不可见

如何将一组组合框重置回无 Select tkinter?

从嵌套极轴列的列表中删除元素

如何在Python中将超链接添加到PDF中每个页面的顶部?

PYTHON中的pd.wide_to_long比较慢

如何从一个维基页面中抓取和存储多个表格?

将标签与山脊线图对齐

Python:在cmd中添加参数时的语法

如何在Python中画一个只能在对角线内裁剪的圆?

判断字典键、值对是否满足用户定义的搜索条件

SQL模型中包含日期时间的TypeError

在多索引的Pandas数据帧中,有可能有一个值引用更高级别索引的列吗?

抽象工厂模式与委托者模式组合时出现递归错误

如果属性的类型是联合并使用默认值,为什么属性不能与类同名?

在HS代码之前获取字符串:数字(不包括HS代码:某个数字)

压平JSON后的Pandas 保留柱

PythonRequests.get以不同的编码提供响应

为什么一些地块有网格线,而另一些地块没有网格线?