如何为Python编写的Hangman猜词游戏添加再玩一次功能
Hangman游戏重玩功能实现方案
核心问题
你现有代码的问题有两点:
- 仅在选择重玩时重置了
word变量,mistakes错误计数、letters_guessed已猜中字母、wrong_letters猜错字母等核心游戏状态没有重置,就算重新选了单词也会继承上一局的状态 - 没有将完整游戏流程包裹在循环内,即便确认重玩也不会重新走游戏逻辑
修改步骤
- 在外层添加全局控制循环,用来控制是否开启新对局
- 将所有游戏状态初始化代码移到外层循环内部,每次重玩自动重置所有参数
- 在胜负分支后统一处理重玩询问,根据玩家输入调整全局循环的状态即可
完整修改后代码
# 导入词库 import random from wordbankcool import wordbank # hangman 图形 hangman_graphics = ['_', '__', '__\n |', '__\n |\n O', '__\n |\n O\n |', '__\n |\n O\n/|', '__\n |\n O\n/|\\ ', '__\n |\n O\n/|\\ \n/', '__\n |\n O\n/|\\ \n/ \\ ' ] mistakes_allowed = len(hangman_graphics) # 全局游戏控制变量 playing = True while playing: # 每局游戏启动前初始化所有状态 mistakes = 0 letters_guessed = [] word = random.choice(wordbank) letters_word = list(word) wrong_letters = [] print() print('单词长度为 {} 个字母'.format(len(letters_word))) # 本局游戏主循环,运行到错误次数达到上限或猜中单词为止 while mistakes < mistakes_allowed: print() print('错误猜测的字母:', end='') for letter in wrong_letters: print('{}, '.format(letter), end='') print() print('剩余猜测次数:{}'.format(mistakes_allowed - mistakes)) letter_user = input('猜一个字母:').lower() # 检查字母是否已经猜过 while letter_user in letters_guessed or letter_user in wrong_letters: print() print('你已经猜过这个字母了,换一个试试') letter_user = input('猜一个字母:').lower() # 判断猜测是否正确 if letter_user not in letters_word: mistakes += 1 wrong_letters.append(letter_user) else: letters_guessed.append(letter_user) print() print('当前单词:', end='') # 显示单词猜中状态,未猜中用下划线代替 for letter in letters_word: if letter in letters_guessed: print(letter + ' ', end='') else: print('_ ', end='') print() # 显示hangman进度 if mistakes: print(hangman_graphics[mistakes - 1]) print() print('-------------------------------------------') # 获胜分支 if len(letters_guessed) == len(set(letters_word)): print() print(f'你赢了!正确单词是 {word}!') print() break # 失败分支 if mistakes == mistakes_allowed: print() print('很遗憾,下次好运!') print() print(f'正确单词是 {word}。') print() # 重玩询问 playagain = input('要再玩一次吗?(Y/N) ').upper() if playagain != 'Y': playing = False
额外优化说明
- 修复了原代码中单词包含重复字母时无法正确判定获胜的问题,将获胜判断的条件改为对比已猜中字母数和单词去重后的字母总数
- 修正了重复字母输入时未自动转小写的问题,避免大小写不同判定为不同字母的bug
内容的提问来源于stack exchange,提问作者Pranav Borse
相关产品推荐
相关产品推荐

