Skip to main content
 首页 » 编程设计

Python 逻辑帮助 :

2025年05月04日17webabcd

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

  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 

出于某种原因,当我输入第 4 个字母时,它会自动转到 for 循环中的 else,即使当我在交互式轨迹中单独对虚拟数据进行测试时,for 循环中的 if 语句功能正常工作。

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

e

aa

aa : alge

false found

True

有什么想法吗?

请您参考如下方法:

你把事情搞得太复杂了。如果新片段少于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 )