Beispiel #1
0
	def test_visible_word(self) -> None:
		"""Visible word contains guessed letters"""
		game = Hangman(wordlist=['ECHO LOCATION']).start()
		self.assertEqual(game.guess_letter('O'), 3)
		self.assertEqual(game.visible_word, '___O _O____O_')
		self.assertEqual(game.guess_word('ECHO LOCATION'), 9)
		self.assertEqual(game.guess_count, 2)
		self.assertTrue(game.won)
Beispiel #2
0
	def test_guesses(self) -> None:
		"""Guessing returns correct counts and history matches"""
		game = Hangman(wordlist=['KITTY CAT']).start()
		self.assertEqual(game.guess_letter('M'), 0)
		self.assertEqual(game.guess_letter('I'), 1)
		self.assertEqual(game.guess_letter('T'), 3)
		self.assertEqual(game.guess_word('KITTY CAT'), 4)
		self.assertEqual(
			[tuple(guess[1:]) for guess in game.guesses],
			[('M', 0), ('I', 1), ('T', 3), ('KITTY CAT', 4)]
		)
		self.assertEqual(game.guess_count, 4)
		self.assertTrue(game.won)
Beispiel #3
0
	def test_restart_state(self, _: unittest.mock.MagicMock) -> None:
		"""State is reset when restarting"""
		game = Hangman(wordlist=['ABC', 'DEF']).start()
		word = game.word
		self.assertEqual(game.guess_word(word), 3)
		self.assertIsInstance(game.ended, float)
		self.assertTrue(game.won)
		self.assertTrue(game.duration < 1)

		state = GameState(0.0, 0.0, GameStatus.WON, word, [Guess(0.0, word, 3)], game.max_lives)
		self.assertTupleEqual(game.state, state)
		game.start()

		self.assertNotEqual(game.word, word)
		self.assertEqual(game.guesses, [])
		self.assertFalse(game.won)
		self.assertTrue(game.duration < 1)
		self.assertEqual(game.rounds, [state])
Beispiel #4
0
	def test_gameover_protection(self) -> None:
		"""Actions are prevented when game is over"""
		game = Hangman(wordlist=['GAME OVER']).start()
		self.assertEqual(game.guess_word('GAME OVER'), 8)
		with self.assertRaises(HangmanOver):
			game.guess_letter('A')
Beispiel #5
0
	def test_win(self) -> None:
		"""Won state is set"""
		game = Hangman(wordlist=['ONE WORD']).start()
		self.assertEqual(game.guess_word('ONE WORD'), 7)
		self.assertEqual(game.guess_count, 1)
		self.assertTrue(game.won)
Beispiel #6
0
class HangmanGUI(Tk):
    def __init__(self, parent):
        Tk.__init__(self, parent)
        self.parent = parent

        self.initialise()
        self.prep_buttons()

    def prep_buttons(self):
        new_game = Button(self,
                          command=self.hangman.begin_new_game,
                          text='Restart')
        new_game.grid(column=2, row=5, sticky=W)

        guess_letter = Button(self,
                              command=lambda: self.guess(True),
                              text='Guess letter')
        guess_letter.grid(column=3, row=5, sticky=W)

        guess_button = Button(self,
                              command=lambda: self.guess(False),
                              text='Guess word')
        guess_button.grid(column=4, row=5, sticky=W)

    def initialise(self):
        self.hangman = Hangman(self)
        self.my_word = StringVar()
        self.my_word.set(
            "Word: " +
            self.hangman.word_of_underlines(len(self.hangman.word_to_guess)))

        self.tried_so_far = StringVar()
        self.tried_so_far.set('Letters tried so far: ')

        self.guesses_left = StringVar()
        self.update_no_of_guesses()

        self.geometry('{}x{}'.format(545, 400))

        self.grid()

        word = Label(self, textvariable=self.my_word)
        word.grid(column=1, row=7, sticky=W)

        tried = Label(self, textvariable=self.tried_so_far)
        tried.grid(column=1, row=8, sticky=W)

        no_guesses = Label(self, textvariable=self.guesses_left)
        no_guesses.grid(column=1, row=9, sticky=W)

        turtle_canvas = Canvas(self, width=300, height=450)
        self.th = TurtleHangman(turtle_canvas)
        turtle_canvas.grid(column=1, row=10, rowspan=8, columnspan=3)

        infotext = 'Hangman v1.0 by AML'
        info = Label(self, text=infotext)
        info.grid(column=4, row=12, columnspan=2)

    def update_my_word(self):
        self.my_word.set('Word: ' + self.hangman.my_word)

    def update_tried_so_far(self):
        self.tried_so_far.set('Letters tried so far: ' +
                              self.hangman.l_tried())

    def update_no_of_guesses(self):
        self.guesses_left.set('Guesses left: ' +
                              str(Hangman.max_number_of_guesses -
                                  self.hangman.number_of_guesses))

    def guess(self, guessing_letter):
        title = 'Guess a '
        if guessing_letter:
            title += 'letter'
        else:
            title += 'word'

        g_window = Tk()
        g_window.title(title)
        g_window.grid()

        entry = Entry(g_window)
        entry.grid(column=1, row=1)

        confirm = Button(g_window,
                         command=lambda: self.send_input(
                             guessing_letter, entry.get(), g_window),
                         text='Confirm')
        confirm.grid(column=1, row=3)

    def send_input(self, guessing_letter, user_guess, g_window):

        if user_guess.isalpha():
            if (guessing_letter and len(user_guess) > 1):
                tkMessageBox.showerror('Error', 'Please only guess a letter')
            else:
                if guessing_letter:
                    self.hangman.guess_letter(user_guess)
                else:
                    self.hangman.guess_word(user_guess)

                g_window.destroy()
        else:
            tkMessageBox.showerror('Error', 'Please make a valid guess')

    def award_win(self):
        tkMessageBox.showinfo('Winner!',
                              'You won. Click on Restart to play again')

    def notify_loser(self):
        tkMessageBox.showinfo(
            'Loser!', 'You lost. Word was *' + self.hangman.word_to_guess +
            '*. Click on Restart to play again')