Python: 猜谜游戏 IndexError: 列表赋值索引超出范围

0 投票
2 回答
863 浏览
提问于 2025-04-16 19:25

我在学习Python,但似乎遇到了一个问题:

我有两个数组,一个是从文件中随机读取的字符串的每个字母,另一个数组是用'_'填充的,代表用户需要找的单词中的每个字母。

不过,我发现我的while循环没有结束,即使找到了单词,它还是一直在运行。

有没有人能帮我找出我的错误?

这是我写的第一段Python代码,我之前是用Java的,所以如果有更好的编程建议和提示,我也非常欢迎 :)

谢谢。

我的代码:

'''
Created on 12-jun.-2011

@author: k3r3nks7
'''
import random


class Hangman(object): 

    def _init_(self):
        self.fileInput()
        self.printStuff()

    def fileInput(self): 
        wordList = open('wordlist')

        woordenArray=[]

        for line in wordList:
            woordenArray.append(line)

        i = random.randrange(0,len(woordenArray))

        self.randomWoord = woordenArray[i]



    def printStuff(self):
        print 'I want to play a game\n\n'
        print 'Hangman spelen ? (y/n)\n'
        stringEval = raw_input()
        self.checkToPlay(stringEval)



    def checkToPlay(self,woord):
        if woord == 'y':
            print '#####################'
            print '#let the game begin!#'
            print '#####################'
            self.iwanttoplayagame()

        elif woord == 'n':
            print 'have a nice day'
            exit()
        else:
            print 'Your answer was not correct, please answer a correct parameter,\n resistance is futile, \n We are Borg sheep and .... \n ... oh look fresh gras \n'
            self.printStuff()

    def iwanttoplayagame(self):
        incorrectGuesses = 0
        self.correctArray = []
        for char in self.randomWoord:
            self.correctArray.append('_')
        test=""

        while(incorrectGuesses <= 6 or self.correctArray != self.randomWoord ):
            print 'u raadde al : '+test.join(self.correctArray)
            print "Geef is een letter \n"
            letterInput = raw_input()
            _c=0


            if letterInput in self.randomWoord: 


                for letter in self.randomWoord:

                    if(letter == letterInput):
                        self.moveChar(letter,_c)
                    _c+=1    
            else:
                incorrectGuesses+=1
                self.display_figure(incorrectGuesses)



    def moveChar(self,letter,c):
        self.correctArray[c] = letter


    def display_figure(self,bad_guesses):
        graphics = [
        """
            +--------+
             |
             |
             |
             |
             |
             |
         ====================
        """,
        """
            +-------
            |      o
            |
            |
            |
            |
        ====================
        """,
        """
            +-------
            |      o
            |   ---+---
            |
            |
            |
        ======================
        """,
        """
            +-------
            |       o
            |    ---+---
            |       |
            |    
            |  
            |   
        =====================
        """,
        """
            +-------
            |  
            |       o
            |    ---+
            |       |
            |      / 
            |     /   
            |
            |
            |
            |
        =====================
        """,
        """
            +-------
            |        o
            |     ---+---
                     |
            |       / 
            |      /   
            |     /     
            |     
        =====================
        """,
          """
            +-------
            |        o
            |     ---+---
                     |
            |       / \
            |      /   \  
            |     /     \    
            |     
        =====================
        """
    ,]

        if(bad_guesses== 7):
            print "you lost the game. The correct answer was : "+self.randomWoord
            print "\n Do you want to play again ?"
            inputS = raw_input()
            self.checkToPlay(inputS)
        print graphics[bad_guesses]

f = Hangman()
f._init_()

2 个回答

1

首先,在fileInput()这个方法里,从文件中读取的单词后面会有一个'\n'(我怀疑这就是你循环不结束的原因),要解决这个问题,你应该这样做:

for line in wordList:
     woordenArray.append(line.strip())

还有,你忘了关闭你的文件'wordlist',我建议使用带有with语句的列表推导来填充wordList,可以这样写:

with open('wordlist') as wordList: 
    woordenArray = [line.strip() for line in wordList]

我觉得这个循环:

_c=0
if letterInput in self.randomWoord: 
    for letter in self.randomWoord:
        if(letter == letterInput):
            self.moveChar(letter,_c) 

可以更好地写成这样:

if letterInput in self.randomWoord: 
    for i, letter in enumerate(self.randomWoord):
        if letter == letterInput:
            self.correctArray[i] = letter

这个部分也:

self.correctArray = []
for char in self.randomWoord:
    self.correctArray.append('_')

可以替换成:

self.correctArray = ['_'] * len(self.randomWoord)

另外,你把python的__init__()写成了_init_(),应该这样做:

class Hangman(object): 

    def __init__(self):
        self.fileInput()
        self.printStuff()

这样你就不需要在脚本的最后加上f._init_()了。

编辑:

还有一点我想补充的是,while循环的条件应该这样写:

while incorrectGuesses <= 6 and self.correctArray != list(self.randomWoord):
    ...

之前我们在比较self.randomWoord(这是一个字符串)和self.correctArray(这是一个列表),而且条件里应该用and而不是or。

希望这些对你有帮助 :)

3

在这一行:

while(incorrectGuesses <= 6 or self.correctArray != self.randomWoord ):

or 应该改成 and。另外,correctArray 是一个列表,而 randomWord 是一个字符串,所以它们永远不会相等。括号也是不必要的。试试这个:

while incorrectGuesses <= 6 and ''.join(self.correctArray) != self.randomWoord :

_init_ 应该写成 __init__,这样你就不需要显式地调用它了。

从单词列表中读取的行会多一个 \n,用 strip() 来去掉它,否则你的 correctArray 会多出一个字符。

for line in wordList:
    woordenArray.append(line.strip())

撰写回答