如何在Mastermind游戏代码中统计玩家尝试次数?求优化方案
解决Mastermind游戏尝试次数统计的问题
伙计,你这问题大概率是变量作用域搞的鬼——要么是attempts被局部作用域覆盖了,要么每次调用函数时都被重新初始化了,所以才一直卡在0。下面给你两种实现方式,优先推荐面向对象的封装方案,这也是游戏类程序更专业的写法:
方案1:面向对象封装(最优解)
把游戏的核心状态(秘密代码、尝试次数、玩家猜测等)封装到一个类里,所有方法都能直接访问和修改attempts,逻辑清晰还能避免全局变量的混乱,后续扩展功能也更方便:
import random class MastermindGame: def __init__(self): self.secret_code = self.generate_secret_code() self.attempts = 0 # 初始化尝试次数 def generate_secret_code(self): # 生成4个1-6的随机数作为秘密代码,可根据需求调整 return [random.randint(1,6) for _ in range(4)] def get_guess_from_user(self): # 获取用户输入的猜测,替换成你原有逻辑即可 while True: guess = input("请输入4位1-6的数字作为猜测:") if len(guess) == 4 and guess.isdigit() and all(1 <= int(g) <=6 for g in guess): return [int(g) for g in guess] print("输入无效,请输入4个1-6的数字!") def display_feedback(self, player_guess): self.attempts += 1 # 每次调用反馈函数就递增尝试次数 # 计算反馈:位置正确的数量 + 数字正确但位置错误的数量 correct_position = sum(1 for s, g in zip(self.secret_code, player_guess) if s == g) correct_number = len(set(self.secret_code) & set(player_guess)) - correct_position print(f"第{self.attempts}次尝试:位置正确{correct_position}个,数字正确但位置错误{correct_number}个") def play(self): print("欢迎来到Mastermind猜数字游戏!") while True: guess = self.get_guess_from_user() self.display_feedback(guess) if guess == self.secret_code: print(f"恭喜你猜对了!总共用了{self.attempts}次尝试!") break # 启动游戏 if __name__ == "__main__": game = MastermindGame() game.play()
方案2:全局变量快速修复(不推荐长期使用)
如果你不想重构代码,也可以用全局变量的方式快速解决,但这种方式会让代码逻辑耦合度变高,后续维护麻烦:
import random player_guess = [] attempts = 0 # 全局变量存储尝试次数 def getGuessFromUser(guess): global player_guess player_guess.clear() for g in guess: player_guess.append(g) return player_guess def display_feedback(): global attempts # 声明使用全局的attempts变量 attempts += 1 # 这里写你的原有反馈逻辑 print(f"当前尝试次数:{attempts}") # 游戏主逻辑示例 def play_game(): # 生成秘密代码,替换成你的原有逻辑 secret_code = ["1","2","3","4"] while True: guess = input("请输入你的猜测:") getGuessFromUser(guess) display_feedback() if player_guess == secret_code: print(f"你赢了!总共用了{attempts}次尝试!") break play_game()
为什么你的attempts始终为0?
大概率是这两个原因之一:
attempts是在函数内部定义的,每次调用函数都会重新初始化为0;- 没有用
global关键字声明(如果是全局变量的话),导致函数里创建了一个局部的attempts变量,和全局的不是同一个。
内容的提问来源于stack exchange,提问作者Adrian Fernandez
相关产品推荐
相关产品推荐

