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,
}