def test_multiple_same_guesses():
    h = Hangman()
    h.new_game('defenestrate')
    h.guess('e')
    h.guess('e')
    assert h.guesses == ['e']
    print('test_multiple_same_guesses passed!')
예제 #2
0
 def test_winning_on_last_guess_still_counts_as_a_win(self):
     game = Hangman('aaa')
     for ch in 'bcdefghij':
         game.guess(ch)
     game.guess('a')
     self.assertEqual(game.remaining_guesses, 0)
     self.assertEqual(game.get_status(), hangman.STATUS_WIN)
     self.assertEqual(game.get_masked_word(), 'aaa')
def test_guessing_entire_word():
    h = Hangman()
    h.new_game('batman')
    h.guess('batman')
    assert h.has_guessed_word() is True
    assert h.guesses == ['batman']

    print('test_guessing_entire_word passed!')
def test_basic_guesses():
    h = Hangman()
    h.new_game('conscientious')
    h.guess('e')
    assert h.guesses == ['e']
    h.guess('f')
    assert h.guesses == ['e', 'f']
    print('test_basic_guesses passed!')
예제 #5
0
 def test_winning_on_last_guess_still_counts_as_a_win(self):
     game = Hangman('aaa')
     for ch in 'bcdefghij':
         game.guess(ch)
     game.guess('a')
     self.assertEqual(game.remaining_guesses, 0)
     self.assertEqual(game.get_status(), hangman.STATUS_WIN)
     self.assertEqual(game.get_masked_word(), 'aaa')
예제 #6
0
def guess_text():
    text = request.form['guess']
    text = text.strip()
    if len(text) > 0:
        hangman = Hangman()
        hangman.guess(text)
        hangman.save()
    return redirect(url_for('show_game'))
예제 #7
0
    def test_after_10_failures_the_game_is_over(self):
        game = Hangman('foo')

        for i in range(10):
            game.guess('x')

        self.assertEqual(game.get_status(), hangman.STATUS_LOSE)
        with self.assertRaisesWithMessage(ValueError):
            game.guess('x')
예제 #8
0
    def test_after_10_failures_the_game_is_over(self):
        game = Hangman('foo')

        for _ in range(10):
            game.guess('x')

        self.assertEqual(game.get_status(), hangman.STATUS_LOSE)
        with self.assertRaisesWithMessage(ValueError):
            game.guess('x')
예제 #9
0
    def test_after_10_failures_the_game_is_over(self):
        game = Hangman('foo')

        for i in range(10):
            game.guess('x')

        self.assertEqual(game.get_status(), hangman.STATUS_LOSE)
        with self.assertRaises(ValueError) as err:
            game.guess('x')
        self.assertEqual(type(err.exception), ValueError)
        self.assertEqual(err.exception.args[0], "The game has already ended.")
예제 #10
0
    def test_feeding_a_correct_letter_removes_underscores(self):
        game = Hangman('foobar')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 9)
        self.assertEqual(game.get_masked_word(), '___b__')

        game.guess('o')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 9)
        self.assertEqual(game.get_masked_word(), '_oob__')
예제 #11
0
    def test_feeding_a_correct_letter_removes_underscores(self):
        game = Hangman('foobar')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 9)
        self.assertEqual(game.get_masked_word(), '___b__')

        game.guess('o')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 9)
        self.assertEqual(game.get_masked_word(), '_oob__')
예제 #12
0
    def test_feeding_a_correct_letter_twice_counts_as_a_failure(self):
        game = Hangman('foobar')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 9)
        self.assertEqual(game.get_masked_word(), '___b__')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '___b__')
예제 #13
0
def guess_text():
    text = request.form["guess"]
    hangman = Hangman()
    hangman.guess(text)
    hangman.save()
    # prediction = guess()
    # text = show_game()
    # if prediction is None:
    # 	game.append(text)
    # pass
    #...When you make a guess on a game. Not when you start a new game. Separate URL for that
    return redirect(url_for('show_game'))
예제 #14
0
    def test_feeding_a_correct_letter_twice_counts_as_a_failure(self):
        game = Hangman('foobar')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 9)
        self.assertEqual(game.get_masked_word(), '___b__')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '___b__')
