Spaces:
Running
Running
| import random | |
| from collections import Counter | |
| class WordleGame: | |
| # A more extensive word list with common 5-letter words | |
| WORD_LIST = [ | |
| "apple", | |
| "beach", | |
| "crane", | |
| "doubt", | |
| "eagle", | |
| "flame", | |
| "grape", | |
| "house", | |
| "igloo", | |
| "joker", | |
| "knife", | |
| "lemon", | |
| "mango", | |
| "night", | |
| "ocean", | |
| "piano", | |
| "queen", | |
| "river", | |
| "stone", | |
| "tiger", | |
| "vivid", | |
| "waste", | |
| "yacht", | |
| "zebra", | |
| "about", | |
| "above", | |
| "actor", | |
| "adapt", | |
| "admit", | |
| "adopt", | |
| "after", | |
| "again", | |
| "album", | |
| "alert", | |
| "alike", | |
| "alive", | |
| "allow", | |
| "alone", | |
| "along", | |
| "alter", | |
| "among", | |
| "anger", | |
| "angle", | |
| "angry", | |
| "ankle", | |
| "apart", | |
| "apple", | |
| "apply", | |
| "arena", | |
| "argue", | |
| "arise", | |
| "armor", | |
| "array", | |
| "arrow", | |
| "asset", | |
| "avoid", | |
| "award", | |
| "aware", | |
| "awful", | |
| "bacon", | |
| "badge", | |
| "badly", | |
| "basic", | |
| "basis", | |
| "beach", | |
| "beard", | |
| "beast", | |
| "begin", | |
| "being", | |
| "below", | |
| "bench", | |
| "birth", | |
| "black", | |
| "blade", | |
| "blame", | |
| "blank", | |
| "blast", | |
| "bleed", | |
| "blend", | |
| "bless", | |
| ] | |
| def __init__(self): | |
| """Initialize the game state.""" | |
| self.target_word = None | |
| self.guesses = [] | |
| self.feedbacks = [] | |
| self.game_over = True | |
| self.won = False | |
| self.max_attempts = 6 | |
| self.difficulty = "normal" # Can be "easy", "normal", or "hard" | |
| def new_game(self, difficulty="normal"): | |
| """Start a new game by resetting state and picking a random word.""" | |
| self.difficulty = difficulty | |
| self.target_word = random.choice(self.WORD_LIST) | |
| self.guesses = [] | |
| self.feedbacks = [] | |
| self.game_over = False | |
| self.won = False | |
| # Adjust max attempts based on difficulty | |
| if difficulty == "easy": | |
| self.max_attempts = 8 | |
| elif difficulty == "hard": | |
| self.max_attempts = 4 | |
| else: # normal | |
| self.max_attempts = 6 | |
| return f"New game started ({self.difficulty} mode). Guess a five-letter word. You have {self.max_attempts} attempts." | |
| def generate_feedback(self, guess): | |
| """Generate HTML feedback for a guess (green, yellow, gray).""" | |
| target_count = Counter(self.target_word) | |
| feedback = [""] * 5 | |
| # Mark correct letters in correct positions (green) | |
| for i in range(5): | |
| if guess[i] == self.target_word[i]: | |
| feedback[i] = ( | |
| f'<span style="color: green; font-weight: bold">{guess[i].upper()}</span>' | |
| ) | |
| target_count[guess[i]] -= 1 | |
| # Mark letters in wrong positions (yellow) or not in word (gray) | |
| for i in range(5): | |
| if feedback[i] == "": | |
| if guess[i] in target_count and target_count[guess[i]] > 0: | |
| feedback[i] = ( | |
| f'<span style="color: orange; font-weight: bold">{guess[i].upper()}</span>' | |
| ) | |
| target_count[guess[i]] -= 1 | |
| else: | |
| feedback[i] = f'<span style="color: gray">{guess[i].upper()}</span>' | |
| return "".join(feedback) | |
| def submit_guess(self, guess): | |
| """Process a player's guess and update game state.""" | |
| if self.game_over: | |
| return "Please start a new game." | |
| if len(guess) != 5: | |
| return "Please enter a five-letter word." | |
| guess = guess.lower() | |
| # Check if the guess is a valid word (optional validation) | |
| if self.difficulty == "hard" and guess not in self.WORD_LIST: | |
| return "Not in word list. Try again." | |
| feedback = self.generate_feedback(guess) | |
| self.guesses.append(guess) | |
| self.feedbacks.append(feedback) | |
| if guess == self.target_word: | |
| self.game_over = True | |
| self.won = True | |
| attempts = len(self.guesses) | |
| message = f"Congratulations! You guessed the word in {attempts}/{'attempt' if attempts == 1 else 'attempts'}." | |
| elif len(self.guesses) >= self.max_attempts: | |
| self.game_over = True | |
| message = f"Game over. The word was {self.target_word.upper()}." | |
| else: | |
| message = f"You have {self.max_attempts - len(self.guesses)} guesses left." | |
| # Give hints in easy mode | |
| if self.difficulty == "easy" and len(self.guesses) >= 3: | |
| # Find a letter position that hasn't been guessed correctly yet | |
| for i in range(5): | |
| if all(g[i] != self.target_word[i] for g in self.guesses): | |
| message += ( | |
| f" Hint: Letter {i + 1} is '{self.target_word[i].upper()}'." | |
| ) | |
| break | |
| return message | |
| def get_feedback_history(self): | |
| """Return the history of guesses and feedbacks as an HTML string.""" | |
| if not self.feedbacks: | |
| return "No guesses yet." | |
| history = [] | |
| for i, fb in enumerate(self.feedbacks): | |
| history.append(f"Guess {i + 1}/{self.max_attempts}: {fb}") | |
| return "<br>".join(history) | |
| def get_game_stats(self): | |
| """Return current game statistics.""" | |
| return { | |
| "target_word": self.target_word if self.game_over else "???", | |
| "guesses_made": len(self.guesses), | |
| "max_attempts": self.max_attempts, | |
| "won": self.won, | |
| "game_over": self.game_over, | |
| "difficulty": self.difficulty, | |
| } | |