diff --git a/main.py b/main.py index e69de29..a3506d9 100644 --- a/main.py +++ b/main.py @@ -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() \ No newline at end of file