好的,我正在做一个家庭作业,在python中构建一个刽子手游戏。到目前为止,它一直很顺利,直到我得到这个恼人的错误:
Traceback (most recent call last):
File "/Users/Toly/Downloads/ps2 6/ps2_hangman.py", line 82, in <module>
if (remLetters[i] == userGuess):
IndexError: string index out of range
这是我的代码:
# 6.00 Problem Set 3
#
# Hangman
#
# -----------------------------------
# Helper code
# (you don't need to understand this helper code)
import random
import string
import time
WORDLIST_FILENAME = "words.txt"
def load_words():
print "Loading word list from file..."
# inFile: file
inFile = open(WORDLIST_FILENAME, 'r', 0)
# line: string
line = inFile.readline()
# wordlist: list of strings
wordlist = string.split(line)
print " ", len(wordlist), "words loaded."
return wordlist
def choose_word(wordlist):
"""
wordlist (list): list of words (strings)
Returns a word from wordlist at random
"""
return random.choice(wordlist)
wordlist = load_words()
blankword="_ "
word=random.choice (wordlist)
remLetters = string.lowercase
remGuesses = 8 #starting number of guesses
remWord=len(word)
#makes a blank with the length of the word
print "Welcome to Hangman"
time.sleep(1)
print
print "Your word is", remWord,"letters long."
print
time.sleep (1)
while (remGuesses != 0 or blankword != word):
remBlankword=len(blankword)
remWordDoubled=remWord*2
while (remWordDoubled!=len(blankword)):
blankword=blankword + "_ "
print blankword
print
print "You have",remGuesses," guesses left."
print
time.sleep(1)
userGuess= str(raw_input ("Guess a letter:"))
print
if (userGuess in word):
print "Excellent guess!"
else:
print "Bad Guess"
remGuesses=remGuesses-1
for i in range (1, len(remLetters)):
if (remLetters[i] == userGuess):
remLetters = remLetters[0:i] + remLetters[i+1:len(remLetters)]
print remLetters
if (remGuesses == 0):
print
print "Sorry, you died! Ha, sucks!"
print
print
time.sleep (1)
print "End of Game"
if (blankword == word):
print
print "Congradulations! You won!"
print
time.sleep(1)
print
print
print
print "End of Game"
答案 0 :(得分:2)
您首先获得remLetters
中的索引范围,但如果字母== userGuess
,则会从remLetters
中删除一个字母。这意味着现在remLetters
中最大的索引比以前少了1个。当您尝试索引范围返回的最高数字时,您现在已经超出界限,因此您获得了IndexError
。
这样的事情可能就是你正在寻找的东西:
remLetters = ''.join(x for x in remLetters if x != userGuess)
或者:
try:
idx = remLetters.index(userGuess)
remLetters = remLetters[:idx] + remLetters[idx+1:]
except ValueError:
pass
答案 1 :(得分:1)
您正在更改循环中的字符串remLetters
,使其更短。所以你最终会得到一个超出remLetters
:
for i in range (1, len(remLetters)):
if (remLetters[i] == userGuess):
remLetters = remLetters[0:i] + remLetters[i+1:len(remLetters)]
使用.index()
来查找匹配项:
while userGuess in remLetters:
i = remLetters.index(userGuess)
remLetters = remLeters[:i] + remLetters[i+1:]