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'{guess[i].upper()}' ) 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'{guess[i].upper()}' ) target_count[guess[i]] -= 1 else: feedback[i] = f'{guess[i].upper()}' 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 "
".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, }