Python Logic帮助:

时间:2010-09-02 14:28:11

标签: python logic

我正在写一个有两种失败条件的游戏:

  1. 形成一个超过3个字母的单词。蜜蜂没关系,啤酒不是。
  2. 形成一个不能成为长字的单词。 Zebra没问题,Zebras不是。
  3. Wordlist是单词列表,frag是前一个片段,a是玩家输入的新字母。所以frag可能看起来像'app'而且可能是'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循环中的else,即使在for循环中的if语句函数在交互式跟踪中的虚拟数据上单独测试时也能正常工作。 / p>

    这是frag alg的输出和word列表中带有单词algebra的字母e。

      

    ë

         

    AA

         

    aa:alge

         

    发现错误

         

    有什么想法吗?

1 个答案:

答案 0 :(得分:6)

你太复杂了。如果新片段少于3个字母,则自动为OK。如果没有,它必须是某个单词的开头,而不是单词本身就可以。

>>> 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 )