Introduction
As a Python neophyte, I implemented the Hangman game as a practice, which operates case-insensitively on the 26 English letters.
My biggest concern at the moment is my use of bytearray
to store the word, but I might have made other beginner mistakes as well. I'd like to locate them and improve accordingly.
Code
import itertools
class Hangman:
def __init__(self, target, guesses):
assert target.isascii() and target.isalpha()
self.target = bytearray(target.lower(), 'utf-8')
self.guesses = guesses
self.display = bytearray(itertools.repeat(ord('_'), len(target)))
def run(self):
while True:
print()
print()
print(''.join(chr(byte) for byte in self.display))
print()
print(f'Remaining guesses: {self.guesses}')
guess = input('Guess a letter: ')
if len(guess) != 1:
print('Invalid guess.')
continue
elif not guess.isascii() or not guess.isalpha():
print('Non-letter guessed.')
continue
guess = ord(guess)
if self.display.count(guess) != 0:
print('Already guessed this letter.')
continue
if self.target.count(guess) == 0:
self.guesses -= 1
else:
self.display = bytearray(
(
guess if target_c == guess else display_c
) for display_c, target_c in zip(self.display, self.target)
)
if self.display == self.target:
print()
print()
print(''.join(chr(byte) for byte in self.target))
print('You won.')
break
elif self.guesses == 0:
print()
print()
print(''.join(chr(byte) for byte in self.target))
print()
print('You lost.')
break
if __name__ == '__main__':
# Merriam-Webster Word of the Day: October 2, 2020
hangman = Hangman('pachyderm', 6)
hangman.run()
Example session
$ python hangman.py
_________
Remaining guesses: 6
Guess a letter: a
_a_______
Remaining guesses: 6
Guess a letter: e
_a____e__
Remaining guesses: 6
Guess a letter: i
_a____e__
Remaining guesses: 5
Guess a letter: o
_a____e__
Remaining guesses: 4
Guess a letter: u
_a____e__
Remaining guesses: 3
Guess a letter: r
_a____er_
Remaining guesses: 3
Guess a letter: y
_a__y_er_
Remaining guesses: 3
Guess a letter: c
_ac_y_er_
Remaining guesses: 3
Guess a letter: h
_achy_er_
Remaining guesses: 3
Guess a letter: p
pachy_er_
Remaining guesses: 3
Guess a letter: d
pachyder_
Remaining guesses: 3
Guess a letter: m
pachyderm
You won.