I am looking for as much criticism as possible. Specifically I am trying to institute BEST PRACTICES for OOP and game design. Enjoy!
Each Class is in a separate file and imported.
BASIC LETTERS CLASS
from enum import Enum
class Letters(Enum):
a = ('π°', 'A')
b = ('π±', 'B')
c = ('π²', 'C')
d = ('π³', 'D')
e = ('π΄', 'E')
f = ('π΅', 'F')
g = ('πΆ', 'G')
h = ('π·', 'H')
i = ('πΈ', 'I')
j = ('πΉ', 'J')
k = ('πΊ', 'K')
l = ('π»', 'L')
m = ('πΌ', 'M')
n = ('π½', 'N')
o = ('πΎ', 'O')
p = ('πΏ', 'P')
q = ('π
', 'Q')
r = ('π
', 'R')
s = ('π
', 'S')
t = ('π
', 'T')
u = ('π
', 'U')
v = ('π
', 'V')
w = ('π
', 'W')
x = ('π
', 'X')
y = ('π
', 'Y')
z = ('π
', 'Z')
@property
def unused(self):
return self.value[1]
@property
def dead(self):
return self.value[0]
GAME LETTERS CLASS
from Letters import Letters
class GameLetters():
def __init__(self):
pass
def populate_board_letters(self, guessed_letters):
for letter in Letters:
if letter.unused.lower() in guessed_letters:
self.board_letters.append(letter.dead)
else:
self.board_letters.append(letter.unused)
return self.board_letters
UI Class
from GameLetters import GameLetters
import random
class UI(GameLetters):
def __init__(self):
self.game_word = self.initialize_game_word()
self.current_letter = ''
self.board_letters = []
self.guessed_letters = []
self.wrong_guesses = 0
self.hangman_drawings = [(" _____\n| |\n|\n|\n|\n|\n__"),(" _____\n| |\n| O\n|\n|\n|\n__"),(" _____\n| |\n| O\n| |\n|\n|\n__"),
(" _____\n| |\n| O\n| /|\n|\n|\n__"),(" _____\n| |\n| O\n| /|\\\n|\n|\n__"),(" _____\n| |\n| O\n| /|\\\n| /\n|\n__"),(" _____\n| |\n| O\n| /|\\\n| / \\\n|\n__")]
def get_hangman_drawing(self, failed_attempts):
return self.hangman_drawings[failed_attempts]
def initialize_game_word(self):
game_words = []
with open('words.txt') as file:
for line in file:
game_words.append(line.rstrip('\r\n'))
word = random.choice(game_words)
return word
def display_game_word(self):
display_word = ''
for letter in self.game_word:
if str(letter) in self.guessed_letters:
display_word += f"{letter} "
elif str(letter).upper() in self.board_letters:
display_word += "_ "
else:
print("ERROR: That letter isnt found")
return display_word
def guess_letter(self):
while True:
letter = input("GUESS: ")
if len(letter) == 1:
break
print("Please Only Choose One Letter at a Time")
letter = letter.strip().lower()
self.guessed_letters.append(letter)
self.current_letter = (letter)
def compare_letter(self):
if self.current_letter in self.game_word:
print("This Letter was found")
if "_" in self.display_game_word():
return True
else:
print("You Won")
return False
else:
print("This letter was most definitely not in the word")
self.wrong_guesses += 1
return True
def display_game_state(self):
self.board_letters.clear()
self.board_letters = self.populate_board_letters(self.guessed_letters)
print(f"\n\n\n{self.get_hangman_drawing(self.wrong_guesses)}\n{self.populate_board_letters(self.guessed_letters)}\n{self.display_game_word()}")
Game LOGIC
from UI import UI
class Game:
def run(self):
self.game = UI()
keep_playing = True
while keep_playing:
self.game.display_game_state()
self.game.guess_letter()
keep_playing = self.game.compare_letter()
if self.game.wrong_guesses >= len(self.game.hangman_drawings):
print("Your man has Hanged. Please Try again!")
break
Execute File
from Game import Game
if __name__ == '__main__':
Game().run()
```