Crossy Game中Car实例生成位置异常(超出屏幕且位于玩家下方)的修复请求
Crossy Game中Car实例生成位置异常(超出屏幕且位于玩家下方)的修复请求
我正在跟着100 Days of Code做一款Crossy风格的游戏,但因为没有推荐的PyCharm IDE,所以完全从零开始写代码。我用randrange来生成随机y值(因为需要用到负数),但遇到了问题:运行程序时看不到生成的汽车,切换到全屏后才发现汽车都出现在玩家的下方区域,超出了可见屏幕范围。我尝试过反转randrange的正负参数,也核对过turtle的坐标系统,但问题依然存在。
我的代码如下:
main.py
from turtle import Screen from time import sleep from player import Player from car import Car s = Screen() s.setup(600, 600) s.bgcolor('black') s.tracer(0) player = Player() car = Car() game_is_on = True while game_is_on: s.update() sleep(0.1) car.move()
player.py
from turtle import Turtle as t finish = 580 start = -580 class Player(t): def __init__(self): super().__init__('square') self.penup() self.color('white') self.goto(0, -280) def left(self): self.forward(20) def right(self): self.backward(20) def up(self): self.setheading(90) self.forward(20) self.setheading(0)
car.py
from turtle import Turtle as t from random import randrange class Car(t): def __init__(self): super().__init__() self.shape('square') self.color('white') yval = randrange(-570, 570) self.penup() self.shapesize(stretch_len= 2) self.setx(560) self.sety(yval) def move(self): self.forward(-20)
问题分析与修复方案
1. 核心问题:汽车生成的y值范围超出屏幕边界
你的屏幕设置是600x600,在turtle的坐标系统中,这个屏幕的y轴范围是**-300到300**(中心为(0,0),上下各300像素)。但你用了randrange(-570, 570),这个范围远大于屏幕的实际高度,导致大部分汽车生成在屏幕可视区域之外,尤其是低于-300的位置(玩家在y=-280,所以这些车会在玩家更下方,完全看不到)。
2. 具体修复步骤:
- 修正汽车的y值生成范围:把
randrange(-570, 570)改成符合屏幕范围的数值,同时要避开玩家初始位置的下方区域,比如设置为randrange(-250, 250),这样汽车会生成在玩家活动的垂直区域内,不会超出屏幕。 - 修正Player类中的finish/start常量:你设置的
finish=580和start=-580完全不符合600x600屏幕的实际范围,应该改成finish=280(避免汽车/玩家碰到屏幕顶部边缘)和start=-280(和玩家初始位置一致)。 - 修复Player的左右移动逻辑:当前的
left()和right()方法逻辑是反的——turtle默认朝向是右(heading=0),forward(20)是向右移动,backward(20)是向左移动,这和方法名不符,建议改成更直观的写法:def left(self): new_x = self.xcor() - 20 # 限制玩家在屏幕左右边界内 if new_x > -280: self.goto(new_x, self.ycor()) def right(self): new_x = self.xcor() + 20 if new_x < 280: self.goto(new_x, self.ycor()) - 添加多汽车生成逻辑:当前你只生成了一辆Car实例,Crossy游戏需要不断生成新的汽车,建议创建一个
CarManager类来管理多个汽车对象,比如每隔几帧生成一辆新汽车。
修改后的car.py示例:
from turtle import Turtle as t from random import randrange class Car(t): def __init__(self): super().__init__() self.shape('square') self.color('white') # 修正y值范围,限制在屏幕可视区域内 yval = randrange(-250, 250) self.penup() self.shapesize(stretch_len=2) self.setx(280) # 改成屏幕右侧边缘内的位置(600宽度,x最大280) self.sety(yval) def move(self): self.forward(-20)
补充建议:
记得给玩家添加键盘监听,比如:
# 在main.py中添加 s.listen() s.onkey(player.up, "Up") s.onkey(player.left, "Left") s.onkey(player.right, "Right")
这样玩家就能正常移动,同时汽车也会出现在可视区域内了。
备注:内容来源于stack exchange,提问作者ThatOneKid
相关产品推荐
相关产品推荐

