Programación en Lua - Strings


Hace un par de semanas empecé a programar con Lua, y una de las cosas que me propuse hacer fue el juego del ahorcado. Puede parecer una chorrada, pero es más difícil de lo que parece. Empecemos:

 

Como algunos de vosotros ya sabreis, los strings son cadenas de texto. Se declaran como cualquier otra variable, pero el texto a declarar ha de ser otra string o un texto entre comillas. Pues bien, a mi me parece un trabajo muy tedioso trabajar con strings, y para entender como funcionan he tenido que recurrir a varias fuentes. Para que no paseis por lo mismo y os sea más facil he decidido recopilar todo mi conocimiento sobre strings aquí. Espero que os sirva ;)

 

string.sub() o str:sub()

Esto es una de las funciones más útiles. Busca el carácter que hay desde la posición n hasta la m de str:

string.sub(str, n, m) o str:sub(n, m)

El primer argumento numérico (n) representa el carácter en el que empezará a buscar, y el segundo (m) en el que terminará. Si no ponemos el segundo argumento numérico, se entiende que buscará en toda la string. Ejemplo:

str = “libro”

n = 1

str2 = string.sub(str, n, n)—> Dará “l”. Si no ponemos la segunda n:

str2 = string.sub(str, n)—> Dará “libro”, pues empieza a contar y no para hasta el final.

 

string.find() o str:find()

Es como el string.sub pero dado la vuelta. Sirve para buscar la posición del carácter char en str:

string.find(str, char, i) o str:find(char, i)

Esto sirve para encontrar cierto carácter/es en una string. Ejemplo:

str = “libro”

str2 = string.find(str, “b”)—> Dará 3.

print(str2)

El tercer argumento i es para decirle en que posición debe empezar a contar.

str = “casa”

i = 1

str2 = string.find(str, “a”, i)

print(str2)—> Dará 2.

Esto NO es el número de “a” que hay. Es la posición del primer carácter que sea “a” empezando por la posición i. Si en cambio escribimos:

str = “casa”

i = 3

str2 = string.find(str, “a”, i) —> Dará 4

¿4? ¿Cómo que 4?, diréis algunos. Pues si, al estar i declarado como 3, se empezará a contar desde la posición 3 (“s”). Y la primera “a” a partir de la posición 3 es la de la posición 4. Parece difícil, pero te acabas acostumbrando ;)

 

string.gsub() o str:gsub()

Reemplazar posición n de string:

string.gsub(str, r1, r2, i) o str:gsub(r1, r2, i)

i = numero de veces que se reemplaza. Ejemplo:

str = “Hola mundo”

str = string.gsub(str, “Hola”, “Adiós”)

print(str)—> Dará “Adiós mundo” En este caso no hace falta poner i porque solo hay un “Hola”.

En este caso, reemplaza r1 por r2, en la variable str. Esto no funciona si en vez de poner r2 (“Hola”) pongo un valor numeréico a modo de posición. Para eso usamos una función:

function replace_char(pos, str, r)

return str:sub(1, pos-1) .. r .. str:sub(pos+1)

end

Así declaramos la función. Para llamarla escribimos:

replace_char(pos, str, r)

El valor pos equivale a la posición del carácter a reemplazar, str equivale al string en el que se va a efectuar ese reemplazo y r equivale al carácter/es que van a aparecer. Esta función no permite varios reemplazos. Ejemplo:

str = “hola mundo”

str = replace_char(7, str, “a”)

print(str)—> Dará “hola mando”, pues hemos cambiado la posición 7 “u” por “a”.

 

Esta es una función muy útil que sirve para contar el número de caracteres iguales en una string:

local _, count = string.gsub(str, char1, “”)

Para esto usamos un gsub, pero no reemplazamos nada. Se contarán en str todos los caracteres char1 iguales. Para mostrar el número de caracteres iguales escribimos:

print(count)

Nos escribirá el número de veces que se repite char1.

 

Una de las cosas que más me costó fueron las rayas esas que representan a la palabra y luego se reemplazan por las letras que el jugador acierta. Lo que hice fue:

palabra = “casa”

rayas = “”—> Rayas es un string, pero está vacío. Ahora explico como se llena.

Repito esto por cada uno de los caracteres de la palabra a adivinar (por tanto si la palabra tiene 4 caracteres, lo repito 4 veces):

Si la letra que el jugador escribe es igual al carácter que estoy mirando (en la siguiente vuelta del bucle miraré el siguiente, y luego el siguiente, etc…), que se escriba la letra que yo he metido. (en este caso, digamos que el jugador ha dicho c) Entonces, rayas = “c”

Siguiente vuelta. Como el siguiente carácter de casa no es c (cAsa), que ponga una raya. Se nos quedaría así: c_

Esto lo repite hasta que se acaben las letras, así que como no hay más c en casa, nos quedaría tal que así: c___

 

¡Es un comienzo! Pero aquí viene donde yo me atranqué. Porque claro, lo que uno piensa es: pues le vuelvo a preguntar al jugador y que se vuelva a repetir el proceso. Pues no, porque para hacer las rayas estamos AÑADIENDO rayas, no reemplazándolas. Lo cual se nos quedaría así (el jugador mete la s): c_s_____

 

Y no queremos eso, ¿no? Pues la opción lógica es usar el string.gsub, pero… ¡ups! Olvidé que no acepta posiciones (algo fundamental aquí).

Pues usemos la otra alternativa, la función esa. Pero hay más de una raya, y esa función solo puede reemplazar un carácter (solo funcionaría en la primera vuelta del bucle).

 

Así que nos hemos quedado sin opciones… No pasa nada, pues las rayas que sobren las borramos y listo. Le decimos al ordenador que todas las rayas que haya desde el la posición del último carácter de la palabra hasta el final de la string rayas las borre y listo. A mi me funciona.

 

Conforme vaya aprendiendo más sobre este lenguaje os iré contando. También os dejo un gif que he creado, para cuando compile el ahorcado y tenga que poner el dibujo del ahorcado perdiendo extremidades (ahora que me doy cuenta no las va perdiendo, sino al revés...)

 

  • Mateo Periago
  • 07/03/2017 21:58:13
  • 0
  • Programacion
  • Tweet

 


Deja un comentario

*

Los comentarios son revisados antes de publicarse!

Enviar comentario

Strings en Lua - Buscar, encontrar y reemplazar

Dudas comunes de las strings en Lua.

Strings en Lua - Buscar, encontrar y reemplazar

El blog de Mateo

Hola! soy Mateo, tengo 14 años y este es mi blog.

follow us in feedly