hangman: fix display never showing guessed letters + improve word-guess feedback
- _hangman_display compared uppercase word chars against lowercase guessed_letters set, so letters were never revealed after correct guesses - Word guess wrong path now shows the board and remaining guesses - Winner display now includes the guesser's name on correct word guess Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+19
-7
@@ -1226,8 +1226,8 @@ _HANGMAN_STAGES = [
|
||||
|
||||
def _hangman_display(game: dict) -> str:
|
||||
word = game["word"]
|
||||
guessed = game["guessed_letters"]
|
||||
return " ".join(c if c in guessed else "_" for c in word.upper())
|
||||
guessed = game["guessed_letters"] # stored lowercase
|
||||
return " ".join(c if c.lower() in guessed else "_" for c in word.upper())
|
||||
|
||||
|
||||
async def _generate_hangman_word() -> dict | None:
|
||||
@@ -1340,24 +1340,36 @@ async def cmd_guess(client: AsyncClient, room_id: str, sender: str, args: str):
|
||||
|
||||
# Full word guess
|
||||
if len(guess) > 1:
|
||||
winner = sender.split(":")[0].lstrip("@")
|
||||
if guess == word:
|
||||
del _HANGMAN_GAMES[room_id]
|
||||
plain = f"🎉 {sender.split(':')[0].lstrip('@')} got it! The word was: {word.upper()}"
|
||||
plain = f"🎉 {winner} got it! The word was: {word.upper()}"
|
||||
html = (
|
||||
f'<font color="#22c55e"><strong>🎉 Correct! The word was: {word.upper()}</strong></font><br>'
|
||||
f'Guessed by {sender.split(":")[0].lstrip("@")}!'
|
||||
f'<font color="#22c55e"><strong>🎉 {winner} got it! The word was: {word.upper()}</strong></font>'
|
||||
)
|
||||
await send_html(client, room_id, plain, html)
|
||||
else:
|
||||
game["wrong_count"] += 1
|
||||
display = _hangman_display(game)
|
||||
if game["wrong_count"] >= 6:
|
||||
del _HANGMAN_GAMES[room_id]
|
||||
plain = f"❌ Wrong! Game over — the word was: {word.upper()}"
|
||||
plain = f"❌ '{guess.upper()}' is wrong! Game over — the word was: {word.upper()}"
|
||||
html = f'<font color="#ef4444"><strong>❌ Wrong! Game over — the word was: {word.upper()}</strong></font>'
|
||||
await send_html(client, room_id, plain, html)
|
||||
else:
|
||||
remaining = 6 - game["wrong_count"]
|
||||
await send_text(client, room_id, f"❌ '{guess.upper()}' is wrong! {remaining} wrong guesses remaining.")
|
||||
plain = (
|
||||
f"❌ '{guess.upper()}' is wrong! {remaining} guesses remaining.\n"
|
||||
f"{_HANGMAN_STAGES[game['wrong_count']]}\n"
|
||||
f"Word: {display}\nHint: {game['hint']}"
|
||||
)
|
||||
html = (
|
||||
f'<font color="#ef4444"><strong>❌ \'{guess.upper()}\' is wrong!</strong></font> '
|
||||
f'{remaining} guesses remaining.<br>'
|
||||
f'<strong>Word:</strong> <code>{display}</code><br>'
|
||||
f'<strong>Hint:</strong> {game["hint"]}'
|
||||
)
|
||||
await send_html(client, room_id, plain, html)
|
||||
return
|
||||
|
||||
# Single letter guess
|
||||
|
||||
Reference in New Issue
Block a user