Python Hangman猜词游戏重复字母仅识别首个的问题修复
问题原因
你遇到的重复字母无法全部识别的核心原因,是猜对字母时的赋值逻辑用了列表的index()方法:这个方法只会返回目标值第一次出现的索引,所以碰到单词里有重复字母时,永远只会修改第一个匹配位置的占位符,后续相同字母的位置不会被更新。
除此之外你的代码还有几个影响正常运行的隐藏bug:
- 随机取词存在索引越界风险:
random.randint(0, len(list_words))的上限取值超过了列表最大索引(Python列表索引从0开始,最后一个元素的索引是len(list_words)-1),运行时会偶发抛出索引错误 - 判断顺序不合理:当前逻辑先判断字母是否在答案中,再判断是否已经猜过,会导致已经猜对的字母重复输入时,不会触发"已猜过"的提示
- 剩余次数打印错误:重复猜字母的分支里,打印剩余次数误用了固定的
tries_left变量,不会随剩余机会减少更新数值 - 胜负判断时机不对:获胜判断放在用户输入之后、字母处理之前,用户猜对最后一个字母时不会立刻触发胜利提示,要等下一轮输入才会判定获胜;失败判断放在循环内部,永远不会被触发——因为外层循环条件是
chances != 0,机会耗尽时会直接退出循环,走不到内部的失败判断分支。
修复方法
核心修改点是替换单索引赋值的逻辑,遍历单词所有位置,把所有和输入字母匹配的位置全部替换成正确字母,同时修复上述提到的其他bug。
修复后的完整可运行代码:
import random def hangman_play(): list_words = ['computer', 'television', 'laptop', 'phone', 'dracula'] # 直接用random.choice取随机词,避免索引越界 random_word = list(random.choice(list_words)) user_guessed_choices = ['-' for _ in range(len(random_word))] chances = 8 while chances > 0: # 每次循环开头先判断是否已经获胜 if user_guessed_choices == random_word: print('You win!') break user = input(f'Guess the word! Choose a letter, you have {chances} tries ').lower() # 先判断是否已经猜过该字母 if user in user_guessed_choices: print('Hey! You used that letter already!') chances -= 1 print(f'You have {chances} tries left') elif user in random_word: # 遍历所有位置,替换所有匹配的字母,解决重复字母识别问题 for idx, char in enumerate(random_word): if char == user: user_guessed_choices[idx] = user print(f'{user} is correct! Added to the word') print(''.join(user_guessed_choices)) else: print('Thats incorrect!') chances -= 1 print(f'You have {chances} tries left') # 循环结束后如果还没猜对,就是机会耗尽失败 else: print('You ran out of chances! You lose!') print(f'The correct word was {"".join(random_word)}') hangman_play()
关键修改说明
解决重复字母问题的核心代码段是遍历匹配的逻辑:
for idx, char in enumerate(random_word): if char == user: user_guessed_choices[idx] = user
enumerate()会同时返回每个字符的索引和字符本身,循环检查每一个位置的字符,如果和用户输入的字母一致,就把对应位置的占位符'-'替换成正确字母,不管这个字母在单词里出现几次,所有匹配位置都会被正确填充。
内容的提问来源于stack exchange,提问作者Jos
相关产品推荐
相关产品推荐

