0

さて、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"
4

2 に答える 2

2

最初に でインデックスの範囲を取得しますがremLetters、文字 ==userGuessの場合は から 1 文字を削除します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
于 2012-11-24T15:43:40.617 に答える
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:]
于 2012-11-24T15:43:51.517 に答える