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

Arcade框架游戏内屏幕分数不更新问题排查

Arcade赛车游戏「Гонки」分数不更新问题修复

你开发的赛车游戏中,设定障碍物Wall移动至y坐标0以下时分数应递增,但实际分数始终显示0,核心问题出在代码的重复定义方法与分数更新逻辑未执行上。

问题根源

  1. 重复覆盖update方法:在MyGame类中你定义了两个同名的update方法,Python会以后定义的方法覆盖前一个,导致第一个update里self.score = self.wall.update()这行关键的分数更新代码完全无法运行,self.score一直停留在初始化的0值。
  2. 分数维护逻辑不合理:将分数放在Wall类实例中维护不符合游戏逻辑,全局分数应该由主游戏类MyGame统一管理。

修复方案

  1. 合并重复的update方法,将分数更新与碰撞检测逻辑整合到同一个方法中。
  2. 调整Wall类的update逻辑,让其返回布尔值标识是否需要加分,由主游戏类维护全局分数。

修复后的完整代码

import random
import arcade


SCREEN_WIDTH = 960
SCREEN_HEIGHT = 720
SCREEN_TITLE = "Гонки"
CAR_ANGLE = 20
CAR_SPEED = 5
WALL_SPEED = 5


class Car(arcade.Sprite):
    def update(self):
        self.center_x += self.change_x


class Wall(arcade.Sprite):
    def update(self):
        self.center_y -= self.change_y
        # 障碍物移出屏幕下方时重置位置,返回True表示需要加分
        if self.top < 0:
            self.bottom = SCREEN_HEIGHT + random.randint(0, SCREEN_HEIGHT)
            self.center_x = random.randint(168, SCREEN_WIDTH - 168)
            return True
        return False


class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)
        self.bg = arcade.load_texture('bg.png')
        self.car = Car("yellow_car.png", 0.8)
        self.car.center_x = SCREEN_WIDTH / 2
        self.car.center_y = 100
        self.score = 0  # 主游戏类维护全局分数
        self.wall = Wall('wall.png', 0.8)
        self.wall.center_y = SCREEN_HEIGHT
        self.wall.center_x = random.randint(168, SCREEN_WIDTH - 168)
        self.wall.change_y = WALL_SPEED
        self.game = True

    def update(self, delta_time: float):
        if self.game:
            self.car.update()
            # 根据Wall的update返回值判断是否加分
            if self.wall.update():
                self.score += 1
            # 碰撞检测逻辑
            if arcade.check_for_collision(self.car, self.wall):
                self.game = False

    def on_draw(self):
        self.clear()
        arcade.draw_texture_rectangle(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, SCREEN_WIDTH, SCREEN_HEIGHT, self.bg)
        self.car.draw()
        self.wall.draw()
        if self.game:
            arcade.draw_text(f"你的分数: {self.score}", 10, 10, arcade.color.AFRICAN_VIOLET, font_size=26)
        else:
            arcade.draw_text("碰撞!", SCREEN_WIDTH / 2 - 150, SCREEN_HEIGHT / 2, arcade.color.CYAN, font_size=60)

        if self.score == 10:
            arcade.draw_text("胜利!", SCREEN_WIDTH / 2 - 150, SCREEN_HEIGHT / 2, arcade.color.GOLD, font_size=60)

    def on_key_press(self, symbol: int, modifiers: int):
        if self.game:
            if symbol == arcade.key.LEFT:
                self.car.change_x = -CAR_SPEED
                self.car.angle = CAR_ANGLE
            if symbol == arcade.key.RIGHT:
                self.car.change_x = CAR_SPEED
                self.car.angle = -CAR_ANGLE

    def on_key_release(self, symbol: int, modifiers: int):
        if symbol == arcade.key.LEFT:
            self.car.change_x = 0
            self.car.angle = 0
        if symbol == arcade.key.RIGHT:
            self.car.change_x = 0
            self.car.angle = 0


window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
arcade.run()

关键修改说明

  • 删除了MyGame类中重复的update方法,将分数更新与碰撞检测逻辑合并,确保分数更新代码能被执行。
  • 重构Wall类的update方法,不再维护自身的score属性,改为返回布尔值通知主游戏类是否需要加分,逻辑更清晰。
  • 调整了分数显示文本为中文,适配游戏的俄语风格(如需英文可改回原文本)。

内容的提问来源于stack exchange,提问作者MaximeDaydream

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:52:16