2010-09-02 43 views
1

我寫一個遊戲,有兩個丟失的條件:Python的邏輯說明:

  1. 字一次成型超過3個字母長。蜜蜂沒事,啤酒不是。
  2. 形成一個單詞,不能做成一個更長的單詞。斑馬沒關係,斑馬不是。

Wordlist是單詞列表,frag是前一個片段,a是玩家輸入的新字母。所以碎片可能看起來像'應用程序',也可能是'l',形成蘋果這個詞。

def getLoser(frag, a, wordlist): 
word = frag + a 

if len(word) > 3: 

    if word in wordlist: 
     print 'word in wordlist' 
     return True 

    else: 
     for words in wordlist: 
      if words[:len(word)] == word: 
       print words,':', word 
       print 'valid word left' 
       return False 

      else: 
       print words[:len(word)] 
       print words,':', word 
       print 'false found' 
       return True 
else: 
    return False 

出於某種原因,當我進入我的第四個字母,它會自動轉到其他的for循環,即使在for循環的if語句功能可以正常工作,當我獨自一人測試它在虛擬數據互動線索。

這裏是frag alg和word單詞列表中的單詞algebra的字母e的輸出。

Ë

AA

AA:水藻

虛假髮現

任何想法?

+2

通過什麼邏輯是'Beer'不能確定,'Zebra' OK?規則1說他們都不好,規則2說他們都好,你的斷言/例子說不同的事情。看起來像對我來說是矛盾的。 – 2010-09-02 14:49:36

+1

@Alex:根據第二種情況,「Zebra」不好,但不是第一種。 * Mutatis變通*爲「啤酒」。任何一種情況都意味着損失。 – katrielalex 2010-09-02 14:57:31

回答

6

你太過複雜了。如果新片段小於3個字母,則它自動成功。如果不是的話,那一定是這個詞的開頭不是一個詞本身就可以。

>>> words = { "apple" } 
>>> def isOK(fragment, letter): 
...  word = fragment + letter 
...  if len(word) <= 3: return True 
...  return word not in words and any(w.startswith(word) for w in words) 
... 
>>> isOK("a", "p") 
True 
>>> isOK("ap", "p") 
True 
>>> isOK("app", "l") 
True 
>>> isOK("appl", "l") 
False 
>>> isOK("appl", "e") 
False 

(這將有可能兩種測試相結合以上爲一個條件語句:

return len(word) <= 3 or word not in words and any(w.startswith(word) for w in words) 

,但我認爲這是過於晦澀難懂。)

我不能按照邏輯你的代碼在上面;它寫得很混亂。 (例如,爲什麼words是一個字符串?)在試圖實現它之前,嘗試使用僞代碼編寫遊戲的邏輯 - 這可以幫助您理清思路。


這裏有一個更清晰的版本:

def isOK(word): 
    condition_one = len(word) > 3 and word in words 
    condition_two = not any(w.startswith(word) for word in words) 

    return not(condition_one or condition_two) 
+0

這很奇妙。我如何學會簡化我的代碼? – 2010-09-02 14:41:20

+0

我用白板上的僞代碼編寫它。單詞是一個字符串,所以我可以對當前單詞測試一定長度的每個單詞。如果它們匹配,那麼我們知道至少還可以添加一個字母。 – 2010-09-02 14:45:07

+1

@NoahClark:使用諸如'startswith'和'any'之類的Python成語來實踐 - 我記得有人解釋了最好的方式來提出他們,「從開始時假設Python已經有一些神奇的功能,你想要什麼。」我認爲你的僞代碼也可能有點低級;在這種情況下,在考慮如何實現'startswith'測試之前,你只需要計算出你想要實現的邏輯。 – katrielalex 2010-09-02 14:49:04