Skip to content

Instantly share code, notes, and snippets.

@christianp
Created June 3, 2014 08:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save christianp/98343fb6b2b8c69adf77 to your computer and use it in GitHub Desktop.
Save christianp/98343fb6b2b8c69adf77 to your computer and use it in GitHub Desktop.
A hangman bot
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