2010-09-02 2 views
1

Я пишу игру, где есть две проигрышные условия:Python Логика Справка:

  1. формовочные слово длиннее, чем 3-х букв. Пчела в порядке, Пиво нет.
  2. Формирование слова, которое невозможно превратить в более длинное слово. Зебра в порядке, Зебры нет.

Wordlist - это список слов, фрагмент - это предыдущий фрагмент, и это новая буква, в которую входит игрок. поэтому фрагмент может выглядеть как «приложение» и, возможно, «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-ю букву, он автоматически переходит в другой в течение цикла, даже если если заявление функция для цикла работает правильно, когда я проверить его один на фиктивных данных в интерактивная тропа.

Здесь вывод для фрагмента alg и буквы e с помощью алгебры слов в списке слов.

е

аа

аа: ALGE

ложно найдено

Правда

Любые идеи?

+2

По какой логике это 'Beer' не в порядке, и' Zebra' OK? Правило 1 говорит, что они оба не ОК, правило 2 говорит, что они оба в порядке, а ваши утверждения/примеры говорят о них по-разному. Похоже на меня противоречие. –

+1

@Alex: «Зебра» плохо в соответствии со вторым условием, но не первым. * Mutatis mutandis * для 'Beer'. Любое условие подразумевает потерю. – katrielalex

ответ

6

Вы чрезмерны. Если новый фрагмент составляет менее 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

Это работает чудесно. Как я могу научиться несложному коду? –

+0

Я пишу его в псевдокоде на доске. слова - это строка, поэтому я могу проверить каждое слово определенной длины относительно текущего слова. Если они совпадают, мы знаем, что по крайней мере еще одно письмо может быть добавлено. –

+1

@NoahClark: Использование идиом Python, таких как 'startswith' и' any', приходит с практикой - я помню, как кто-то объяснял лучший способ придумать их, чтобы «начать с того, что Python уже имеет какую-то магическую функцию, которая делает что ты хочешь." Я думаю, что ваш псевдокод может быть немного низкоуровневым; в этом случае вам просто нужно было выяснить, какую логику вы хотели реализовать, прежде чем думать о том, как реализовать тест 'startswith'. – katrielalex

Смежные вопросы