我试图检查给定单词中字母重复的程序,但是,当该单词具有相同字母的倍数时,例如' hello'有多个' l,程序打印一个错误,说明字符串索引超出范围,我很好奇为什么会这样。 我看过其他线程,但我仍然很好奇为什么会这样。 底部for循环是问题所在的位置。
right =""
guess=""
attempts = 6
tries = 0
print("Hangman: guess letters until you can guess the word or phrase.")
print("In this game you get six tries.")
right_str = str(input("\nEnter your word: "))
#checks to see if user input is all letters or if there are none letters in the string
while right_str.isalpha()==False:
print("Error, only letters are accepted as an input")
right_str = str(input("Enter your word: "))
#displays the proper amount of unknown spaces
for i in range(0, len(right_str)):
right += "-"
print("current: " + right)
print("0 guesses so far out of 6: " + guess)
for i in range(0, 6):
guessed = str(input("Letter guessed: "))
if guessed.lower() in right_str.lower():
for i in range(0, len(right_str)):
if right_str[i] in guessed:
right = right[:i] + guessed[i] + right[i + 1:]
print(right)
答案 0 :(得分:1)
重新编写代码段:
if guessed.lower() in right_str.lower():
for i in range(0, len(right_str)):
if right_str[i] in guessed:
right = right[:i] + guessed[i] + right[i + 1:]
print(right)
如果guessed
是一个字母,那么当您使用guessed[i]
时,您期望在循环中发生什么?最重要的是,您应该单独使用guessed
,而不是尝试将其编入索引。
顺便说一句,虽然你在输入中处理不同情况的尝试是值得称赞的,但你在上面的第三行至少留下了一个小洞(不是guessed.lower()
})。
您可能会发现最好将所有内容转换为输入的较低(或较高)大小写,并将其保持一致。这样,比较将自动正确。
最后一点,您输出更新的print
字符串的right
语句在循环中发生,意味着像hello
或{对于某些猜测,{1}}将产生大量输出。
如果您想在添加当前字母的所有之后打印出新结果,只需将Mississippi
移动到循环外部,例如(添加)上一节中建议的更改):
print
当然,几乎始终采用更多Pythonic方式来实现这一目标:
right_str = str(input("\nEnter your word: ")).lower()
:
guessed = str(input("Letter guessed: ")).lower()
:
if guessed in right_str:
for i in range(0, len(right_str)):
if right_str[i] in guessed:
right = right[:i] + guessed + right[i + 1:]
print(right)
我会把它作为练习让读者弄清楚它是如何运作的。一旦你理解了这一点,你可能会认为自己是一个真正的Pythonista: - )
答案 1 :(得分:0)
我没有足够的代表发表评论。 以下是解决此问题的方法: 减少问题的大小。我看到了很多代码而不是一个问题。您需要先了解问题。复制粘贴到新窗口缩小,直到您可以使用尽可能少的代码行重现错误。如果没有解决问题,请阅读每个对象的参考资料和方法。
答案 2 :(得分:-1)
我认为你的问题在这里:对[i + 1:] 如果您在最后一个元素中,它将使索引超出范围错误。