python-data-structures-evil-hangman / py_evil_hangman / game / game_manager.py
game_manager.py
Raw
from py_evil_hangman.word_maker import WordMakerAI, WordMakerHuman
from py_evil_hangman.word_guesser import WordGuesserHuman, WordGuesserAI # Add ", WordGuesserAI" to this line in the original file

MIN_WORD_LEN = 2
MAX_WORD_LEN = 20

class GameManager():
    def __init__(self, ai, words_file, guesses, debug):
        self.starting = guesses
        if ai:
            self.word_maker = WordMakerAI(words_file, debug)
        else:
            self.word_maker = WordMakerHuman(words_file, debug)
        # ALWAYS Comment EXACTLY ONE of lines 14 or 15 depending on whether you want the manual or AI automatic guesser
        self.word_guesser = WordGuesserHuman(guesses, words_file, debug)
        # self.word_guesser = WordGuesserAI(guesses, words_file, debug) # Add this line to the program
        self.ai = ai
        self.debug = debug
    def check_implementations(self):
        test_adv = WordMakerAI("py_evil_hangman/game/init_dict.txt", False)
        test_adv.reset(5)
        wordAttempt = test_adv.getValidWord()
        if type(wordAttempt) is not str or len(wordAttempt) != 5:
            print("WARNING: WordMakerAI.getValidWord() is not implemented yet. Don't forget to implement this!")
        lengthAttempt = test_adv.getAmountOfValidWords()
        if type(lengthAttempt) is not int or lengthAttempt <= 0:
            print("WARNING: WordMakerAI.getAmountOfValidWords() is not implemented yet. Don't forget to implement this!")
        guessAttempt = test_adv.guess("-")
        if type(guessAttempt) is not list or guessAttempt != []:
            print("WARNING: WordMakerAI.guess() doesn't seem to be implemented yet. The game will likely crash.")

    def control_loop(self):
        if self.ai:
            self.check_implementations()
        while True:
            print("Let's play hangman!")
            while True:
                numS = input(f"How many characters should my word be? ({MIN_WORD_LEN}-{MAX_WORD_LEN}): ")
                try:
                    num = int(numS)
                    if num >= MIN_WORD_LEN and num <= MAX_WORD_LEN: break
                except:
                    pass
            self.run_game(num)
            ans = input("Would you like to play again? (y/n):")
            while ans not in ["y", "n"]:
                ans = input("Would you like to play again? (y/n):")
            if ans == "n": break

    def run_game(self, word_length):
        self.word_maker.reset(word_length)
        self.word_guesser.reset(word_length)

        while True:
            if self.word_guesser.state.guesses == 0:
                print(f"You lose! The word was {self.word_maker.getValidWord()}.")
                break
            self.word_guesser.state.print_state(self.word_maker.getAmountOfValidWords())
            inp = self.word_guesser.getGuess()
            letter_positions = self.word_maker.guess(inp)
            letter_count = len(letter_positions)
            s = "s" if letter_count != 1 else ""
            print(f"Found {letter_count} '{inp}'{s}")

            self.word_guesser.state.guesses -= 1 if letter_count == 0 else 0
            self.word_guesser.state.guessed.append(inp)
            for i in letter_positions:
                self.word_guesser.state.word[i] = inp

            self.word_guesser.state.done_letters += letter_count
            if self.word_guesser.state.done_letters == word_length:
                left = self.starting - self.word_guesser.state.guesses
                es = "es" if left != 1 else ""
                print(f"You win in {left} incorrect guess{es}!")
                print("The word was {}".format("".join(self.word_guesser.state.word)))
                break