Python Turtle游戏问题:无法同时生成两辆汽车对象
解决Turtle游戏中无法同时生成两辆汽车的问题
问题描述
开发一款Python Turtle游戏:随机方形汽车从屏幕右侧生成并向左移动,玩家操控乌龟躲避汽车并到达屏幕顶部。但代码无法同时生成两辆汽车,仅能生成一辆。
原代码
主代码
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()
SpawnPoint类代码
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
Car类代码
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)
问题根源
- Car类移动逻辑阻塞:原Car类的
__init__方法中直接调用self.body.goto(-700, ycor),会让汽车瞬间从右侧移动到左侧,且这个过程是阻塞的——必须等第一辆汽车完成移动,才会创建第二辆,导致视觉上只看到一辆。 - 缺少屏幕刷新控制:Turtle默认自动刷新,但嵌套循环下所有图形操作会积压,最后只显示最终状态,看不到中间生成过程。
- 未维护汽车实例:生成的汽车实例没有被保存,无法在后续循环中控制移动,甚至可能被垃圾回收。
修复方案
1. 修改Car类,分离移动逻辑
将一次性移动改为逐帧移动,添加move方法控制每次移动距离,并处理移出屏幕的汽车:
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(random.choice(self.colors)) self.body.shapesize(1, 5, 0) self.body.goto(700, ycor) self.body.showturtle() self.speed = 5 # 可调整汽车移动速度 def move(self): new_x = self.body.xcor() - self.speed self.body.goto(new_x, self.body.ycor()) # 汽车移出屏幕左侧时,清理资源 if new_x < -700: self.body.hideturtle() self.body.clear()
2. 重构主代码,优化循环与实例管理
启用手动屏幕刷新,维护汽车实例列表,控制生成频率:
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") screen.tracer(0) # 关闭自动刷新,手动控制更新 turt = Turt() is_game_on = True screen.listen() screen.onkey(turt.move_up, "Up") # 简化生成SpawnPoint spawn_points_ycords = [300, 200, 100, 0, -100, -200] spawn_points = [SpawnPoint(y) for y in spawn_points_ycords] cars = [] # 保存所有活跃的汽车实例 frame_count = 0 while is_game_on: frame_count += 1 # 每60帧生成两辆汽车(可调整频率) if frame_count % 60 == 0: # 随机选择两个不同的生成点 spawn_choices = random.sample(spawn_points, 2) for spawn in spawn_choices: new_car = Car(spawn.spawn.ycor()) cars.append(new_car) # 移动所有汽车,并清理已移出屏幕的汽车 for car in cars[:]: car.move() if car.body.xcor() < -700: cars.remove(car) # 检查玩家是否到达顶部(根据你的Turt类调整胜利条件) if turt.ycor() >= 350: is_game_on = False print("你赢了!") screen.update() # 刷新屏幕,显示所有变化 screen.exitonclick()
说明
- 手动刷新屏幕(
screen.tracer(0)+screen.update())能让所有图形操作同步显示,避免阻塞。 - 维护
cars列表可以持续控制每辆汽车的移动,同时清理过期实例节省资源。 - 用
random.sample直接选择两个不同的生成点,替代原有的循环判断,代码更简洁。
内容的提问来源于stack exchange,提问作者firat
相关产品推荐
相关产品推荐

