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

基于Python的Digit Span Test面向对象编程实现问题求助

Digit Span Test 问题修复与OOP重构

针对你遇到的问题,下面是具体修复方案和重构后的面向对象代码:

问题1:正确猜出后新增5个数字而非1个

原代码中a=5是固定值,且randomlist为全局变量,每次循环都会追加5个数字。正确逻辑应为:

  • 初始序列长度设为基础值(比如5)
  • 每次猜对后,序列长度加1,而非固定加5
  • 每次生成新序列时,创建全新列表,不复用全局变量

问题2:逐个打印数组元素

要实现逐个显示数字(每个数字显示指定时长后清屏),步骤如下:

  1. 遍历生成的数字序列
  2. 打印单个数字
  3. 等待设定的时长
  4. 跨平台清屏(兼容Windows和类Unix系统)

问题3:其他未知问题修复

  • 难度选择未生效:原代码误用==比较运算符,改为=赋值运算符
  • 全局变量滥用:用OOP封装所有游戏状态与行为,提升代码可维护性
  • 输入异常处理:添加非数字输入的捕获逻辑,避免程序崩溃
  • 新增分数统计:记录用户正确次数,游戏结束时展示最终成绩

完整OOP实现代码

import time
import random
import os

class DigitSpanTest:
    def __init__(self):
        self.appear_time = 1.0
        self.current_length = 5  # 初始序列长度
        self.score = 0
        self.game_running = False

    def clear_screen(self):
        # 跨平台清屏
        os.system('cls' if os.name == 'nt' else 'clear')

    def show_welcome(self):
        self.clear_screen()
        print("Welcome to the Digit Span Test.")
        time.sleep(1)
        self.clear_screen()
        print("We hope you enjoy.")
        time.sleep(1)
        self.clear_screen()

    def select_difficulty(self):
        while True:
            try:
                gamediff = int(input("Input Difficulty (1 - 4):  "))
                if gamediff == 1:
                    self.appear_time = 2.0
                    print("Difficulty [ EASY ] selected.")
                    break
                elif gamediff == 2:
                    self.appear_time = 1.6
                    print("Difficulty [ MEDIUM ] selected.")
                    break
                elif gamediff == 3:
                    self.appear_time = 1.2
                    print("Difficulty [ HARD ] selected.")
                    break
                elif gamediff == 4:
                    self.appear_time = 0.7
                    print("Difficulty [ VIRTUALLY IMPOSSIBLE ] selected.")
                    break
                else:
                    print("Invalid Difficulty selected. Please enter 1-4.")
            except ValueError:
                print("Invalid input! Please enter a number between 1-4.")
        time.sleep(1)
        self.clear_screen()

    def generate_sequence(self):
        # 生成指定长度的随机数字序列(1-9)
        return [random.randint(1, 9) for _ in range(self.current_length)]

    def display_sequence(self, sequence):
        # 逐个显示序列中的数字
        for num in sequence:
            self.clear_screen()
            print(num)
            time.sleep(self.appear_time)
        self.clear_screen()

    def get_user_input(self):
        # 获取用户输入的序列,处理异常
        user_sequence = []
        print(f"Enter the {self.current_length} digits, one at a time:")
        for _ in range(self.current_length):
            while True:
                try:
                    num = int(input("> "))
                    if 1 <= num <=9:
                        user_sequence.append(num)
                        break
                    else:
                        print("Please enter a single digit between 1-9.")
                except ValueError:
                    print("Invalid input! Please enter a number.")
        return user_sequence

    def check_answer(self, correct_sequence, user_sequence):
        if user_sequence == correct_sequence:
            print("Nice! Correct answer.")
            self.score += 1
            self.current_length += 1  # 长度加1
            time.sleep(1)
            return True
        else:
            print(f"Uh oh! Wrong answer. Correct sequence was: {correct_sequence}")
            print(f"Your final score: {self.score}")
            return False

    def run(self):
        self.show_welcome()
        self.select_difficulty()
        self.game_running = True

        while self.game_running:
            sequence = self.generate_sequence()
            self.display_sequence(sequence)
            user_input = self.get_user_input()
            if not self.check_answer(sequence, user_input):
                self.game_running = False

if __name__ == "__main__":
    game = DigitSpanTest()
    game.run()

关键修改说明

  1. OOP封装:所有游戏状态(显示时长、序列长度、分数)和行为(清屏、生成序列、显示序列)都封装在DigitSpanTest类中,避免全局变量混乱
  2. 序列长度递增:每次猜对后current_length +=1,符合Digit Span Test的标准逻辑
  3. 逐个显示数字:display_sequence方法逐个打印数字,每个显示后清屏并等待指定时长
  4. 难度生效:用=赋值appear_time,修复原代码的运算符错误
  5. 输入异常处理:捕获ValueError,处理非数字输入,同时限制输入为1-9的数字
  6. 跨平台清屏:判断系统类型选择清屏命令,兼容Windows和Linux/macOS
  7. 分数统计:记录用户正确次数,游戏结束时显示最终成绩

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:55:11