17

Así puedes crear un clon de Wordle con Rust

29077Puntos

hace 2 años

Wordle es un juego de palabras que tan solo unos meses después de su lanzamiento se ha vuelto tremendamente popular. Consiste en adivinar una palabra de 5 letras en máximo 6 intentos. Así es como funciona:

  1. Se introduce una palabra válida (intento) buscando adivinar la que el juego plantea como objetivo.

  2. Si una de las letras del intento se encuentra en la palabra objetivo, pero no en la misma posición, la casilla quedará resaltada en color amarillo 🟨

    Perro
    🔳🟨🔳🔳🔳

  3. Si una letra de la palabra de intento se encuentra en la misma posición de la palabra objetivo, la casilla se mostrará en color verde 🟩

    Tigre
    🟩🔳🔳🔳🔳

  4. Si la letra no se encuentra en la palabra objetivo, la casilla aparecerá con un fondo gris ⬜

    Gato
    🔳🔳⬜🔳

Siguiendo estas reglas han nacido cientos de variaciones para el juego (mi favorita es nerdlegame.com). Hola, soy Hector Pulido y decidí crear mi propia versión de Wordle utilizando el lenguaje de programación Rust. En este post explicaré el paso a paso.

Además, sé que te interesa saber qué pasará con los cursos de Rust y no puedo darte todas las respuestas. Sin embargo, lee hasta el final y econtrarás un pequeño spoiler 👀.

He tomado la lista de animales de Wikipedia y después de un poco de formateo y regex acabé con un listado de 656 animales.

# animals.txt
...
garcita
garza
gato
gaucho
gaur
gavesia
....

Mi objetivo fue leer ese archivo con la lista de animales desde Rust. No podría ser más simple:

Untitled.png

Con este pequeño script resultan varias cosillas interesantes: traemos la librería std::fs que nos permite jugar con archivos de texto y después guardamos en una constante el nombre del archivo .txt.

Dentro de la función main leemos el archivo usando read_to_string(), el texto de animals lo cambiamos a minúscula y luego lo partimos usando la función split(). Finalmente, convertimos el split en un vector de strings.

Ahora tenemos una lista de animales para usarlos en nuestro juego. Vamos a elegir uno de esos animales al azar y para ello haremos lo siguiente:

Untitled 1.png

Tomaremos un número aleatorio entre 0 y la longitud del vector de animales, ese será el índice del animal que utilizaremos. Luego, le haremos un trim() que eliminará los espacios y por último convertiremos la palabra en String.

Podemos verificar que todo esté bien con un simple println!("{}", selected_word); y cada vez deberíamos obtener un animal distinto.

Antes de continuar tenemos que generar el tablero. Para ello crearemos la función get_wordle() que recibe el intento y la palabra correcta, devolviendo la fila del tablero y si el resultado es correcto:

Untitled 2.png

Primero definiremos un par de constantes que representarán a los emojis, de esta manera no tendremos emojis en el código. Luego, definiremos la función get_wordle , recibirá dos entradas y tendrá una tupla como salida.

Dentro del código tenemos el resultado como una variable mutable, una variable de is_correct que estará en true al principio, pero con la lógica y las validaciones lo vamos a poner en false, si corresponde.

Por último, vamos a convertir tanto el attemp como el correct en vectores de caracteres para comparar letra por letra. Tendrá más sentido en el próximo bloque de código.

Untitled 3.png

Vamos a recorrer una a una las letras de la palabra correcta. Usamos enumerate() para tener el índice (i) y el caracter (c) y así hacer comparaciones de forma más sencilla.

La primera comprobación que ejecutamos es obtener el caracter i de attemp_chars. La estructura de control puede parecer un poco complicada, pero es solo un if con una asignación, muy parecido al := de Python. Revisamos si c es igual a attemp_char, si es así, concatenamos a result un emoji verde y hacemos un continue.

En caso de que no se cumpla la validación anterior, significa que nuestra palabra no es la correcta, es decir, ponemos is_correct = false;

¡Pero no todo está perdido! Todavía podemos conseguir un amarillo, si la palabra de attemp contiene a c tenemos un emoji amarillo y hacemos el continue.

De lo contrario, tendremos simplemente un emoji blanco 😥. Con esta función completa, nuestro juego es mucho más sencillo de continuar.

Untitled 4.png

Vamos a definir un número de intentos y vamos a crear un bucle for que vaya desde 1 hasta el número de intentos + 1.

Leeremos datos de la consola utilizando std::io::stdin().read_line(). Es necesario preprocesar esta entrada para eliminar espacios, ponerla en lowercase, etc.

Con la entrada attemp podemos llamar a la función get_wordle, la cual nos devolverá el feedback. Si la palabra es correcta, mostramos un par de mensajes y listo.

Si la respuesta es correcta, felicitaremos al jugador y mostraremos un texto “tuiteable”.

Untitled 5.png

Así es como podemos crear un videojuego desde cero en Rust. Si quieres echarle un ojo al código, aquí está el repositorio.

Muchos han pedido cursos sobre Rust y yo estoy que me safo a tirarles todos los spoilers, pero tengo un francotirador apuntándome, así que mejor los invito a mis cursos de desarrollo de videojuego multijugador. Hasta entonces, nos vemos 😁.

Hector
Hector
hector_pulido_

29077Puntos

hace 2 años

Todas sus entradas
Escribe tu comentario
+ 2