Python: 猜谜游戏 IndexError: 列表赋值索引超出范围
我在学习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())