예제 #15
0
class HangmanTestCase(unittest.TestCase):
    def setUp(self):
        self.game = Hangman("hello", 10)
        self.game2 = Hangman("goodbye", 10)

    def test_status(self):
        self.assertEqual(self.game2.status(), "???????")

    def test_bad_guess(self):
        self.assertEqual(self.game.status(), "?????")
        self.assertEqual(self.game.guess('x'), 0)
        self.assertEqual(self.game.status(), "?????")

    def test_good_guess(self):
        self.assertEqual(self.game.status(), "?????")
        self.assertEqual(self.game.guess('h'), 1)
        self.assertEqual(self.game.status(), "h????")

    def test_multiple_guess(self):
        self.assertEqual(self.game2.status(), "???????")
        self.assertEqual(self.game2.guess('o'), 2)
        self.assertEqual(self.game2.status(), "?oo????")

    def test_more_letters(self):
        self.assertEqual(self.game.guess('h'), 1)
        self.assertEqual(self.game.status(), "h????")
        self.assertEqual(self.game.guess('i'), 0)
        self.assertEqual(self.game.status(), "?????")
        self.assertEqual(self.game.status(), "h????")
        self.assertEqual(self.game.guess('l'), 2)
        self.assertEqual(self.game.status(), "h?ll?")
        self.assertEqual(self.game.guess('e'), 1)
        self.assertEqual(self.game.status(), "hell?")
예제 #16
0
    def play_game():
        play = Hangman(get_word())
        while not play.game_end():
            play.status()
            user_input = input('\nEnter a letter: ').lower()
            if len(user_input) != 1:
                print("Please, enter just a letter")
            elif user_input not in "abcdefghijklmnopqrstuvwxyz":
                print("Please enter an alphabet")
            else:
                play.guess(user_input)

        if play.win():
            print()
            print("Great! You got the word right. It was {}".format(play.word))
        else:
            play.status()
            print("\nOoops! You Lost!")
            print("The word was {}".format(play.word))
def test_guesses_changing_public_word():
    h = Hangman()
    h.new_game('encyclopedia')
    assert h.public_word == list('____________')

    h.guess('e')
    assert h.public_word == list('e_______e___')

    h.guess('c')
    assert h.public_word == list('e_c_c___e___')

    h.guess('n')
    assert h.public_word == list('enc_c___e___')

    h.guess('a')
    assert h.public_word == list('enc_c___e__a')

    print('test_guesses_changing_public_word passed!')
def test_guessing_word():
    h = Hangman()
    h.new_game('cat')

    h.guess('c')
    assert h.has_guessed_word() is False
    h.guess('a')
    assert h.has_guessed_word() is False
    h.guess('t')
    assert h.has_guessed_word() is True
    print('test_guessing_word passed!')
예제 #19
0
class Application(tk.Frame):
    """Tkinter application for Hangman """
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.game = Hangman()
        self.create_widgets()
        self.grid()

    def create_widgets(self):
        """Create all widgets and display them."""
        self._add_lives(row=0, column=0)
        self._add_display_hangman(row=1, column=0)
        self._add_text_input(row=2, column=0)
        self._add_button(row=3, column=0)
        self._add_attemps(row=4, column=0)

    def click(self):
        """Click initialized by "guess button."""
        # Get user input
        self.user_inp = self.text_input.get().lower()
        self.game.guess(self.user_inp)
        self.main_text.config(text=self.game.get_masked_word())

        self._click_update_attempts()
        self._click_update_lives()
        self._click_if_endgame()

    def _click_update_attempts(self):
        """Update displayed attempts."""
        label_text = self.attempts_var.get()
        label_text += self.user_inp + " "
        self.attempts_var.set(label_text)

    def _click_update_lives(self):
        """Update displayed lives."""
        label_num = self.lives_var.get()
        label_num = f"Lives: {self.game.get_lives()}"
        self.lives_var.set(label_num)

    def _click_if_endgame(self):
        """ Checks if the game has ended """
        if self.game.is_guessed():
            messagebox.showinfo("CONGRATS!", "You nailed it!")
            self.quit()

        elif self.game.is_dead():
            messagebox.showinfo(
                "WASTED!",
                f"You've run out of lives. The word was {self.game.get_word()}"
            )
            self.quit()

    def _add_lives(self, row, column):
        """Add widget for displaying lives"""
        # Create widget variable for future change
        self.lives_var = tk.StringVar()
        # Get widget variable value and change it
        label_num = self.lives_var.get()
        label_num = f"Lives: {self.game.lives}"
        # Lock widget variable
        self.lives_var.set(label_num)
        self.lives = tk.Label(self, textvariable=self.lives_var)
        # Display widget variable
        self.lives.grid(row=row, column=column)

    def _add_attemps(self, row, column):
        """Add widget for displaying attempts"""
        # Create widget variable for future change
        self.attempts_var = tk.StringVar()
        # Get widget variable value and change it
        label_text = self.attempts_var.get()
        label_text += "Attempts:\n"
        # Lock widget variable
        self.attempts_var.set(label_text)
        self.attempts = tk.Label(self, textvariable=self.attempts_var)
        # Display widget variable
        self.attempts.grid(row=row, column=column)

    def _add_display_hangman(self, row, column):
        """Add widget for displaying words of hangman"""
        self.main_text = tk.Label(self,
                                  text=self.game.get_masked_word(),
                                  font=("Kumar One", 50))
        self.main_text.grid(row=row, column=column)

    def _add_text_input(self, row, column):
        """Add widget for inputing letters or words"""
        self.text_input = tk.Entry(self, justify='center')
        self.text_input.grid(row=row, column=column)

    def _add_button(self, row, column):
        """Add button to initialize "click" function"""
        self.guess_button = tk.Button(self,
                                      text='Enter',
                                      command=self.click,
                                      width=21,
                                      highlightcolor='blue')
        self.guess_button.grid(row=row, column=column)
