Python Logic帮助:

Noa*_*ark 1 python logic

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

  1. 形成一个超过3个字母的单词.蜜蜂没关系,啤酒不是.
  2. 形成一个不能成为更长词的单词.Zebra没问题,Zebras不是.

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
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当我输入第四个字母时,它会自动转到for循环中的else,即使我在for循环中的if语句函数在交互式跟踪中的虚拟数据上单独测试时也能正常工作.

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

Ë

AA

aa:alge

虚假发现

真正

有任何想法吗?

Kat*_*iel 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
Run Code Online (Sandbox Code Playgroud)

(可以将上面的两个测试组合成一个条件语句:

return len( word ) <= 3 or word not in words and any( w.startswith( word ) for w in words )
Run Code Online (Sandbox Code Playgroud)

但我觉得这太过模糊了.)

我无法遵循上面代码的逻辑; 它写得相当容易混淆.(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 )
Run Code Online (Sandbox Code Playgroud)