Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 155 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import tkinter as tk
import string
from wonderwords import RandomWord

SNOWMAN_MIN_WORD_LENGTH = 5
SNOWMAN_MAX_WORD_LENGTH = 8
SNOWMAN_MAX_WRONG_GUESSES = 7

SNOWMAN_IMAGE = [
"* * * ",
" * _ * ",
" _[_]_ * ",
' * (") ',
" \\( : )/ *",
"* (_ : _) ",
"-----------",
]

# --- Game logic below is the reference implementation as given, unchanged ---

def build_letter_status_dict(snowman_word):
letter_status_dict = {}
for letter in snowman_word:
if letter.isalpha():
letter_status_dict[letter] = False
return letter_status_dict


def is_word_guessed(correct_letter_guess_statuses):
for guessed in correct_letter_guess_statuses.values():
if not guessed:
return False
return True


def generate_word_progress_string(snowman_word, correct_letter_guess_statuses):
output_letters = []
for elem in snowman_word:
if elem not in correct_letter_guess_statuses:
output_letters += elem
elif correct_letter_guess_statuses[elem]:
output_letters += elem
else:
output_letters += "_"
return " ".join(output_letters)


def add_wrong_letter(wrong_guesses_list, letter):
wrong_guesses_list.append(letter)
wrong_guesses_list.sort()


def build_snowman_graphic(wrong_guesses_count):
lines = []
for line_no in range(wrong_guesses_count):
lines.append(SNOWMAN_IMAGE[line_no])
return "\n".join(lines)


# --- GUI wrapper: same rules, event-driven instead of input()/print() ---

class SnowmanGUI:
def __init__(self, root):
self.root = root
self.root.title("Snowman")

self.random_word_generator = RandomWord()
self.snowman_word = self.random_word_generator.word(
word_min_length=SNOWMAN_MIN_WORD_LENGTH, word_max_length=SNOWMAN_MAX_WORD_LENGTH
)
self.correct_letter_guess_statuses = build_letter_status_dict(self.snowman_word)
self.wrong_guesses_list = []
self.letter_buttons = {}
self.game_over = False

self.word_label = tk.Label(root, font=("Courier", 24), text="")
self.word_label.pack(pady=10)

self.snowman_label = tk.Label(root, font=("Courier", 12), justify="left", text="")
self.snowman_label.pack(pady=10)

self.status_label = tk.Label(root, font=("Helvetica", 12), text="Guess a letter!")
self.status_label.pack(pady=5)

self.info_label = tk.Label(root, font=("Helvetica", 10), text="")
self.info_label.pack(pady=5)

keyboard = tk.Frame(root)
keyboard.pack(pady=10)
for i, letter in enumerate(string.ascii_lowercase):
button = tk.Button(
keyboard, text=letter.upper(), width=3,
command=lambda letter=letter: self.on_letter_guess(letter)
)
button.grid(row=i // 9, column=i % 9, padx=2, pady=2)
self.letter_buttons[letter] = button

tk.Button(root, text="New Game", command=self.new_game).pack(pady=10)

self.refresh_display()

def on_letter_guess(self, letter):
if self.game_over:
return

self.letter_buttons[letter].config(state="disabled")

if letter in self.correct_letter_guess_statuses:
self.correct_letter_guess_statuses[letter] = True
self.status_label.config(text=f"Correct! {letter.upper()} is in the word!")
else:
add_wrong_letter(self.wrong_guesses_list, letter)
self.status_label.config(text=f"Sorry! {letter.upper()} isn't in the word!")

if is_word_guessed(self.correct_letter_guess_statuses):
self.status_label.config(text=f"You win! The word was {self.snowman_word}.")
self.end_game()
elif len(self.wrong_guesses_list) == SNOWMAN_MAX_WRONG_GUESSES:
self.status_label.config(text=f"You lose! The word was {self.snowman_word}.")
self.end_game()

self.refresh_display()

def refresh_display(self):
self.word_label.config(
text=generate_word_progress_string(self.snowman_word, self.correct_letter_guess_statuses)
)
self.snowman_label.config(text=build_snowman_graphic(len(self.wrong_guesses_list)))

wrong_text = f"Wrong letters: {' '.join(self.wrong_guesses_list)}" if self.wrong_guesses_list else ""
remaining_text = f"Wrong guesses left: {SNOWMAN_MAX_WRONG_GUESSES - len(self.wrong_guesses_list)}"
self.info_label.config(text=f"{wrong_text} {remaining_text}")

def end_game(self):
self.game_over = True
for button in self.letter_buttons.values():
button.config(state="disabled")

def new_game(self):
self.snowman_word = self.random_word_generator.word(
word_min_length=SNOWMAN_MIN_WORD_LENGTH, word_max_length=SNOWMAN_MAX_WORD_LENGTH
)
self.correct_letter_guess_statuses = build_letter_status_dict(self.snowman_word)
self.wrong_guesses_list = []
self.game_over = False
self.status_label.config(text="Guess a letter!")
for button in self.letter_buttons.values():
button.config(state="normal")
self.refresh_display()


if __name__ == "__main__":
root = tk.Tk()
app = SnowmanGUI(root)
root.mainloop()