基于Python的Digit Span Test面向对象编程实现问题求助
Digit Span Test 问题修复与OOP重构
针对你遇到的问题,下面是具体修复方案和重构后的面向对象代码:
问题1:正确猜出后新增5个数字而非1个
原代码中a=5是固定值,且randomlist为全局变量,每次循环都会追加5个数字。正确逻辑应为:
- 初始序列长度设为基础值(比如5)
- 每次猜对后,序列长度加1,而非固定加5
- 每次生成新序列时,创建全新列表,不复用全局变量
问题2:逐个打印数组元素
要实现逐个显示数字(每个数字显示指定时长后清屏),步骤如下:
- 遍历生成的数字序列
- 打印单个数字
- 等待设定的时长
- 跨平台清屏(兼容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()
关键修改说明
- OOP封装:所有游戏状态(显示时长、序列长度、分数)和行为(清屏、生成序列、显示序列)都封装在
DigitSpanTest类中,避免全局变量混乱 - 序列长度递增:每次猜对后
current_length +=1,符合Digit Span Test的标准逻辑 - 逐个显示数字:
display_sequence方法逐个打印数字,每个显示后清屏并等待指定时长 - 难度生效:用
=赋值appear_time,修复原代码的运算符错误 - 输入异常处理:捕获
ValueError,处理非数字输入,同时限制输入为1-9的数字 - 跨平台清屏:判断系统类型选择清屏命令,兼容Windows和Linux/macOS
- 分数统计:记录用户正确次数,游戏结束时显示最终成绩
内容的提问来源于stack exchange,提问作者Lester Bemberton
相关产品推荐
相关产品推荐

