作爲一個練習,我一直試圖在python中構建一個非GUI boggle類型的遊戲。到目前爲止,用戶可以輸入棋盤大小(4x4,5x5等)。出現字母'數組',然後用戶可以鍵入他們認爲是有效選項的單詞。如何遞歸檢查一個在boggle類型遊戲中的答案
我想通過使用遞歸函數檢查輸入的單詞是否有效。在小板上我的解決方案似乎工作正常。然而,在較大的棋盤上,具有類似起始和多個路徑的單詞不會註冊。我有一種感覺,那是因爲如果當前路徑沒有找到正確的單詞,我的函數的最後一部分就不能夠退回到足夠遠的地步。
這是我到目前爲止有:
def isAdjacent(word, wordLetter, possibleStarts, arrayDict, currWord, start):
#'word' is the word entered. 'wordLetter' is the current letter being looked for.
#'possibleStarts' is a list of tuples of the possible starting locations and subsequent positions of each found letter.
#'arrayDict' is a dictionary associating each position ((0,1), etc) with a game letter.
#'currWord' is used to check whether or not a word has been found.
#'start' is the tuple in possibleStarts that should be used.
if currWord == word:
return 1
x = possibleStarts[start][0]
y = possibleStarts[start][1]
arrayDict[x,y] = 0
optionsList = [(x - 1, y - 1), (x - 1, y), (x - 1, y + 1), (x, y - 1), (x, y + 1), (x + 1, y - 1), (x + 1, y), (x + 1, y + 1)]
newStarts = []
count = 0
count2 = 0
for option in optionsList:
count += 1
if option in arrayDict:
if arrayDict[option] == word[wordLetter]:
if count2 < 1:
currWord += word[wordLetter]
arrayDict[option] = 0
count2 += 1
newStarts.append(option)
if count == 8 and newStarts:
return isAdjacent(word, wordLetter + 1, newStarts, arrayDict, currWord, start)
try:
if currWord != word:
if wordLetter > 2:
return isAdjacent(word, wordLetter - 1, possibleStarts, arrayDict, currWord[:-1], start - 1)
else:
return isAdjacent(word, wordLetter, possibleStarts, arrayDict, currWord, start - 1)
except:
pass
我認爲,問題的至少一部分在函數結束在於try塊。如果這個詞不是太長或者沒有太多可能性,它就會有效。例如,試圖找到「原糖」在下面,將無法正常工作,即使它是存在的:
W T S V
A X A H
S R T S
A B A W
我確信,這可以用一個比較簡單的遞歸函數來完成,但幾個小時後,我搞不清楚了。 哦,我寧願不預先生成所有可能的單詞。這樣做的目的是使用遞歸來查找輸入的單詞。
任何幫助,非常感謝!
不合格'except'應該*真的*命名一個特定的異常類型。很難調試那樣的代碼。 – 2011-04-24 20:27:16
作爲一個練習,這應該很有趣,但要注意棧的大小相當大,但有限,所以你可以得到一個_stack overflow_(這在某種程度上適用於此)。 – extraneon 2011-04-24 20:27:55
是的,'嘗試:...除了:通過'是撒旦的產卵(或上帝,取決於你更糟糕的是:p) – ThiefMaster 2011-04-24 20:28:25