Compare commits

...

1 Commits

Author SHA1 Message Date
f6779e6c25 rewrote hangman.py 2018-03-29 21:27:04 -04:00

View File

@ -1,91 +1,84 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" """
Hangman. A class and functions needed for playing handman.
""" """
import os
import random import random
import module
from module import commands, example
class Hangman(): class Hangman():
def __init__(self): def __init__(self, bot):
self.running = False
def newgame(self):
self.running = True
self.tries = 8 self.tries = 8
self.word = self._PickWord() self.word = self._PickWord(bot)
self.working = [x for x in self.word] self.working = [x for x in self.word]
self.blanks = list('_' * len(self.word)) self.blanks = list('_' * len(self.word))
def _PickWord(self, bot):
with open(os.path.join(bot.static, "wordlist.txt"), "r") as file:
word = random.choice(file.read().splitlines())
return word
def update(self, guess):
if not guess in self.word:
return
for n, char in enumerate(self.word): for n, char in enumerate(self.word):
if char == ' ': if char == guess:
self.blanks[n] = ' ' self.blanks[n] = guess
def _PickWord(self):
with open("/home/iou1name/fulvia/static/wordlist.txt",'r') as file:
lines = file.readlines()
wrd = list(lines[ random.randint(0, len(lines))-1 ].strip())
return wrd
def solve(self, guess): def setup(bot):
if list(guess) == self.word: bot.memory["hangman"] = {}
self.running = False
self.blanks = self.word
return 'win'
elif guess in self.word and len(guess) == 1:
while guess in self.working:
index = self.working.index(guess)
self.blanks[index] = guess
self.working[index] = '_'
return 'correct'
else:
self.tries = self.tries - 1
if self.tries == 0:
self.running = False
self.blanks = self.word
return 'lose'
else:
return 'incorrect'
def return_blanks(self): @commands("hangman", "hm")
return ''.join(self.blanks)
hangman = Hangman()
@module.commands('hangman')
@module.example('.hangman')
def hangman_start(bot, trigger): def hangman_start(bot, trigger):
"""Starts a game of hangman.""" """Starts a game of hangman."""
if hangman.running: if not trigger.group(2):
bot.reply("There is already a game running.") return bot.reply("Hang what?")
if trigger.group(3) == "--start" or trigger.group(3) == "-s":
if bot.memory["hangman"].get(trigger.channel):
return bot.reply("There is already a game running in this channel.")
bot.memory["hangman"][trigger.channel] = Hangman(bot)
msg = f"{trigger.nick} has started a game of hangman! " \
+ "Use '.hangman [guess]' to guess a letter or the entire word."
bot.msg(msg)
bot.say("".join(bot.memory["hangman"][trigger.channel].blanks))
return return
hangman.newgame() if not bot.memory["hangman"].get(trigger.channel):
bot.say(trigger.nick + " has started a game of hangman! Type .guess to guess a letter or the entire phrase.") msg = "There is no game currently running in this channel. " \
bot.say(hangman.return_blanks()) + "Use '.hangman --start' to start one"
return bot.reply(msg)
if len(trigger.group(2)) > 1:
@module.commands('guess') if trigger.group(2) == bot.memory["hangman"][trigger.channel].word:
@module.example('.guess a') bot.say(f"{trigger.nick} has won!")
@module.example('.guess anus') bot.say(bot.memory["hangman"][trigger.channel].word)
def guess(bot, trigger): bot.memory["hangman"].pop(trigger.channel)
"""Makes a guess in hangman. May either guess a single letter or the entire word/phrase."""
if not hangman.running:
bot.reply('There is no game currently running. Use .hangman to start one')
return return
response = hangman.solve(trigger.group(2))
if response == 'win':
bot.say(trigger.nick + " has won!")
elif response == 'correct':
pass
elif response == 'lose':
bot.say("Game over.")
elif response == 'incorrect':
bot.reply("incorrect.")
bot.say( str(hangman.tries) + " tries left." )
else: else:
bot.say('Fuck.') msg = "Incorrect. " \
+ f"{bot.memory['hangman'][trigger.channel].tries} tries left."
bot.reply(msg)
bot.say(hangman.return_blanks()) elif len(trigger.group(2)) == 1:
if trigger.group(2) in bot.memory["hangman"][trigger.channel].word:
bot.reply("Correct!")
bot.memory["hangman"][trigger.channel].update(trigger.group(2))
else:
bot.memory["hangman"][trigger.channel].tries -= 1
msg = "Incorrect. " \
+ f"{bot.memory['hangman'][trigger.channel].tries} tries left."
bot.reply(msg)
if bot.memory["hangman"][trigger.channel].tries <= 0:
bot.say("Game over!")
bot.say(bot.memory['hangman'][trigger.channel].word)
bot.memory["hangman"].pop(trigger.channel)
else:
bot.say("".join(bot.memory["hangman"][trigger.channel].blanks))