我正在写一个有两种失败条件的游戏:
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
发现错误
真
有什么想法吗?
答案 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 )