def play_game(self): ''' Plays one game of Ghost ''' print print '- Game {0} -'.format(self._games_played + 1) fragment = '' current, opponent = \ self._prev_loser, self._prev_winner # loser goes first # play turns while True: letter = self.get_next_letter(current, fragment) # just adding a letter if letter != '!': fragment += letter if lexicon.has_word(fragment, Ghost._MIN_WORD_LENGTH): result = Ghost._FORMED_WORD break # a challenge was issued else: word = self.get_word(opponent, fragment) if word[:len(fragment)] == fragment and lexicon.has_word(word): result = self.__class__._LOST_CHALLENGE else: result = Ghost._WON_CHALLENGE break current, opponent = opponent, current self.process_result(current, opponent, fragment, result) self._games_played += 1
def get_next_letter(self, fragment): # always challenge if fragment is not a prefix if not lexicon.has_prefix(fragment): return '!' # choose a random next letter else: next_letter = random.choice(lexicon.valid_continuations(fragment)) # if that next letter completes a word, challenge instead # for now, GhostPlayer does not know about Ghost._MIN_WORD_LENGTH if lexicon.has_word(fragment + next_letter): return '!' # otherwise, just play that letter else: return next_letter
def get_word(self, fragment): # return any word with fragment as a prefix while not lexicon.has_word(fragment): next_letter = random.choice(lexicon.valid_continuations(fragment)) fragment += next_letter return fragment