2011-06-12 77 views
0

我在看看蟒蛇,但我似乎已經遇到了一個問題:的Python:Hangmangame IndexError:列表分配索引超出範圍

我有兩個數組,一個是字符串的每一封信我隨機得到從一個文件和另一個用'_'填充的單詞中的每個字母,用戶需要找到。

但是,似乎我的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_() 

回答

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()) 
+0

y這解決了一切:D – 2011-06-12 19:30:28

+0

我看到你在我之前得到這個,+1 :) – mouad 2011-06-12 19:36:41

1

首先在的FileInput()方法從文件中讀取的話會在結束了(我懷疑這就是爲什麼你的循環還沒有結束「\ n」 )來解決這個你應該做的:

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

你忘了關閉文件「詞表」,我建議使用理解與with statement列表填充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) 

而且你還以書面它拼錯了蟒蛇__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一個字符串,它是一個列表,也應該是,而不是在條件。

希望這是有幫助:)

+0

我剛剛學會噸,謝謝:d, 但會: 指數= self.randomWoord.index(letterInput) self.correctArray [指數] =信 也時有超過工作一個字母是一樣的?如果你有卡通,你說o,它會顯示____o_n或____oo_? – 2011-06-12 19:06:40

+0

@Lucas:很高興這是有益的,並與您的遊戲祝你好運:) – mouad 2011-06-12 19:07:59

+0

@Lucas:嗯好問題,不,它不會工作我沒有想到我的壞,我會編輯我的答案。 – mouad 2011-06-12 19:12:06

相關問題