2016-08-02 70 views
0

我創建了一個有一個bug的Hang子手遊戲:如果您猜兩次相同的字母,它會中斷。我已經創建了每個字母表的字母列表,當玩家猜測該字母時,它將從列表中移除,顯示可供猜測的剩餘字符。這是通過.remove方法完成的,如果角色已經從先前的猜測中移除,該方法將會中斷。正在掃描一個列表 - IndexError:列表索引超出範圍

我試圖將此方法嵌套在for循環中,該循環將掃描字母表列表並檢查用戶對列表中匹配項的猜測並將其刪除。如果它已經被猜到了,那麼什麼都不會發生。我收到的錯誤是一個索引錯誤,推測是猜測的長度。我的疑惑來自事實,即當掃描hang子手字以匹配玩家的猜測時,我可以直接在下面完成這個完全相同的任務。請參閱下面的刪節代碼:

# Play begins and player guesses a letter 
player_word = ['_ '] * len(cpu_word) 
player_word2 = ['_'] * len(cpu_word) 
alphabet = ['a','b',etc.] 
print 'You have 10 guesses left' 

# Determines if the guess is correct 
for count in range(10)[::-1]: 
    guess = raw_input(str('Guess a letter: ')) 
    # This is the previous method that creates a bug:/ 
    # alphabet.remove(guess) 
    for e in xrange(len(alphabet)): 
     if alphabet[e] == guess: 
      alphabet.remove(guess) 
    for i in xrange(len(cpu_word)): 
     if cpu_word[i] == guess: 
      player_word [i] = cpu_word [i] 
      print 'Correct!' 

我有兩個問題。首先是有人可以向我解釋這個錯誤,特別是爲什麼它可以掃描hang子手字,但不適用於掃描列表。

其次,任何人都可以提供這個問題的解決方案。

我是新來編碼,所以任何信息非常感謝!

感謝

+0

感謝蒙克豪森,這是我尋找的簡單解決方案! – Chris

回答

0

你的問題是,你從數組中刪除項目後,現在少了一個項目,這意味着你不能去到陣列的前結束。如果您的字母數組長度爲26,並且您刪除了一個字母,則無法再訪問第26個元素,因爲該數組現在只有25個元素。經過猜得不錯,你可以只打破,就像這樣:

for e in xrange(len(alphabet)): 
    #print alphabet[e], e 
    if alphabet[e] == guess: 
     alphabet.remove(guess) 
     break 

然而,你可能只是取消註釋上面的行,並刪除它,這樣前檢查它是否在數組中:

for count in range(10)[::-1]: 
guess = raw_input(str('Guess a letter: ')) 
if(guess in alphabet): 
    """"This is the previous method that creates a bug:/""" 
    alphabet.remove(guess) 
    for i in xrange(len(cpu_word)): 
     if cpu_word[i] == guess: 
      player_word [i] = cpu_word [i] 
      print 'Correct!' 
+0

我不確定哪個是最佳實踐方法,但都適用,我很感謝你幫助我理解爲什麼前一種方法沒有。謝謝! – Chris

+0

就我個人而言,我只會使用第二種方法(使用if語句),它的少量代碼行看起來更乾淨,但都起作用。很高興我能幫上忙! – Wso

1

你的問題可以通過使用列表索引循環,並在同一時間改變列表的大小。您可以直接通過項目均環:

for letter in alphabet: 
    if letter == guess: 
     alphabet.remove(guess) 

或者你也可以打破,當你已經刪除了信:

for e in range(len(alphabet)): 
    if alphabet[e] == guess: 
     alphabet.remove(guess) 
     break 

歇停止循環,因爲你完成這是很好的終止你刪除了這封信之後。

我認爲set會比列表更好,因爲它提供了O(1)刪除和包含。所以:

alphabet = ['a','b','c'...] # list, bad 
alphabet = {'a','b','c'...} # set, good 

然後你的字母「循環」將是:

if guess in alphabet: 
    alphabet.remove(guess) 
2

有沒有需要遍歷所有的字母,您可以檢查是否信仍然在用拼音:

if guess in alphabet: 
    #And do the function here: 
    alphabet.remove(guess) 

您的for-loop包含一個缺陷。您正在刪除字母表中的猜測字母,但隨後您的for循環會繼續。這會導致錯誤,因爲您的字母表現在縮短了一個字母,而循環仍然認爲它與以前尺寸相同。因此,打破for循環:

for e in xrange(len(alphabet)): 
    if alphabet[e] == guess: 
     alphabet.remove(guess) 
     break 
相關問題