如何在Turtle过马路游戏中避免重复选择固定车道列表?
解决车辆重复生成在同一车道的问题
核心思路是跟踪当前被占用的车道,每次生成车辆时优先从空闲车道里选,等车辆开出屏幕后再释放对应的车道,这样就能大幅减少同车道重叠的情况。以下是基于你现有代码的修改方案,都是新手能看懂的简单逻辑:
- 在
CarManager的初始化方法里,添加两个列表用来记录已被占用的车道:
def __init__(self): self.bottom_cars = [] self.top_cars = [] self.occupied_bottom_lanes = [] # 记录底部车道中已有车的位置 self.occupied_top_lanes = [] # 记录顶部车道中已有车的位置
- 修改
create_car_bottom方法,优先从空闲车道选位置:
def create_car_bottom(self): random_chance = random.randint(1, 20) if random_chance == 1: new_car = Turtle('square') new_car.shapesize(stretch_wid=1, stretch_len=2) new_car.penup() new_car.color(random.choice(COLORS)) # 筛选出当前没有车的底部车道 available_lanes = [lane for lane in CAR_LANES_BOTTOM if lane not in self.occupied_bottom_lanes] # 有空闲车道就选空闲的,全占满了再随机选(防止游戏卡住) if available_lanes: random_lane = random.choice(available_lanes) self.occupied_bottom_lanes.append(random_lane) # 标记这个车道已被占用 else: random_lane = random.choice(CAR_LANES_BOTTOM) new_car.goto(300, random_lane) new_car.lane = random_lane # 给车绑定它所在的车道,后面释放用 self.bottom_cars.append(new_car)
- 同理修改
create_car_top方法:
def create_car_top(self): random_chance = random.randint(1, 20) if random_chance == 1: new_car = Turtle('square') new_car.shapesize(stretch_wid=1, stretch_len=2) new_car.penup() new_car.color(random.choice(COLORS)) # 筛选出当前没有车的顶部车道 available_lanes = [lane for lane in CAR_LANES_TOP if lane not in self.occupied_top_lanes] if available_lanes: random_lane = random.choice(available_lanes) self.occupied_top_lanes.append(random_lane) else: random_lane = random.choice(CAR_LANES_TOP) new_car.goto(-300, random_lane) new_car.lane = random_lane self.top_cars.append(new_car)
- 修改车辆移动方法,车辆开出屏幕后释放对应的车道:
def move_left(self): # 倒着遍历列表,避免删除元素时打乱索引 for i in range(len(self.bottom_cars)-1, -1, -1): car = self.bottom_cars[i] car.backward(random.randint(3, 6)) # 车辆开出左侧屏幕后(x坐标小于-320,可根据你的窗口大小调整) if car.xcor() < -320: car.hideturtle() # 隐藏海龟 self.bottom_cars.pop(i) # 从列表里删掉这辆车 # 释放它占用的车道 if car.lane in self.occupied_bottom_lanes: self.occupied_bottom_lanes.remove(car.lane) def move_right(self): for i in range(len(self.top_cars)-1, -1, -1): car = self.top_cars[i] car.forward(random.randint(3, 6)) # 车辆开出右侧屏幕后 if car.xcor() > 320: car.hideturtle() self.top_cars.pop(i) # 释放车道 if car.lane in self.occupied_top_lanes: self.occupied_top_lanes.remove(car.lane)
这样修改后,车辆会尽量避开已有车辆的车道生成,同时不会因为车道全被占用而卡住,完全适配你现有的游戏逻辑,新手也能轻松理解和替换代码。
内容的提问来源于stack exchange,提问作者Hexe Decima
相关产品推荐
相关产品推荐

