Created
June 3, 2014 08:08
-
-
Save christianp/98343fb6b2b8c69adf77 to your computer and use it in GitHub Desktop.
A hangman bot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import operator | |
import re | |
import random | |
words = [word.upper() for word in open('words.txt').read().split('\n')[:-1]] | |
class Hangman: | |
finished = False | |
def __init__(self,word): | |
self.word = word.upper() | |
self.guessed = [] | |
self.incorrect = [] | |
self.revealed = '_'*len(self.word) | |
def guess(self,letter): | |
self.guessed.append(letter) | |
letter = letter.upper() | |
if letter in self.word: | |
self.revealed = ''.join([a if b!='_' or a==letter else b for a,b in zip(self.word,self.revealed)]) | |
if self.revealed==self.word: | |
self.finished = True | |
return True | |
else: | |
self.incorrect.append(letter) | |
print("No %s" % letter) | |
return False | |
def status(self): | |
print('') | |
print("Turn %i" % (len(self.guessed)+1)) | |
print(' '.join(self.revealed)) | |
if len(self.incorrect): | |
print(', '.join(self.incorrect)) | |
print('') | |
def runs(letters): | |
count = 0 | |
current = letters[0] | |
for letter in letters: | |
if letter == current: | |
count += 1 | |
else: | |
yield (current,count) | |
current = letter | |
count = 1 | |
yield (current,count) | |
class Guesser: | |
word_buckets = [[] for i in range(100)] | |
for word in words: | |
word_buckets[len(word)].append(word) | |
def __init__(self,game): | |
self.game = game | |
self.possible = self.word_buckets[len(game.revealed)] | |
def guess(self): | |
game = self.game | |
if len(game.revealed.replace('_','')): | |
r = re.compile('^%s$' % game.revealed.replace('_','.')) | |
self.possible = [word for word in self.possible if r.match(word)] | |
sums=sorted(''.join(sum([list(set(word)) for word in self.possible],[]))) | |
guesses = [letter for letter,count in sorted(runs(sums),key=operator.itemgetter(1),reverse=True)] | |
for guess in guesses: | |
if guess not in game.guessed: | |
print("Guessing %s" % guess) | |
if game.guess(guess): | |
return | |
game.status() | |
if __name__ == '__main__': | |
word = random.choice(words) | |
print(word) | |
game = Hangman(word) | |
guesser = Guesser(game) | |
while not game.finished: | |
game.status() | |
guesser.guess() | |
game.status() | |
print("Well done!") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment