You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:09:29