From 22d76ea932c3b79a665d6c98b7c4a20d21536d70 Mon Sep 17 00:00:00 2001 From: iou1name Date: Thu, 29 Mar 2018 21:27:04 -0400 Subject: [PATCH] rewrote hangman.py --- modules/hangman.py | 148 ++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 76 deletions(-) diff --git a/modules/hangman.py b/modules/hangman.py index 1deacb8..d1dbaa5 100755 --- a/modules/hangman.py +++ b/modules/hangman.py @@ -1,91 +1,87 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- +#!/usr/bin/env python3 """ -Hangman. +A class and functions needed for playing handman. """ +import os import random -import module + +from module import commands, example class Hangman(): - def __init__(self): - self.running = False - - def newgame(self): - self.running = True + def __init__(self, bot): self.tries = 8 - self.word = self._PickWord() + self.word = self._PickWord(bot) self.working = [x for x in self.word] self.blanks = list('_' * len(self.word)) - for n,char in enumerate(self.word): - if char == ' ': - self.blanks[n] = ' ' - 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 _PickWord(self, bot): + with open(os.path.join(bot.static, "wordlist.txt"), "r") as file: + word = random.choice(file.read().splitlines()) + return word - def solve(self, guess): - if list(guess) == self.word: - self.running = False - self.blanks = self.word - return 'win' + def update(self, guess): + if not guess in self.word: + return - 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' + for n, char in enumerate(self.word): + if char == guess: + self.blanks[n] = guess + + +def setup(bot): + bot.memory["hangman"] = {} + + +@commands("hangman", "hm") +def hangman(bot, trigger): + """ + Plays hangman. --start [-s] to start a new game, otherwise words are + taken as attempts to solve and single characters are taken as guesses. + """ + if not trigger.group(2): + 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 + + if not bot.memory["hangman"].get(trigger.channel): + msg = "There is no game currently running in this channel. " \ + + "Use '.hangman --start' to start one" + return bot.reply(msg) + + if len(trigger.group(2)) > 1: + if trigger.group(2) == bot.memory["hangman"][trigger.channel].word: + bot.say(f"{trigger.nick} has won!") + bot.say(bot.memory["hangman"][trigger.channel].word) + bot.memory["hangman"].pop(trigger.channel) + return else: - self.tries = self.tries - 1 - if self.tries == 0: - self.running = False - self.blanks = self.word - return 'lose' - else: - return 'incorrect' + msg = "Incorrect. " \ + + f"{bot.memory['hangman'][trigger.channel].tries} tries left." + bot.reply(msg) - def return_blanks(self): - return ''.join(self.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)) -hangman = Hangman() - -@module.commands('hangman') -@module.example('.hangman') -def hangman_start(bot, trigger): - """Starts a game of hangman.""" - if hangman.running: - bot.reply("There is already a game running.") - return - - hangman.newgame() - bot.say(trigger.nick + " has started a game of hangman! Type .guess to guess a letter or the entire phrase.") - bot.say(hangman.return_blanks()) - - -@module.commands('guess') -@module.example('.guess a') -@module.example('.guess anus') -def guess(bot, trigger): - """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 - - 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: + 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('Fuck.') - - bot.say(hangman.return_blanks()) + bot.say("".join(bot.memory["hangman"][trigger.channel].blanks))