具有列表的For循环中的Hangman Python游戏索引错误

时间:2012-11-24 15:41:27

标签: python string list

好的,我正在做一个家庭作业,在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"

2 个答案:

答案 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:]