Python的逻辑说明:

问题描述:

我写一个游戏,有两个丢失的条件: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

你太过复杂了。如果新片段小于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