pyrdle first-pass
This commit is contained in:
commit
6d916622c6
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.DS_Store
|
||||||
|
.idea/
|
||||||
|
poetry.lock
|
91
README.md
Normal file
91
README.md
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# Python Wordle Game - Terminal Edition
|
||||||
|
|
||||||
|
A terminal-based implementation of Wordle using Python and ncurses.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Python 3.6+
|
||||||
|
- ncurses library
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
- `pyrdle.py` - Main game implementation
|
||||||
|
- `pyrdle_words_[level].txt` - Tiered dictionaries of valid 5-letter words
|
||||||
|
|
||||||
|
## How to Run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ poetry run python pyrdle.py --help (20361d14h4m)|*[main]
|
||||||
|
usage: pyrdle.py [-h] [--easy | --medium | --hard] [--common | --literary | --techy | --cultural | --full ]
|
||||||
|
[--wordlist FILE]
|
||||||
|
|
||||||
|
pyrdle Game - Guess the 5-letter word!
|
||||||
|
|
||||||
|
options:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
--easy Easy mode: common words only
|
||||||
|
--medium Medium mode: standard vocabulary
|
||||||
|
--hard Hard mode: includes obscure words
|
||||||
|
--common Common everyday words
|
||||||
|
--literary Literary and archaic terms
|
||||||
|
--techy Technical and scientific terms
|
||||||
|
--cultural Cultural and international terms
|
||||||
|
--full Full dictionary (all words)
|
||||||
|
--wordlist FILE Use custom word list file
|
||||||
|
|
||||||
|
Difficulty Levels:
|
||||||
|
--easy Common everyday words (default)
|
||||||
|
--medium Standard vocabulary including less common words
|
||||||
|
--hard Challenging words including archaic and technical terms
|
||||||
|
|
||||||
|
Word Categories:
|
||||||
|
--common Common English words (default)
|
||||||
|
--literary Literary and archaic terms
|
||||||
|
--techy Technical and scientific terms
|
||||||
|
--cultural Words from various cultures and languages
|
||||||
|
--full Complete dictionary with all words
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
python3 pyrdle.py --easy
|
||||||
|
python3 pyrdle.py --techy
|
||||||
|
python3 pyrdle.py --hard --literary
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## How to Play
|
||||||
|
|
||||||
|
1. The goal is to guess the secret 5-letter word within 6 attempts
|
||||||
|
2. Type your guess using the keyboard (A-Z letters)
|
||||||
|
3. Press Enter to submit your guess
|
||||||
|
4. After each guess, the color of the letters will change:
|
||||||
|
- **Green**: Letter is in the word and in the correct position
|
||||||
|
- **Yellow**: Letter is in the word but in the wrong position
|
||||||
|
- **Red**: Letter is NOT in the word (confirmed absent)
|
||||||
|
- **Gray/Dim**: Letter has not been used yet (shown on keyboard)
|
||||||
|
|
||||||
|
The keyboard at the bottom shows all letters with their current status,
|
||||||
|
making it easy to track which letters are still available for guessing.
|
||||||
|
|
||||||
|
## Controls
|
||||||
|
|
||||||
|
- **A-Z**: Type letters for your guess
|
||||||
|
- **Enter**: Submit your current guess
|
||||||
|
- **Backspace**: Delete the last letter
|
||||||
|
- **N**: Start a new game (when game is over)
|
||||||
|
- **Q** or **ESC**: Quit the game
|
||||||
|
- **Ctrl+C**: Force quit
|
||||||
|
|
||||||
|
## Adding More Words
|
||||||
|
|
||||||
|
To expand the word list, simply add more 5-letter words (one per line) to the appropriate file in the `wordlists` directory.
|
||||||
|
The game automatically filters for 5-letter words and converts them to uppercase.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
If colors don't display correctly:
|
||||||
|
- Ensure your terminal supports colors
|
||||||
|
- Try running with: `TERM=xterm-256color python3 wordle.py`
|
||||||
|
|
||||||
|
If the game doesn't fit your terminal:
|
||||||
|
- Resize your terminal window to at least 80x24 characters
|
||||||
|
- The game adapts to different terminal sizes but needs minimum space
|
16
pyproject.toml
Normal file
16
pyproject.toml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
[project]
|
||||||
|
name = "pyrdle"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = ""
|
||||||
|
authors = [
|
||||||
|
{name = "Gregory Gauthier",email = "gregory.gauthier@perspectum.com"}
|
||||||
|
]
|
||||||
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.12"
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
||||||
|
build-backend = "poetry.core.masonry.api"
|
428
pyrdle.py
Normal file
428
pyrdle.py
Normal file
@ -0,0 +1,428 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
pyrdle Game Implementation using ncurses
|
||||||
|
Supports multiple difficulty levels and word categories
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import curses
|
||||||
|
import random
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
from typing import List, Tuple
|
||||||
|
|
||||||
|
WORDLIST_DIR = "wordlists"
|
||||||
|
|
||||||
|
class pyrdleGame:
|
||||||
|
def __init__(self):
|
||||||
|
self.word_list = []
|
||||||
|
self.target_word = ""
|
||||||
|
self.guesses = []
|
||||||
|
self.current_guess = ""
|
||||||
|
self.game_over = False
|
||||||
|
self.won = False
|
||||||
|
self.max_guesses = 6
|
||||||
|
self.word_length = 5
|
||||||
|
|
||||||
|
# Color pairs for the display
|
||||||
|
self.COLOR_DEFAULT = 1
|
||||||
|
self.COLOR_CORRECT = 2 # Green - letter in correct position
|
||||||
|
self.COLOR_PRESENT = 3 # Yellow - letter in word but wrong position
|
||||||
|
self.COLOR_ABSENT = 4 # Red - letter not in word (confirmed absent)
|
||||||
|
self.COLOR_WHITE = 5
|
||||||
|
self.COLOR_UNUSED = 6 # Gray - letter not yet used
|
||||||
|
|
||||||
|
# Keyboard layout for visual keyboard
|
||||||
|
self.keyboard_rows = [
|
||||||
|
"QWERTYUIOP",
|
||||||
|
"ASDFGHJKL",
|
||||||
|
"ZXCVBNM"
|
||||||
|
]
|
||||||
|
self.letter_status = {} # Track letter status for keyboard coloring
|
||||||
|
|
||||||
|
def load_words(self, filename: str = f"pyrdle_words.txt") -> bool:
|
||||||
|
"""Load word list from file"""
|
||||||
|
filepath = os.path.join(WORDLIST_DIR, filename)
|
||||||
|
try:
|
||||||
|
# Check if file exists
|
||||||
|
if not os.path.exists(filepath):
|
||||||
|
# Try with .txt extension if not provided
|
||||||
|
if not filepath.endswith('.txt'):
|
||||||
|
filepath = filepath + '.txt'
|
||||||
|
if not os.path.exists(filepath):
|
||||||
|
return False
|
||||||
|
|
||||||
|
with open(filepath, 'r') as f:
|
||||||
|
self.word_list = [word.strip().upper() for word in f.readlines()
|
||||||
|
if len(word.strip()) == self.word_length]
|
||||||
|
if not self.word_list:
|
||||||
|
return False
|
||||||
|
self.target_word = random.choice(self.word_list)
|
||||||
|
return True
|
||||||
|
except FileNotFoundError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def is_valid_word(self, word: str) -> bool:
|
||||||
|
"""Check if word exists in word list"""
|
||||||
|
return word.upper() in self.word_list
|
||||||
|
|
||||||
|
def check_guess(self, guess: str) -> List[int]:
|
||||||
|
"""
|
||||||
|
Check guess against target word
|
||||||
|
Returns list of color codes for each letter
|
||||||
|
"""
|
||||||
|
guess = guess.upper()
|
||||||
|
target = self.target_word
|
||||||
|
result = [self.COLOR_ABSENT] * self.word_length # Start with red (not in word)
|
||||||
|
target_chars = list(target)
|
||||||
|
|
||||||
|
# First pass: mark correct positions
|
||||||
|
for i in range(self.word_length):
|
||||||
|
if guess[i] == target[i]:
|
||||||
|
result[i] = self.COLOR_CORRECT
|
||||||
|
target_chars[i] = None
|
||||||
|
self.letter_status[guess[i]] = self.COLOR_CORRECT
|
||||||
|
|
||||||
|
# Second pass: mark present but wrong position
|
||||||
|
for i in range(self.word_length):
|
||||||
|
if result[i] == self.COLOR_ABSENT and guess[i] in target_chars:
|
||||||
|
result[i] = self.COLOR_PRESENT
|
||||||
|
target_chars[target_chars.index(guess[i])] = None
|
||||||
|
if guess[i] not in self.letter_status or \
|
||||||
|
self.letter_status[guess[i]] != self.COLOR_CORRECT:
|
||||||
|
self.letter_status[guess[i]] = self.COLOR_PRESENT
|
||||||
|
elif result[i] == self.COLOR_ABSENT:
|
||||||
|
# Letter is definitely not in the word - mark as red
|
||||||
|
if guess[i] not in self.letter_status:
|
||||||
|
self.letter_status[guess[i]] = self.COLOR_ABSENT
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
def make_guess(self, guess: str) -> Tuple[bool, List[int]]:
|
||||||
|
"""
|
||||||
|
Process a guess
|
||||||
|
Returns (success, color_results)
|
||||||
|
"""
|
||||||
|
if len(guess) != self.word_length:
|
||||||
|
return False, []
|
||||||
|
|
||||||
|
if not self.is_valid_word(guess):
|
||||||
|
return False, []
|
||||||
|
|
||||||
|
colors = self.check_guess(guess)
|
||||||
|
self.guesses.append((guess.upper(), colors))
|
||||||
|
|
||||||
|
if guess.upper() == self.target_word:
|
||||||
|
self.game_over = True
|
||||||
|
self.won = True
|
||||||
|
elif len(self.guesses) >= self.max_guesses:
|
||||||
|
self.game_over = True
|
||||||
|
self.won = False
|
||||||
|
|
||||||
|
return True, colors
|
||||||
|
|
||||||
|
def draw_title(stdscr, y_offset: int, difficulty: str = ""):
|
||||||
|
"""Draw game title"""
|
||||||
|
title = "pyrdle"
|
||||||
|
if difficulty:
|
||||||
|
title += f" [{difficulty}]"
|
||||||
|
height, width = stdscr.getmaxyx()
|
||||||
|
x = (width - len(title)) // 2
|
||||||
|
stdscr.attron(curses.A_BOLD)
|
||||||
|
stdscr.addstr(y_offset, x, title)
|
||||||
|
stdscr.attroff(curses.A_BOLD)
|
||||||
|
|
||||||
|
def draw_board(stdscr, game: pyrdleGame, y_offset: int):
|
||||||
|
"""Draw the game board with all guesses"""
|
||||||
|
height, width = stdscr.getmaxyx()
|
||||||
|
board_x = (width - (game.word_length * 4 - 1)) // 2
|
||||||
|
|
||||||
|
for row in range(game.max_guesses):
|
||||||
|
y = y_offset + row * 2
|
||||||
|
|
||||||
|
if row < len(game.guesses):
|
||||||
|
# Draw completed guess
|
||||||
|
guess, colors = game.guesses[row]
|
||||||
|
for col, (letter, color) in enumerate(zip(guess, colors)):
|
||||||
|
x = board_x + col * 4
|
||||||
|
stdscr.attron(curses.color_pair(color))
|
||||||
|
stdscr.addstr(y, x, f"[{letter}]")
|
||||||
|
stdscr.attroff(curses.color_pair(color))
|
||||||
|
elif row == len(game.guesses) and not game.game_over:
|
||||||
|
# Draw current guess
|
||||||
|
for col in range(game.word_length):
|
||||||
|
x = board_x + col * 4
|
||||||
|
if col < len(game.current_guess):
|
||||||
|
letter = game.current_guess[col]
|
||||||
|
else:
|
||||||
|
letter = " "
|
||||||
|
stdscr.attron(curses.color_pair(game.COLOR_WHITE))
|
||||||
|
stdscr.addstr(y, x, f"[{letter}]")
|
||||||
|
stdscr.attroff(curses.color_pair(game.COLOR_WHITE))
|
||||||
|
else:
|
||||||
|
# Draw empty slots
|
||||||
|
for col in range(game.word_length):
|
||||||
|
x = board_x + col * 4
|
||||||
|
stdscr.addstr(y, x, "[ ]")
|
||||||
|
|
||||||
|
def draw_keyboard(stdscr, game: pyrdleGame, y_offset: int):
|
||||||
|
"""Draw visual keyboard showing letter status"""
|
||||||
|
height, width = stdscr.getmaxyx()
|
||||||
|
|
||||||
|
for row_idx, row in enumerate(game.keyboard_rows):
|
||||||
|
# Center each keyboard row
|
||||||
|
x = (width - (len(row) * 2 - 1)) // 2
|
||||||
|
y = y_offset + row_idx
|
||||||
|
|
||||||
|
# Add indentation for second and third rows
|
||||||
|
if row_idx == 1:
|
||||||
|
x += 1
|
||||||
|
elif row_idx == 2:
|
||||||
|
x += 3
|
||||||
|
|
||||||
|
for letter in row:
|
||||||
|
# Get color based on letter status
|
||||||
|
if letter in game.letter_status:
|
||||||
|
color = game.letter_status[letter]
|
||||||
|
else:
|
||||||
|
# Letter not yet used - show in gray/dim
|
||||||
|
color = game.COLOR_UNUSED
|
||||||
|
|
||||||
|
# Apply dim attribute for unused letters
|
||||||
|
if color == game.COLOR_UNUSED:
|
||||||
|
stdscr.attron(curses.A_DIM)
|
||||||
|
stdscr.addstr(y, x, letter)
|
||||||
|
stdscr.attroff(curses.A_DIM)
|
||||||
|
else:
|
||||||
|
stdscr.attron(curses.color_pair(color))
|
||||||
|
stdscr.addstr(y, x, letter)
|
||||||
|
stdscr.attroff(curses.color_pair(color))
|
||||||
|
x += 2
|
||||||
|
|
||||||
|
def draw_message(stdscr, message: str, y_offset: int, color_pair: int = 1):
|
||||||
|
"""Draw centered message"""
|
||||||
|
height, width = stdscr.getmaxyx()
|
||||||
|
x = (width - len(message)) // 2
|
||||||
|
stdscr.attron(curses.color_pair(color_pair))
|
||||||
|
stdscr.addstr(y_offset, x, message)
|
||||||
|
stdscr.attroff(curses.color_pair(color_pair))
|
||||||
|
|
||||||
|
def draw_instructions(stdscr, y_offset: int):
|
||||||
|
"""Draw game instructions"""
|
||||||
|
instructions = [
|
||||||
|
"Guess the 5-letter word in 6 tries!",
|
||||||
|
"",
|
||||||
|
"Colors: GREEN=Correct, YELLOW=Wrong position, RED=Not in word",
|
||||||
|
"",
|
||||||
|
"Type letters: A-Z",
|
||||||
|
"Enter: Submit guess",
|
||||||
|
"Backspace: Delete letter",
|
||||||
|
"Ctrl+C: Quit game"
|
||||||
|
]
|
||||||
|
|
||||||
|
height, width = stdscr.getmaxyx()
|
||||||
|
for i, line in enumerate(instructions):
|
||||||
|
if y_offset + i < height - 1:
|
||||||
|
x = (width - len(line)) // 2
|
||||||
|
stdscr.addstr(y_offset + i, x, line)
|
||||||
|
|
||||||
|
def parse_arguments():
|
||||||
|
"""Parse command line arguments for difficulty/category selection"""
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description='pyrdle Game - Guess the 5-letter word!',
|
||||||
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||||
|
epilog="""
|
||||||
|
Difficulty Levels:
|
||||||
|
--easy Common everyday words (default)
|
||||||
|
--medium Standard vocabulary including less common words
|
||||||
|
--hard Challenging words including archaic and technical terms
|
||||||
|
|
||||||
|
Word Categories:
|
||||||
|
--common Common English words (default)
|
||||||
|
--literary Literary and archaic terms
|
||||||
|
--techy Technical and scientific terms
|
||||||
|
--cultural Words from various cultures and languages
|
||||||
|
--full Complete dictionary with all words
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
python3 pyrdle.py --easy
|
||||||
|
python3 pyrdle.py --techy
|
||||||
|
python3 pyrdle.py --hard --literary
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
# Difficulty levels (mutually exclusive)
|
||||||
|
difficulty = parser.add_mutually_exclusive_group()
|
||||||
|
difficulty.add_argument('--easy', action='store_true',
|
||||||
|
help='Easy mode: common words only')
|
||||||
|
difficulty.add_argument('--medium', action='store_true',
|
||||||
|
help='Medium mode: standard vocabulary')
|
||||||
|
difficulty.add_argument('--hard', action='store_true',
|
||||||
|
help='Hard mode: includes obscure words')
|
||||||
|
|
||||||
|
# Word categories (mutually exclusive)
|
||||||
|
category = parser.add_mutually_exclusive_group()
|
||||||
|
category.add_argument('--common', action='store_true',
|
||||||
|
help='Common everyday words')
|
||||||
|
category.add_argument('--literary', action='store_true',
|
||||||
|
help='Literary and archaic terms')
|
||||||
|
category.add_argument('--techy', action='store_true',
|
||||||
|
help='Technical and scientific terms')
|
||||||
|
category.add_argument('--cultural', action='store_true',
|
||||||
|
help='Cultural and international terms')
|
||||||
|
category.add_argument('--full', action='store_true',
|
||||||
|
help='Full dictionary (all words)')
|
||||||
|
|
||||||
|
# Custom word list
|
||||||
|
parser.add_argument('--wordlist', type=str, metavar='FILE',
|
||||||
|
help='Use custom word list file')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Determine which word list to use
|
||||||
|
if args.wordlist:
|
||||||
|
return args.wordlist, "CUSTOM"
|
||||||
|
|
||||||
|
# Map arguments to word list files
|
||||||
|
if args.techy:
|
||||||
|
return "pyrdle_words_techy.txt", "TECHNICAL"
|
||||||
|
elif args.literary:
|
||||||
|
return "pyrdle_words_literary.txt", "LITERARY"
|
||||||
|
elif args.cultural:
|
||||||
|
return "pyrdle_words_cultural.txt", "CULTURAL"
|
||||||
|
elif args.full:
|
||||||
|
return "pyrdle_words_full.txt", "FULL"
|
||||||
|
elif args.hard:
|
||||||
|
return "pyrdle_words_hard.txt", "HARD"
|
||||||
|
elif args.medium:
|
||||||
|
return "pyrdle_words_medium.txt", "MEDIUM"
|
||||||
|
else: # Default to easy/common
|
||||||
|
return "pyrdle_words_easy.txt", "EASY"
|
||||||
|
|
||||||
|
def main(stdscr):
|
||||||
|
"""Main game loop"""
|
||||||
|
# Parse command line arguments
|
||||||
|
word_file, difficulty_name = parse_arguments()
|
||||||
|
|
||||||
|
# Initialize curses
|
||||||
|
curses.curs_set(0) # Hide cursor
|
||||||
|
stdscr.clear()
|
||||||
|
|
||||||
|
# Initialize colors
|
||||||
|
curses.start_color()
|
||||||
|
curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLACK) # Default
|
||||||
|
curses.init_pair(2, curses.COLOR_BLACK, curses.COLOR_GREEN) # Correct position
|
||||||
|
curses.init_pair(3, curses.COLOR_BLACK, curses.COLOR_YELLOW) # Wrong position
|
||||||
|
curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_RED) # Not in word (confirmed absent)
|
||||||
|
curses.init_pair(5, curses.COLOR_WHITE, curses.COLOR_BLACK) # Current input
|
||||||
|
curses.init_pair(6, curses.COLOR_WHITE, curses.COLOR_BLACK) # Unused letters (gray/dim)
|
||||||
|
|
||||||
|
# Initialize game
|
||||||
|
game = pyrdleGame()
|
||||||
|
if not game.load_words(word_file):
|
||||||
|
# Try fallback to default word list
|
||||||
|
if word_file != "pyrdle_words.txt" and game.load_words("pyrdle_words.txt"):
|
||||||
|
difficulty_name = "DEFAULT"
|
||||||
|
else:
|
||||||
|
stdscr.addstr(0, 0, f"Error: Could not load word list from {word_file}")
|
||||||
|
stdscr.addstr(1, 0, "Press any key to exit...")
|
||||||
|
stdscr.getch()
|
||||||
|
return
|
||||||
|
|
||||||
|
message = ""
|
||||||
|
message_color = 1
|
||||||
|
|
||||||
|
while True:
|
||||||
|
stdscr.clear()
|
||||||
|
height, width = stdscr.getmaxyx()
|
||||||
|
|
||||||
|
# Calculate vertical positions
|
||||||
|
y_pos = 1
|
||||||
|
|
||||||
|
# Draw components
|
||||||
|
draw_title(stdscr, y_pos, difficulty_name)
|
||||||
|
y_pos += 2
|
||||||
|
|
||||||
|
draw_board(stdscr, game, y_pos)
|
||||||
|
y_pos += game.max_guesses * 2 + 1
|
||||||
|
|
||||||
|
draw_keyboard(stdscr, game, y_pos)
|
||||||
|
y_pos += 4
|
||||||
|
|
||||||
|
# Draw message if exists
|
||||||
|
if message:
|
||||||
|
draw_message(stdscr, message, y_pos, message_color)
|
||||||
|
y_pos += 2
|
||||||
|
|
||||||
|
# Draw instructions at bottom
|
||||||
|
if y_pos + 6 < height:
|
||||||
|
draw_instructions(stdscr, y_pos)
|
||||||
|
|
||||||
|
# Show game over message
|
||||||
|
if game.game_over:
|
||||||
|
y_pos = height - 3 if height > 20 else y_pos
|
||||||
|
if game.won:
|
||||||
|
win_message = f"Congratulations! You won in {len(game.guesses)} guesses!"
|
||||||
|
draw_message(stdscr, win_message, y_pos, 2)
|
||||||
|
else:
|
||||||
|
lose_message = f"Game Over! The word was: {game.target_word}"
|
||||||
|
draw_message(stdscr, lose_message, y_pos, 4)
|
||||||
|
|
||||||
|
draw_message(stdscr, "Press 'N' for new game or 'Q' to quit", y_pos + 1, 1)
|
||||||
|
|
||||||
|
stdscr.refresh()
|
||||||
|
key = stdscr.getch()
|
||||||
|
if key in [ord('n'), ord('N')]:
|
||||||
|
# Start new game
|
||||||
|
game = pyrdleGame()
|
||||||
|
game.load_words(word_file)
|
||||||
|
message = ""
|
||||||
|
continue
|
||||||
|
elif key in [ord('q'), ord('Q'), 27]: # 27 is ESC
|
||||||
|
break
|
||||||
|
continue
|
||||||
|
|
||||||
|
stdscr.refresh()
|
||||||
|
|
||||||
|
# Get input
|
||||||
|
key = stdscr.getch()
|
||||||
|
|
||||||
|
# Handle input
|
||||||
|
if key == 27: # ESC key
|
||||||
|
break
|
||||||
|
elif key == ord('\n'): # Enter key
|
||||||
|
if len(game.current_guess) == game.word_length:
|
||||||
|
success, _ = game.make_guess(game.current_guess)
|
||||||
|
if success:
|
||||||
|
game.current_guess = ""
|
||||||
|
message = ""
|
||||||
|
else:
|
||||||
|
message = "Not in word list!"
|
||||||
|
message_color = 4
|
||||||
|
else:
|
||||||
|
message = f"Word must be {game.word_length} letters!"
|
||||||
|
message_color = 4
|
||||||
|
elif key == curses.KEY_BACKSPACE or key == 127: # Backspace
|
||||||
|
if game.current_guess:
|
||||||
|
game.current_guess = game.current_guess[:-1]
|
||||||
|
message = ""
|
||||||
|
elif ord('a') <= key <= ord('z'): # Lowercase letter
|
||||||
|
if len(game.current_guess) < game.word_length:
|
||||||
|
game.current_guess += chr(key).upper()
|
||||||
|
message = ""
|
||||||
|
elif ord('A') <= key <= ord('Z'): # Uppercase letter
|
||||||
|
if len(game.current_guess) < game.word_length:
|
||||||
|
game.current_guess += chr(key)
|
||||||
|
message = ""
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Handle help before initializing curses
|
||||||
|
if "--help" in sys.argv or "-h" in sys.argv:
|
||||||
|
# Parse arguments just to show help
|
||||||
|
word_file, difficulty = parse_arguments()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
try:
|
||||||
|
curses.wrapper(main)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
sys.exit(0)
|
2771
wordlists/pyrdle_words.txt
Normal file
2771
wordlists/pyrdle_words.txt
Normal file
File diff suppressed because it is too large
Load Diff
247
wordlists/pyrdle_words_cultural.txt
Normal file
247
wordlists/pyrdle_words_cultural.txt
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
ADOBE
|
||||||
|
ALOHA
|
||||||
|
ALTAR
|
||||||
|
AMIGO
|
||||||
|
AMISH
|
||||||
|
AORTA
|
||||||
|
ATOLL
|
||||||
|
BABEL
|
||||||
|
BAGEL
|
||||||
|
BAYOU
|
||||||
|
BIMBO
|
||||||
|
BINGO
|
||||||
|
BIOME
|
||||||
|
BISON
|
||||||
|
BLITZ
|
||||||
|
BONGO
|
||||||
|
BORAX
|
||||||
|
BRAVO
|
||||||
|
BREWS
|
||||||
|
BRIGS
|
||||||
|
BRINY
|
||||||
|
BUDGE
|
||||||
|
BUGLE
|
||||||
|
BULKS
|
||||||
|
BUNKS
|
||||||
|
BURRO
|
||||||
|
CACTI
|
||||||
|
CALMS
|
||||||
|
CALYX
|
||||||
|
CAMEL
|
||||||
|
CAMEO
|
||||||
|
CANAL
|
||||||
|
CANDY
|
||||||
|
CANOE
|
||||||
|
CANON
|
||||||
|
CANTO
|
||||||
|
CAPED
|
||||||
|
CAPER
|
||||||
|
CAPON
|
||||||
|
CARNY
|
||||||
|
CAROL
|
||||||
|
CARPS
|
||||||
|
CASTE
|
||||||
|
CAULK
|
||||||
|
CAVED
|
||||||
|
CAVER
|
||||||
|
CAVES
|
||||||
|
CAVIL
|
||||||
|
CEASE
|
||||||
|
CEDAR
|
||||||
|
CEDED
|
||||||
|
CELEB
|
||||||
|
CELLO
|
||||||
|
CENTS
|
||||||
|
CHAFE
|
||||||
|
CHAFF
|
||||||
|
CHAMP
|
||||||
|
CHANT
|
||||||
|
CHAOS
|
||||||
|
CHAPS
|
||||||
|
CHARD
|
||||||
|
CHARM
|
||||||
|
CHARS
|
||||||
|
CHARY
|
||||||
|
CHASM
|
||||||
|
CHATS
|
||||||
|
CHEAP
|
||||||
|
CHEAT
|
||||||
|
CHECK
|
||||||
|
CHEEK
|
||||||
|
CHEEP
|
||||||
|
CHEER
|
||||||
|
CHESS
|
||||||
|
CHEST
|
||||||
|
CHEWY
|
||||||
|
CHICK
|
||||||
|
CHIDE
|
||||||
|
CHIEF
|
||||||
|
CHILD
|
||||||
|
CHILE
|
||||||
|
CHILI
|
||||||
|
CHILL
|
||||||
|
CHIME
|
||||||
|
CHIMP
|
||||||
|
CHINA
|
||||||
|
CHINK
|
||||||
|
CHINO
|
||||||
|
CHIPS
|
||||||
|
CHIRP
|
||||||
|
CHIVE
|
||||||
|
CHOCK
|
||||||
|
CHOIR
|
||||||
|
CHOKE
|
||||||
|
CHOMP
|
||||||
|
CHOPS
|
||||||
|
CHORD
|
||||||
|
CHORE
|
||||||
|
CHOSE
|
||||||
|
CHOWS
|
||||||
|
CHUCK
|
||||||
|
CHUMP
|
||||||
|
CHUNK
|
||||||
|
CHURN
|
||||||
|
CHUTE
|
||||||
|
CIDER
|
||||||
|
CIGAR
|
||||||
|
CINCH
|
||||||
|
CIRCA
|
||||||
|
CISCO
|
||||||
|
CITED
|
||||||
|
CITES
|
||||||
|
CIVET
|
||||||
|
CIVIC
|
||||||
|
CIVIL
|
||||||
|
CLACK
|
||||||
|
CLAIM
|
||||||
|
CLAMP
|
||||||
|
CLAMS
|
||||||
|
CLANG
|
||||||
|
CLANK
|
||||||
|
CLAPS
|
||||||
|
CLASH
|
||||||
|
CLASP
|
||||||
|
CLASS
|
||||||
|
CLAWS
|
||||||
|
CLAYS
|
||||||
|
CLEAN
|
||||||
|
CLEAR
|
||||||
|
CLEAT
|
||||||
|
CLEFT
|
||||||
|
CLERK
|
||||||
|
CLICK
|
||||||
|
CLIFF
|
||||||
|
CLIMB
|
||||||
|
CLIME
|
||||||
|
CLING
|
||||||
|
CLINK
|
||||||
|
CLOAK
|
||||||
|
CLOCK
|
||||||
|
CLONE
|
||||||
|
CLOPS
|
||||||
|
CLOSE
|
||||||
|
CLOTH
|
||||||
|
CLOTS
|
||||||
|
CLOUD
|
||||||
|
CLOUT
|
||||||
|
CLOVE
|
||||||
|
CLOWN
|
||||||
|
CLUBS
|
||||||
|
CLUCK
|
||||||
|
CLUED
|
||||||
|
CLUES
|
||||||
|
CLUMP
|
||||||
|
CLUNG
|
||||||
|
CLUNK
|
||||||
|
COACH
|
||||||
|
COALS
|
||||||
|
COAST
|
||||||
|
COATS
|
||||||
|
COBRA
|
||||||
|
COCKY
|
||||||
|
COCOA
|
||||||
|
CODED
|
||||||
|
CODER
|
||||||
|
CODES
|
||||||
|
CODEX
|
||||||
|
CODON
|
||||||
|
COEDS
|
||||||
|
COILS
|
||||||
|
COINS
|
||||||
|
COKES
|
||||||
|
COLDS
|
||||||
|
COLON
|
||||||
|
COLOR
|
||||||
|
COLTS
|
||||||
|
COMBO
|
||||||
|
COMBS
|
||||||
|
COMER
|
||||||
|
COMES
|
||||||
|
COMET
|
||||||
|
COMFY
|
||||||
|
COMIC
|
||||||
|
COMMA
|
||||||
|
CONCH
|
||||||
|
CONDO
|
||||||
|
CONED
|
||||||
|
CONES
|
||||||
|
CONEY
|
||||||
|
CONGA
|
||||||
|
CONGO
|
||||||
|
CONKS
|
||||||
|
COOED
|
||||||
|
COOKS
|
||||||
|
COOLS
|
||||||
|
COOPS
|
||||||
|
COOPT
|
||||||
|
COPED
|
||||||
|
COPER
|
||||||
|
COPES
|
||||||
|
COPSE
|
||||||
|
CORAL
|
||||||
|
CORDS
|
||||||
|
CORED
|
||||||
|
CORER
|
||||||
|
CORES
|
||||||
|
CORGI
|
||||||
|
CORKS
|
||||||
|
CORKY
|
||||||
|
CORNY
|
||||||
|
CORPS
|
||||||
|
COSTS
|
||||||
|
COUCH
|
||||||
|
COUGH
|
||||||
|
COULD
|
||||||
|
COUPE
|
||||||
|
COUPS
|
||||||
|
COURT
|
||||||
|
COUTH
|
||||||
|
COVEN
|
||||||
|
COVER
|
||||||
|
COVES
|
||||||
|
COVET
|
||||||
|
COWED
|
||||||
|
COWER
|
||||||
|
COYLY
|
||||||
|
COZEN
|
||||||
|
CRABS
|
||||||
|
CRACK
|
||||||
|
CRAFT
|
||||||
|
CRAGS
|
||||||
|
DHOTI
|
||||||
|
DINGO
|
||||||
|
DIRGE
|
||||||
|
DODOS
|
||||||
|
DOGMA
|
||||||
|
DOILY
|
||||||
|
DONNA
|
||||||
|
DONOR
|
||||||
|
DONUT
|
||||||
|
DOOMS
|
||||||
|
DOOZY
|
||||||
|
DOPED
|
||||||
|
DOPER
|
||||||
|
DOPES
|
||||||
|
DOPEY
|
||||||
|
DORKS
|
||||||
|
DORKY
|
1024
wordlists/pyrdle_words_easy.txt
Normal file
1024
wordlists/pyrdle_words_easy.txt
Normal file
File diff suppressed because it is too large
Load Diff
2781
wordlists/pyrdle_words_full.txt
Normal file
2781
wordlists/pyrdle_words_full.txt
Normal file
File diff suppressed because it is too large
Load Diff
227
wordlists/pyrdle_words_literary.txt
Normal file
227
wordlists/pyrdle_words_literary.txt
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
ADAGE
|
||||||
|
AGLOW
|
||||||
|
ALOFT
|
||||||
|
APACE
|
||||||
|
ARDOR
|
||||||
|
ASKEW
|
||||||
|
ASPEN
|
||||||
|
ATONE
|
||||||
|
AUGUR
|
||||||
|
AVIAN
|
||||||
|
AVION
|
||||||
|
AWASH
|
||||||
|
BALMY
|
||||||
|
BEGOT
|
||||||
|
BELIE
|
||||||
|
BERTH
|
||||||
|
BESET
|
||||||
|
BESOT
|
||||||
|
BIDED
|
||||||
|
BILGE
|
||||||
|
BOWER
|
||||||
|
BRACE
|
||||||
|
BRIAR
|
||||||
|
BRINE
|
||||||
|
BRINY
|
||||||
|
CAIRN
|
||||||
|
CHIDE
|
||||||
|
CLEFT
|
||||||
|
COUTH
|
||||||
|
CRAVE
|
||||||
|
CREST
|
||||||
|
DALLY
|
||||||
|
DEWED
|
||||||
|
DIRGE
|
||||||
|
DOTED
|
||||||
|
DOWER
|
||||||
|
DREAR
|
||||||
|
DUSKY
|
||||||
|
DWELT
|
||||||
|
EAVES
|
||||||
|
EBBED
|
||||||
|
EDIFY
|
||||||
|
ELEGY
|
||||||
|
EMBER
|
||||||
|
ENSUE
|
||||||
|
EPOCH
|
||||||
|
ERRED
|
||||||
|
ESTOP
|
||||||
|
ETUDE
|
||||||
|
EVADE
|
||||||
|
EXALT
|
||||||
|
EXULT
|
||||||
|
FABLE
|
||||||
|
FEIGN
|
||||||
|
FEINT
|
||||||
|
FERAL
|
||||||
|
FETID
|
||||||
|
FJORD
|
||||||
|
FLESH
|
||||||
|
FLORA
|
||||||
|
FOLLY
|
||||||
|
FORGE
|
||||||
|
FORTE
|
||||||
|
FOUNT
|
||||||
|
FRIAR
|
||||||
|
FROST
|
||||||
|
FROTH
|
||||||
|
GABLE
|
||||||
|
GAILY
|
||||||
|
GAVEL
|
||||||
|
GLADE
|
||||||
|
GLEAN
|
||||||
|
GLOAM
|
||||||
|
GNARL
|
||||||
|
GNASH
|
||||||
|
GNOME
|
||||||
|
GORGE
|
||||||
|
GOUGE
|
||||||
|
GRAVE
|
||||||
|
GREBE
|
||||||
|
GRIEF
|
||||||
|
GRIFT
|
||||||
|
GRIME
|
||||||
|
GROVE
|
||||||
|
GUILD
|
||||||
|
GUILE
|
||||||
|
GULCH
|
||||||
|
GULLY
|
||||||
|
GUSTS
|
||||||
|
GUSTY
|
||||||
|
HAPLY
|
||||||
|
HARDY
|
||||||
|
HASTE
|
||||||
|
HAUNT
|
||||||
|
HAVEN
|
||||||
|
HEADY
|
||||||
|
HEATH
|
||||||
|
HEDGE
|
||||||
|
HEIGH
|
||||||
|
HENCE
|
||||||
|
HERON
|
||||||
|
HOARD
|
||||||
|
HOARY
|
||||||
|
HOIST
|
||||||
|
HOLLY
|
||||||
|
HORDE
|
||||||
|
HOUND
|
||||||
|
HOVEL
|
||||||
|
HOVER
|
||||||
|
IDYLL
|
||||||
|
INANE
|
||||||
|
INLET
|
||||||
|
LEDGE
|
||||||
|
LOFTY
|
||||||
|
MELEE
|
||||||
|
OCEAN
|
||||||
|
ONSET
|
||||||
|
OUGHT
|
||||||
|
PERCH
|
||||||
|
PIOUS
|
||||||
|
PLAIN
|
||||||
|
PLUMB
|
||||||
|
PRIDE
|
||||||
|
PRIME
|
||||||
|
PRIVY
|
||||||
|
PROUD
|
||||||
|
PROVE
|
||||||
|
PSALM
|
||||||
|
QUEST
|
||||||
|
QUEUE
|
||||||
|
QUITE
|
||||||
|
RAPID
|
||||||
|
REALM
|
||||||
|
REBEL
|
||||||
|
REIGN
|
||||||
|
RIDGE
|
||||||
|
RIVAL
|
||||||
|
ROOST
|
||||||
|
ROUGE
|
||||||
|
ROUTE
|
||||||
|
ROVER
|
||||||
|
RUDDY
|
||||||
|
RUMOR
|
||||||
|
SALLY
|
||||||
|
SCALE
|
||||||
|
SCORN
|
||||||
|
SEVER
|
||||||
|
SHADE
|
||||||
|
SHARD
|
||||||
|
SHAWL
|
||||||
|
SHEAR
|
||||||
|
SHEEN
|
||||||
|
SHIED
|
||||||
|
SHIRE
|
||||||
|
SHONE
|
||||||
|
SHORN
|
||||||
|
SHOVE
|
||||||
|
SHOWN
|
||||||
|
SHREW
|
||||||
|
SHRUB
|
||||||
|
SHUCK
|
||||||
|
SHUNT
|
||||||
|
SIEGE
|
||||||
|
SINEW
|
||||||
|
SINGE
|
||||||
|
SIREN
|
||||||
|
SLATE
|
||||||
|
SLEEK
|
||||||
|
SLEET
|
||||||
|
SLICK
|
||||||
|
SLIME
|
||||||
|
SLIMY
|
||||||
|
SLING
|
||||||
|
SLOSH
|
||||||
|
SLOTH
|
||||||
|
SMALL
|
||||||
|
SMEAR
|
||||||
|
SMELT
|
||||||
|
SMILE
|
||||||
|
SMIRK
|
||||||
|
SMITE
|
||||||
|
SMITH
|
||||||
|
SMOKE
|
||||||
|
SNARE
|
||||||
|
SNARL
|
||||||
|
SNEER
|
||||||
|
SNIDE
|
||||||
|
SNIFF
|
||||||
|
SNORE
|
||||||
|
SNORT
|
||||||
|
SNOUT
|
||||||
|
SNOWY
|
||||||
|
SOBER
|
||||||
|
SOGGY
|
||||||
|
SOLAR
|
||||||
|
SOLVE
|
||||||
|
SONAR
|
||||||
|
SONIC
|
||||||
|
SOOTH
|
||||||
|
SOOTY
|
||||||
|
SORRY
|
||||||
|
SOUND
|
||||||
|
SOUTH
|
||||||
|
SPACE
|
||||||
|
SPADE
|
||||||
|
SPARE
|
||||||
|
SPARK
|
||||||
|
SPAWN
|
||||||
|
SPEAK
|
||||||
|
SPEAR
|
||||||
|
SPECK
|
||||||
|
SPEED
|
||||||
|
SPELL
|
||||||
|
SPELT
|
||||||
|
SPEND
|
||||||
|
SPENT
|
||||||
|
SPIED
|
||||||
|
SPIEL
|
||||||
|
SPIKE
|
||||||
|
SPIKY
|
||||||
|
SPILL
|
||||||
|
SPINE
|
||||||
|
SPINY
|
||||||
|
SPIRE
|
||||||
|
SPITE
|
||||||
|
SPLAT
|
||||||
|
SPLIT
|
1367
wordlists/pyrdle_words_medium.txt
Normal file
1367
wordlists/pyrdle_words_medium.txt
Normal file
File diff suppressed because it is too large
Load Diff
337
wordlists/pyrdle_words_techy.txt
Normal file
337
wordlists/pyrdle_words_techy.txt
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
ALLOY
|
||||||
|
ALPHA
|
||||||
|
AMINO
|
||||||
|
ARRAY
|
||||||
|
ASSAY
|
||||||
|
AUDIO
|
||||||
|
AXIAL
|
||||||
|
AXIOM
|
||||||
|
AZURE
|
||||||
|
BATCH
|
||||||
|
BATON
|
||||||
|
BIOME
|
||||||
|
BIPED
|
||||||
|
CACHE
|
||||||
|
CALYX
|
||||||
|
CARET
|
||||||
|
CASES
|
||||||
|
CASTS
|
||||||
|
CELLS
|
||||||
|
CHIPS
|
||||||
|
CHORD
|
||||||
|
CHUNK
|
||||||
|
CIRCA
|
||||||
|
CITED
|
||||||
|
CLAMP
|
||||||
|
CLONE
|
||||||
|
CLOUD
|
||||||
|
CODON
|
||||||
|
COILS
|
||||||
|
COMET
|
||||||
|
CORAL
|
||||||
|
CORES
|
||||||
|
CRAMP
|
||||||
|
CRANK
|
||||||
|
CREST
|
||||||
|
CRUST
|
||||||
|
CRYPT
|
||||||
|
CUBIC
|
||||||
|
CUBIT
|
||||||
|
CURVE
|
||||||
|
CYCAD
|
||||||
|
CYCLE
|
||||||
|
CYNIC
|
||||||
|
CYSTS
|
||||||
|
DATUM
|
||||||
|
DEBUG
|
||||||
|
DECAF
|
||||||
|
DECAL
|
||||||
|
DECAY
|
||||||
|
DECOR
|
||||||
|
DECOY
|
||||||
|
DEFER
|
||||||
|
DEFOG
|
||||||
|
DELTA
|
||||||
|
DENSE
|
||||||
|
DEPOT
|
||||||
|
DEPTH
|
||||||
|
DETOX
|
||||||
|
DIODE
|
||||||
|
DIPPY
|
||||||
|
DISCO
|
||||||
|
DISCS
|
||||||
|
DISKS
|
||||||
|
DOPED
|
||||||
|
DOPER
|
||||||
|
DOSES
|
||||||
|
DRAFT
|
||||||
|
DRAIN
|
||||||
|
DRIFT
|
||||||
|
DRILL
|
||||||
|
DRONE
|
||||||
|
DRUPE
|
||||||
|
DUALS
|
||||||
|
DUREX
|
||||||
|
DWELL
|
||||||
|
EBOOK
|
||||||
|
EDEMA
|
||||||
|
ELUTE
|
||||||
|
EMAIL
|
||||||
|
EMCEE
|
||||||
|
EMEND
|
||||||
|
EMIRS
|
||||||
|
EMITS
|
||||||
|
EMOTE
|
||||||
|
EPOCH
|
||||||
|
EPOXY
|
||||||
|
ERGOT
|
||||||
|
ERUPT
|
||||||
|
ESTER
|
||||||
|
ETHER
|
||||||
|
ETHIC
|
||||||
|
ETHOS
|
||||||
|
EUROS
|
||||||
|
EVADE
|
||||||
|
EXACT
|
||||||
|
EXALT
|
||||||
|
EXECS
|
||||||
|
EXERT
|
||||||
|
EXILE
|
||||||
|
EXIST
|
||||||
|
EXITS
|
||||||
|
EXPAT
|
||||||
|
EXPEL
|
||||||
|
EXPOS
|
||||||
|
EXTRA
|
||||||
|
EXUDE
|
||||||
|
EXULT
|
||||||
|
EXURB
|
||||||
|
FECAL
|
||||||
|
FECES
|
||||||
|
FEMUR
|
||||||
|
FERMI
|
||||||
|
FETAL
|
||||||
|
FETUS
|
||||||
|
FIBER
|
||||||
|
FIBRE
|
||||||
|
FIELD
|
||||||
|
FILES
|
||||||
|
FILTH
|
||||||
|
FINAL
|
||||||
|
FINED
|
||||||
|
FINER
|
||||||
|
FINIS
|
||||||
|
FINNY
|
||||||
|
FIORD
|
||||||
|
FIXED
|
||||||
|
FIXER
|
||||||
|
FIZZY
|
||||||
|
FJORD
|
||||||
|
FLAGS
|
||||||
|
FLASK
|
||||||
|
FLECK
|
||||||
|
FLEXS
|
||||||
|
FLINT
|
||||||
|
FLOAT
|
||||||
|
FLORA
|
||||||
|
FLOUR
|
||||||
|
FLUKY
|
||||||
|
FLUME
|
||||||
|
FLUOR
|
||||||
|
FLUSH
|
||||||
|
FOCAL
|
||||||
|
FOCUS
|
||||||
|
FOILS
|
||||||
|
FONTS
|
||||||
|
FORCE
|
||||||
|
FORMS
|
||||||
|
FORTE
|
||||||
|
FORUM
|
||||||
|
FOSSE
|
||||||
|
FOXED
|
||||||
|
FRAME
|
||||||
|
FREED
|
||||||
|
FRESH
|
||||||
|
FRITS
|
||||||
|
FROND
|
||||||
|
FROST
|
||||||
|
FROTH
|
||||||
|
FUGAL
|
||||||
|
FUGUE
|
||||||
|
FUMED
|
||||||
|
FUMES
|
||||||
|
FUNGI
|
||||||
|
FUNGO
|
||||||
|
FURLS
|
||||||
|
FUROR
|
||||||
|
FURTH
|
||||||
|
FUSED
|
||||||
|
FUSEE
|
||||||
|
FUSEL
|
||||||
|
FUSES
|
||||||
|
FUTON
|
||||||
|
FUZED
|
||||||
|
FUZES
|
||||||
|
FUZZY
|
||||||
|
GAGES
|
||||||
|
GALES
|
||||||
|
GAMMA
|
||||||
|
GANGS
|
||||||
|
GASES
|
||||||
|
GATED
|
||||||
|
GATES
|
||||||
|
GAUGE
|
||||||
|
GAUNT
|
||||||
|
GAUSS
|
||||||
|
GAUZE
|
||||||
|
GAVEL
|
||||||
|
GEARS
|
||||||
|
GECKO
|
||||||
|
GEEKS
|
||||||
|
GEESE
|
||||||
|
GENES
|
||||||
|
GENIE
|
||||||
|
GENII
|
||||||
|
GENRE
|
||||||
|
GENUS
|
||||||
|
GEODE
|
||||||
|
GERMS
|
||||||
|
GESSO
|
||||||
|
GIDDY
|
||||||
|
GILDS
|
||||||
|
GILLS
|
||||||
|
GIMPS
|
||||||
|
GIRTH
|
||||||
|
GISMO
|
||||||
|
GIZMO
|
||||||
|
GLAND
|
||||||
|
GLASS
|
||||||
|
GLAZE
|
||||||
|
GLEAM
|
||||||
|
GLEAN
|
||||||
|
GLIDE
|
||||||
|
GLIMS
|
||||||
|
GLINT
|
||||||
|
GLITZ
|
||||||
|
GLOBE
|
||||||
|
GLOBS
|
||||||
|
GLOPS
|
||||||
|
GLOSS
|
||||||
|
GLOWS
|
||||||
|
GLOZE
|
||||||
|
GLUED
|
||||||
|
GLUES
|
||||||
|
GLUEY
|
||||||
|
GLUMS
|
||||||
|
GLUON
|
||||||
|
GLUTE
|
||||||
|
GLUTS
|
||||||
|
GLYPH
|
||||||
|
GNASH
|
||||||
|
GNOME
|
||||||
|
GONAD
|
||||||
|
GONGS
|
||||||
|
GOODS
|
||||||
|
GOUGE
|
||||||
|
GOURD
|
||||||
|
GOUTS
|
||||||
|
GRADE
|
||||||
|
GRADS
|
||||||
|
GRAFT
|
||||||
|
GRAIN
|
||||||
|
GRAMS
|
||||||
|
GRAPH
|
||||||
|
GRASP
|
||||||
|
GRATE
|
||||||
|
GRAVE
|
||||||
|
GRAYS
|
||||||
|
GRAZE
|
||||||
|
GREBE
|
||||||
|
GREED
|
||||||
|
GREYS
|
||||||
|
GRIDE
|
||||||
|
GRIDS
|
||||||
|
GRIFF
|
||||||
|
GRIFT
|
||||||
|
GRILL
|
||||||
|
GRIME
|
||||||
|
GRIMY
|
||||||
|
GRIND
|
||||||
|
GRINS
|
||||||
|
GRIPE
|
||||||
|
GRIPS
|
||||||
|
GRIST
|
||||||
|
GRITS
|
||||||
|
GROAN
|
||||||
|
GROAT
|
||||||
|
GROGS
|
||||||
|
GROIN
|
||||||
|
GROOM
|
||||||
|
GROPE
|
||||||
|
GROSS
|
||||||
|
GROTS
|
||||||
|
GROUP
|
||||||
|
GROUT
|
||||||
|
GROVE
|
||||||
|
GROWL
|
||||||
|
GROWN
|
||||||
|
GROWS
|
||||||
|
GRUBS
|
||||||
|
GRUEL
|
||||||
|
GRUFF
|
||||||
|
GRUMP
|
||||||
|
GRUNT
|
||||||
|
GUANO
|
||||||
|
GUARD
|
||||||
|
GUAVA
|
||||||
|
GUESS
|
||||||
|
GUEST
|
||||||
|
GUIDE
|
||||||
|
HELIX
|
||||||
|
HERTZ
|
||||||
|
HEXAD
|
||||||
|
HEXED
|
||||||
|
HEXES
|
||||||
|
HYENA
|
||||||
|
HYOID
|
||||||
|
HYPED
|
||||||
|
HYPER
|
||||||
|
HYPES
|
||||||
|
HYPHA
|
||||||
|
HYPOS
|
||||||
|
ICHOR
|
||||||
|
ICONS
|
||||||
|
IDEAL
|
||||||
|
IDEAS
|
||||||
|
IDOLS
|
||||||
|
IMAGE
|
||||||
|
IMBED
|
||||||
|
IMBUE
|
||||||
|
IMPEL
|
||||||
|
INANE
|
||||||
|
INBOX
|
||||||
|
INCUR
|
||||||
|
INDEX
|
||||||
|
INDIE
|
||||||
|
INERT
|
||||||
|
INFER
|
||||||
|
INFIX
|
||||||
|
INKLE
|
||||||
|
INLAY
|
||||||
|
INLET
|
||||||
|
INNER
|
||||||
|
INPUT
|
||||||
|
INRUN
|
||||||
|
INTER
|
||||||
|
INTRO
|
||||||
|
INURE
|
||||||
|
INURN
|
||||||
|
INVAR
|
||||||
|
IODIC
|
||||||
|
IODID
|
||||||
|
IODIN
|
||||||
|
IONIC
|
||||||
|
IOTAS
|
||||||
|
IRADE
|
||||||
|
IRATE
|
||||||
|
IRIDS
|
2767
wordlists/wordle_words_hard.txt
Normal file
2767
wordlists/wordle_words_hard.txt
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user