刽子手游戏开发:如何根据用户输入移除未猜字母集中的字符
修复Hangman游戏的可用字母获取函数
你的代码存在两个关键问题,导致无法正确返回未被猜测的字母:
- 循环提前终止:函数在
for ch in ALL_LETTERS的第一次迭代就执行了return,不管后续字母是否被猜测,逻辑完全错误。 - 字符替换方式错误:
ALL_LETTERS.replace(letters_guessed, '')是尝试替换整个letters_guessed子串,而不是逐个移除每个已猜测的字母。
正确实现代码
def get_available_letters(letters_guessed): """ Returns a string of letters that have not yet been guessed. :param letters_guessed: letters that have been guessed so far by the player :type letters_guessed: str :return: letters that have not been guessed :rtype: str """ ALL_LETTERS = 'abcdefghijklmnopqrstuvwxyz' letters_guessed = letters_guessed.lower() available_letters = [] for ch in ALL_LETTERS: if ch not in letters_guessed: available_letters.append(ch) return ''.join(available_letters)
代码说明
- 遍历全部26个小写字母,检查每个字母是否不在已猜测的字母集合中
- 将未被猜测的字母存入列表,最后用
join方法拼接成字符串返回 - 统一将用户输入的字母转为小写,避免大小写不匹配的判断错误
简化实现(可选)
用生成器表达式结合集合可以提升判断效率,代码更简洁:
def get_available_letters(letters_guessed): """ Returns a string of letters that have not yet been guessed. :param letters_guessed: letters that have been guessed so far by the player :type letters_guessed: str :return: letters that have not been guessed :rtype: str """ ALL_LETTERS = 'abcdefghijklmnopqrstuvwxyz' guessed_set = set(letters_guessed.lower()) return ''.join(ch for ch in ALL_LETTERS if ch not in guessed_set)
内容的提问来源于stack exchange,提问作者Learning_How_To_Code
相关产品推荐
相关产品推荐