예제 #20
0
    def test_getting_all_the_letters_right_makes_for_a_win(self):
        game = Hangman('hello')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_____')

        game.guess('e')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_e___')

        game.guess('l')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_ell_')

        game.guess('o')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_ello')

        game.guess('h')
        self.assertEqual(game.get_status(), hangman.STATUS_WIN)
        self.assertEqual(game.get_masked_word(), 'hello')

        with self.assertRaises(ValueError) as err:
            game.guess('x')
        self.assertEqual(type(err.exception), ValueError)
        self.assertEqual(err.exception.args[0], "The game has already ended.")
예제 #21
0
    def test_getting_all_the_letters_right_makes_for_a_win(self):
        game = Hangman("hello")

        game.guess("b")
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), "_____")

        game.guess("e")
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), "_e___")

        game.guess("l")
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), "_ell_")

        game.guess("o")
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), "_ello")

        game.guess("h")
        self.assertEqual(game.get_status(), hangman.STATUS_WIN)
        self.assertEqual(game.get_masked_word(), "hello")

        with self.assertRaisesWithMessage(ValueError):
            game.guess("x")
예제 #22
0
    def test_getting_all_the_letters_right_makes_for_a_win(self):
        game = Hangman('hello')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_____')

        game.guess('e')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_e___')

        game.guess('l')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_ell_')

        game.guess('o')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_ello')

        game.guess('h')
        self.assertEqual(game.get_status(), hangman.STATUS_WIN)
        self.assertEqual(game.get_masked_word(), 'hello')

        with self.assertRaisesWithMessage(ValueError):
            game.guess('x')
예제 #23
0
class Game(object):
    def __init__(self):
        # The session ID of the player who guesses the phrase
        self.guesser = PLAYER_NOT_CHOSEN
        # Hangman game instance
        self.hangman = None
        # Dictionary of [session_id:Player] currently connected
        self.players = {}
        # Screen that the users are on
        self.game_state = GameState.TITLE_SCREEN
        self.letters_guessed = []
        self.phrase_misses = 0

    # Reset the whole state
    def reset(self):
        self.reset_guesser()
        self.hangman = None
        # Don't reset players since people are still connected as spectators
        self.game_state = GameState.TITLE_SCREEN
        self.letters_guessed = []
        self.phrase_misses = 0

    # Keep track of a new player in the game
    def add_player(self, sid):
        assert sid is not None
        assert sid not in self.players
        self.players[sid] = Player(sid)

    # Remove a player from the game when they disconnect
    def remove_player(self, sid):
        assert sid is not None
        assert sid in self.players
        self.players.pop(sid, None)

    # Get the number of players currently connected
    def count_players(self):
        return len(self.players)

    # Return True if the current player is a guesser, False if not
    def is_guesser(self, sid):
        assert sid is not None
        return self.guesser == sid

    # Return True if someone was chosen as a guesser, False if not
    def is_guesser_set(self):
        return self.guesser != PLAYER_NOT_CHOSEN

    # Set the guesser back to PLAYER_NOT_CHOSEN, returns True if there was a
    # guesser previously, False if not
    def reset_guesser(self):
        # Reset roles in players dictionary
        if self.guesser != PLAYER_NOT_CHOSEN:
            assert self.guesser in self.players
            self.players[self.guesser].make_spectator()
            self.guesser = PLAYER_NOT_CHOSEN
            return True
        return False

    # Become the new guesser - assumes guesser was already reset
    def set_guesser(self, sid, name):
        self.guesser = sid
        if (sid == PLAYER_NOT_CHOSEN):
            return
        self.players[sid].make_guesser()
        self.players[sid].set_name(name)

    # Become a spectator on the server
    def set_spectator(self, sid):
        self.players[sid].make_spectator()

    # Get the name of the player
    def get_name(self, sid):
        if (sid == PLAYER_NOT_CHOSEN):
            return PLAYER_NOT_CHOSEN
        assert sid is not None
        assert sid in self.players
        return self.players[sid].get_name()

    # Set a new name for the player
    def set_name(self, sid, name):
        assert sid is not None
        assert sid in self.players
        return self.players[sid].set_name(name)

    # Reset the name of the player
    def reset_name(self, sid):
        assert sid is not None
        assert sid in self.players
        return self.players[sid].reset_name()

    # Set the hangman game
    def set_phrase(self, level, debug):
        if debug:
            phrase = 'HELLO'
        else:
            phrase = _get_random_phrase(level)
        self.hangman = Hangman(phrase)

    # Get the current type of the player as a string
    def get_player_type(self, sid):
        return self.players[sid].get_player_type()

    # Determines if guesser have been confirmed
    def players_ready(self):
        return self.is_guesser_set()

    # Returns the phrase in its currently discovered position
    def guess_letter(self, letter):
        assert self.hangman is not None
        self.hangman.guess(letter)
        self.letters_guessed.append(letter)
        return self.get_currently_discovered_phrase()

    # Returns the phrase with underlines for what hasn't been guessed yet
    def get_currently_discovered_phrase(self):
        if self.hangman is None:
            return None
        return self.hangman.getCurrentlyDiscoveredPhrase()

    # Checks if phrase has been successfully completed
    def is_completed(self):
        if self.hangman is None:
            return False
        return self.hangman.isCompleted()

    def hit_constrain(self, val):
        self.phrase_misses = min(7, max(0, val))
