CONSTRUIR CLON DE WORDLE CON PYTHON Y RICH EN TERMINAL
Introducción al desarrollo de un clon de Wordle en entorno de terminal
La creación de un clon de Wordle representa una excelente oportunidad para practicar conceptos fundamentales de programación en Python mientras se construye una aplicación interactiva y visualmente atractiva. Este enfoque permite explorar el manejo de entradas del usuario, la lógica de comparación de cadenas y el formateo avanzado de salida en consola mediante herramientas modernas. En 2026, con Python en versiones estables como la 3.13 o superiores recomendadas para nuevos proyectos, los desarrolladores pueden aprovechar bibliotecas consolidadas que mejoran la experiencia del usuario sin complicaciones adicionales.
El juego original consiste en adivinar una palabra secreta de cinco letras en un máximo de seis intentos. Cada intento genera retroalimentación visual: letras en verde indican posición correcta, en amarillo presencia en otra posición y en gris ausencia total. Implementar esta mecánica en terminal exige atención a detalles como validación de entradas, prevención de repeticiones y presentación clara de resultados. La librería Rich facilita esta tarea al permitir estilos de color, emojis y texto formateado de manera profesional, elevando un simple script a una experiencia pulida.
En proyectos de programación práctica, los clones de juegos populares como este ayudan a consolidar habilidades en estructuras de control, funciones modulares y manejo de datos. Comenzar por definir requisitos claros asegura un desarrollo estructurado y escalable, evitando problemas comunes en aplicaciones de consola.
El proceso inicia con la preparación del entorno de desarrollo. Recomendamos utilizar un entorno virtual para aislar dependencias y mantener compatibilidad con versiones actuales de Python. La instalación de Rich se realiza mediante el gestor de paquetes pip, asegurando acceso a sus capacidades de consola enriquecida.
python -m venv venv
source venv/bin/activate # En Windows: venv\Scripts\activate
pip install rich
Esta configuración proporciona un espacio limpio donde probar el código sin interferencias. En sistemas actualizados a 2026, Python 3.12 o 3.13 ofrecen mejoras en rendimiento y manejo de Unicode, especialmente útil para emojis en terminal.
A continuación se define la estructura básica del proyecto. Una organización clara de archivos facilita el mantenimiento y posibles expansiones futuras.
wordle-clone/
├── main.py
├── words.py
└── README.md
El archivo words.py contiene una lista extensa de palabras válidas de cinco letras en mayúsculas. Esta lista actúa como diccionario para seleccionar la palabra objetivo de forma aleatoria y validar intentos del jugador. En implementaciones reales, se recomienda cargar palabras desde un archivo externo o una base de datos para mayor flexibilidad, pero para simplicidad se mantiene en memoria.
Un ejemplo parcial de words.py ilustra el formato:
word_list = [
"ABOUT", "ABOVE", "ABUSE", "ACTOR", "ACUTE", "ADMIT", "ADOPT", "ADULT",
"AFTER", "AGAIN", "AGENT", "AGREE", "AHEAD", "ALARM", "ALBUM", "ALERT",
"ALIKE", "ALIVE", "ALLOW", "ALONE", "ALONG", "ALTER", "AMONG", "ANGER",
# ... más de 2000 palabras adicionales de cinco letras
"YIELD", "YOUNG", "YOUTH"
]
Esta colección asegura variedad en cada partida y permite validaciones estrictas contra palabras reales. Actualizaciones periódicas de la lista mantienen el juego fresco y alineado con vocabulario contemporáneo.
El núcleo de la aplicación reside en main.py, donde se importa Rich para manejar la consola y se implementa la lógica principal. La selección aleatoria de la palabra secreta utiliza el módulo random de la biblioteca estándar, garantizando imprevisibilidad en cada ejecución.
from rich.console import Console
from rich.prompt import Prompt
from random import choice
from words import word_list
console = Console()
chosen_word = choice(word_list).upper()
Aquí se inicializa la consola de Rich, que servirá para imprimir mensajes con estilos personalizados. La palabra elegida se convierte a mayúsculas para estandarizar comparaciones, evitando errores por diferencias de caso.
Configuración de constantes y mensajes del juego
Definir constantes al inicio mejora la legibilidad y permite modificaciones rápidas sin alterar la lógica central. Entre ellas se incluyen el número máximo de intentos, mensajes de bienvenida y diccionarios para representar retroalimentación visual.
Un ejemplo de constantes podría ser el siguiente:
ALLOWED_GUESSES = 6
WELCOME_MESSAGE = "[white on blue] BIENVENIDO AL CLON DE WORDLE [/]"
PLAYER_INSTRUCTIONS = "Adivina una palabra de cinco letras en máximo seis intentos."
GUESS_STATEMENT = "Ingresa tu intento:"
Estos valores se utilizan en el flujo principal para guiar al jugador. Rich permite aplicar estilos directamente en cadenas, como fondos de color y texto en negrita, creando una interfaz atractiva incluso en terminales básicas.
La representación visual de resultados mediante cuadrados de colores (verde, amarillo, gris) añade un elemento familiar del juego original. Se define un diccionario que mapea estados a emojis Unicode.
SQUARES = {
"correct_place": "🟩",
"correct_letter": "🟨",
"incorrect_letter": "⬛"
}
Esta aproximación utiliza caracteres ampliamente soportados en terminales modernas de 2026, asegurando compatibilidad multiplataforma.
Funciones auxiliares para colorear letras según retroalimentación
La función principal de validación compara cada letra del intento con la palabra secreta posición por posición. Se implementan tres funciones helper que retornan cadenas formateadas con Rich según el estado de la letra.
def correct_place(letter: str) -> str:
return f"[black on green]{letter}[/]"
def correct_letter(letter: str) -> str:
return f"[black on yellow]{letter}[/]"
def incorrect_letter(letter: str) -> str:
return f"[black on white]{letter}[/]"
Cada una aplica un estilo específico: fondo verde para posición exacta, amarillo para presencia incorrecta y blanco/gris para ausencia. El texto negro sobre fondo asegura legibilidad en la mayoría de terminales.
La función check_guess integra esta lógica en un bucle que construye tanto la representación coloreada como el patrón de cuadrados.
def check_guess(guess: str, answer: str) -> tuple[str, str]:
guessed = []
wordle_pattern = []
for i, letter in enumerate(guess):
if answer[i] == letter:
guessed.append(correct_place(letter))
wordle_pattern.append(SQUARES["correct_place"])
elif letter in answer:
guessed.append(correct_letter(letter))
wordle_pattern.append(SQUARES["correct_letter"])
else:
guessed.append(incorrect_letter(letter))
wordle_pattern.append(SQUARES["incorrect_letter"])
return "".join(guessed), "".join(wordle_pattern)
Esta implementación maneja correctamente casos donde una letra aparece múltiples veces, priorizando coincidencias exactas. En versiones avanzadas se puede refinar para manejar conteo de ocurrencias y evitar falsos positivos en amarillo.
Lógica principal del bucle de juego y validación de entradas
El corazón del programa es la función game que orquesta el flujo completo. Utiliza un bucle while controlado por una bandera de finalización y listas para almacenar historial de intentos y patrones.
def game(console: Console, chosen_word: str):
end_of_game = False
already_guessed = []
all_words_guessed = []
full_wordle_pattern = []
while not end_of_game:
guess = Prompt.ask(GUESS_STATEMENT).upper()
while len(guess) != 5 or guess in already_guessed:
if guess in already_guessed:
console.print("[red]Ya has intentado esta palabra.[/]")
else:
console.print("[red]Debe ser una palabra de exactamente 5 letras.[/]")
guess = Prompt.ask(GUESS_STATEMENT).upper()
already_guessed.append(guess)
guessed, pattern = check_guess(guess, chosen_word)
all_words_guessed.append(guessed)
full_wordle_pattern.append(pattern)
console.print(*all_words_guessed, sep="\n")
if guess == chosen_word or len(already_guessed) == ALLOWED_GUESSES:
end_of_game = True
La validación en tiempo real previene entradas inválidas y repeticiones, mejorando la experiencia del usuario. Rich maneja los mensajes de error con color rojo para mayor visibilidad.
Al finalizar el bucle se evalúa el resultado y se muestra un mensaje apropiado.
if len(already_guessed) == ALLOWED_GUESSES and guess != chosen_word:
console.print(f"\n[red]WORDLE X/{ALLOWED_GUESSES}[/]")
console.print(f"\n[green]Palabra correcta: {chosen_word}[/]")
else:
console.print(f"\n[green]WORDLE {len(already_guessed)}/{ALLOWED_GUESSES}[/]\n")
console.print(*full_wordle_pattern, sep="\n")
Esta sección proporciona cierre al juego, revelando la solución en caso de derrota y mostrando el patrón completo de retroalimentación.
Integración del punto de entrada principal y ejecución del programa
El bloque principal coordina la inicialización y llamada a la función de juego.
if __name__ == "__main__":
console = Console()
chosen_word = choice(word_list).upper()
console.print(WELCOME_MESSAGE)
console.print(PLAYER_INSTRUCTIONS)
game(console, chosen_word)
Ejecutar el script con python main.py inicia la experiencia completa. En terminales compatibles con Rich, los colores y emojis se renderizan de forma nativa, creando una interfaz inmersiva.
La modularidad del código permite extensiones sin reescribir secciones completas. Por ejemplo, separar la lógica de validación en un módulo dedicado facilita pruebas unitarias y reutilización.
Mejoras avanzadas para enriquecer la experiencia del clon
Una vez implementada la versión base, se pueden incorporar características que eleven la calidad del proyecto. Entre ellas destaca la persistencia de la palabra diaria mediante hashing de fecha, evitando que cambie en cada ejecución.
from datetime import date
import hashlib
def get_daily_word(word_list):
today = date.today().isoformat()
seed = hashlib.md5(today.encode()).hexdigest()
index = int(seed, 16) % len(word_list)
return word_list[index].upper()
Esta técnica asegura una palabra única por día, similar al juego original, y mejora la rejugabilidad.
Otra mejora consiste en añadir un teclado virtual en terminal que muestre letras usadas y su estado. Rich permite construir tablas o paneles para esta funcionalidad.
from rich.table import Table
def show_keyboard(used_letters):
table = Table(title="Teclado")
# Lógica para agregar filas con letras y colores
console.print(table)
Implementar estadísticas personales, como porcentaje de victorias o distribución de intentos, requiere almacenamiento simple en JSON.
import json
def save_stats(stats):
with open("stats.json", "w") as f:
json.dump(stats, f)
Estas adiciones transforman un prototipo básico en una aplicación más completa y atractiva para compartir en comunidades de programación.
En 2026, con avances en terminales y soporte Unicode mejorado, se recomienda probar el juego en múltiples plataformas para garantizar consistencia en renderizado de colores y emojis. Herramientas como Windows Terminal o iTerm2 ofrecen excelente compatibilidad con Rich.
La validación adicional contra un diccionario más robusto, posiblemente integrado con bibliotecas como nltk (si se instala), previene palabras inválidas y eleva el nivel de desafío.
# Ejemplo de validación extendida
if guess not in word_list:
console.print("[red]Palabra no válida en el diccionario.[/]")
Optimizaciones de rendimiento y mejores prácticas en código Python
Aunque el juego es ligero, aplicar buenas prácticas asegura escalabilidad. Utilizar type hints mejora la legibilidad y permite herramientas de análisis estático como mypy.
from typing import List, Tuple
def check_guess(guess: str, answer: str) -> Tuple[str, str]:
# Implementación con hints
pass
Evitar bucles anidados innecesarios y preferir estructuras de datos eficientes como sets para verificaciones rápidas de presencia.
answer_set = set(chosen_word)
# Uso posterior para chequeos rápidos
En proyectos CLI, el manejo adecuado de excepciones previene cierres abruptos ante entradas inesperadas.
try:
guess = Prompt.ask(GUESS_STATEMENT).upper()
except KeyboardInterrupt:
console.print("\n[red]Juego interrumpido.[/]")
exit()
Estas prácticas profesionales contribuyen a un código mantenible y robusto, adecuado para portafolios o contribuciones open source.
La integración de Rich no solo añade color sino también capacidades avanzadas como progreso, tablas y sintaxis destacada, abriendo puertas a futuras expansiones del proyecto.
Consideraciones finales sobre el despliegue y compartición del proyecto
Una vez completado, empaquetar el juego con herramientas como pyinstaller permite distribuirlo como ejecutable independiente.
pip install pyinstaller
pyinstaller --onefile main.py
Esto facilita que otros usuarios prueben el clon sin necesidad de instalar Python o dependencias manualmente.
Compartir el código en plataformas como GitHub invita a colaboraciones y retroalimentación de la comunidad. Incluir un archivo README detallado con instrucciones de instalación y ejecución mejora la accesibilidad.
En el contexto actual de desarrollo de software en 2026, proyectos como este demuestran dominio de Python para crear experiencias divertidas y educativas, combinando lógica algorítmica con diseño de interfaces.
El enfoque paso a paso descrito permite a programadores de diferentes niveles replicar y personalizar el clon, adaptándolo a preferencias individuales como temas de color o niveles de dificultad variables.
Conclusiones
El desarrollo de un clon de Wordle con Python y Rich ilustra eficazmente cómo herramientas simples pueden generar aplicaciones engaging y funcionales en terminal. Desde la preparación del entorno hasta la implementación de lógica avanzada y mejoras, cada etapa refuerza conceptos clave de programación. Este proyecto no solo entretiene sino que sirve como base para explorar temas más complejos como persistencia de datos, interfaces gráficas o incluso versiones multiplataforma. Con las actualizaciones de Python y Rich disponibles en 2026, las posibilidades de expansión continúan creciendo, invitando a los desarrolladores a innovar y compartir sus creaciones dentro de la comunidad tecnológica. La combinación de código limpio, validaciones sólidas y presentación visual atractiva resulta en una experiencia completa que destaca en cualquier portafolio de programación.