예제 #24
0
    def test_getting_all_the_letters_right_makes_for_a_win(self):
        game = Hangman('hello')

        game.guess('b')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_____')

        game.guess('e')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_e___')

        game.guess('l')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_ell_')

        game.guess('o')
        self.assertEqual(game.get_status(), hangman.STATUS_ONGOING)
        self.assertEqual(game.remaining_guesses, 8)
        self.assertEqual(game.get_masked_word(), '_ello')

        game.guess('h')
        self.assertEqual(game.get_status(), hangman.STATUS_WIN)
        self.assertEqual(game.get_masked_word(), 'hello')

        with self.assertRaisesWithMessage(ValueError):
            game.guess('x')
예제 #25
0
class HangmanGame:
    """
    Initiate a hangman game
    
    :ivar hangman: Class Hangman
    :ivar active: The state of the game
    """
    def __init__(self):
        print(hascii.logo)
        self.hangman = Hangman(self.random_word())
        self.active = True

    @staticmethod
    def random_word():
        """
        Select a random word from a text file.
        :return: a lower-case word
        """
        with open('hangman_words.csv', 'r') as wordlist:
            word = choice(wordlist.read().split(','))
        return word

    def play(self):
        """
        Run this method to start the game.
        """
        while self.active:
            while self.active:
                print(self.hangman)
                print(f'\nNumber of lives left: {self.hangman.lives}\n')
                # user plays
                letter = input('Input a letter: ').lower()
                if self.is_valid_letter(letter):
                    self.hangman.guess(letter)
                    # check winning condition
                    if self.hangman.is_saved():
                        print(hascii.figure['saved'])
                        print('\nYou survived!')
                        self.active = False
                    # check losing condition
                    elif self.hangman.is_hanged():
                        print(hascii.figure[1])
                        print('\nYou are hanged!')
                        print(f'The word was {self.hangman.word}')
                        self.active = False
                print()
            self.active = self.replay()
        print('\nThank you for playing!')
        print(hascii.logo)

    @staticmethod
    def is_valid_letter(c):
        """
        Check if character c is a single English lowercase letter
        :param c: a character
        :return True if character is valid, else False
        """
        if len(c) != 1:
            print('You should input a single letter')
            return False
        if c not in string.ascii_letters:
            print('You did not input a valid English letter')
            return False
        return True

    def replay(self):
        """
        Ask the user if they want to replay hangman.
        :return: True if affirmative, else False
        """
        while True:
            user_input = input('\nWould you like to [R]eplay or [Q]uit?: ')
            if user_input[0].lower() == 'r':
                self.hangman = Hangman(self.random_word())  # reset game
                return True
            elif user_input[0].lower() == 'q':
                return False
            else:
                print('Invalid input')