Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: txt->ds list/array->txt[SOLUCIONADO]  (Leído 253 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Dublan

en: Julio 31, 2018, 07:08:24 pm
Hola Makeros!!

A ver si podéis echarme una mano con esta duda que tengo.

Tengo un archivo ".txt" incluido en el juego con unas 3000 palabras. De este archivo, necesito crear otro archivo .txt con 15 palabras elegidas al azar de esas 3000.

Para hacerlo, había pensado en crear un array de 1D a partir del archivo .txt. Una vez creado ese array, coger palabras aleatorias de ese array y crear el nuevo archivo txt. Algo tengo que estar haciendo mal porque no soy capaz:

Codigo en Game Start
Código: [Seleccionar]
var valor=0
file = file_text_open_read("espanol.txt");
while (!file_text_eof(file))
{
    str[valor++] = file_text_readln(file);//Un array de 1D
}
file_text_close(file);

buscarlas= file_text_open_write("buscarlas.txt");

for (i=0; i=15; i++)//Numero de palabras a encontrar
{
               randomize();
               file_text_write_string(buscarlas, str[irandom(3650)]);
               file_text_writeln(buscarlas);
               file_text_close(buscarlas);
}

También había pensado en usar ds list en vez de arrays, pero tampoco lo logro  :-X:

Scrip para pasar de txt a list
Código: [Seleccionar]
var list, txt
list=ds_list_create()
txt=file_text_open_read(argument0)
do
{
ds_list_add(list,file_text_read_string(txt))
file_text_readln(txt)
}
until(file_text_eof(txt))
file_text_close(txt)
return(list)

Codigo en Game Start
Código: [Seleccionar]
buscandolas=scr_txt_to_list("espanol.txt")

ds_list_shuffle(buscandolas);

encontradas=file_text_open_write("encontradas.txt");

for (i=0;i=15;i++)
{
               buscada[i]=ds_list_find_value(buscandolas,i)
               file_text_write_string(encontradas,buscada[i]);
               file_text_writeln(encontradas);
}
file_text_close(encontradas);

¿Que estoy haciendo mal?

Gracias!!!!
« última modificación: Agosto 01, 2018, 09:24:05 pm por Dublan »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado BssString

Respuesta #1 en: Julio 31, 2018, 07:42:29 pm
Hola Dublan
Tu primer código lo veo casi bien, tiene dos detalles, en el for loop, estás cerrando el archivo en el primer loop, así qué sólo te grabará 1 línea de las 15, coloca el file_text_close afuera.
Además en el random usas como índice "3650". Siento que es más preciso usar la función "array_length_1d(str)-1"

Si con esas correcciones sigue sin funcionar, ve si estás guardando el archivo de texto en el directorio correcto, en appdata -> local -> nombre de tu juego

Saludos

 


Desconectado Dublan

Respuesta #2 en: Julio 31, 2018, 07:58:46 pm
Gracias por la respuesta BssString!

Acabo de probar con lo que me has comentado, y se crea el archivo "buscarlas" pero sin ningún contenido. El código lo he dejado así:

Código: [Seleccionar]
var valor=0
file = file_text_open_read("espanol.txt");
while (!file_text_eof(file))
{
    str[valor++] = file_text_readln(file);//Un array de 1D
}
file_text_close(file);

buscarlas= file_text_open_write("buscarlas.txt");

for (i=0; i=15; i++)//Numero de palabras a encontrar
{
               randomize();
               file_text_write_string(buscarlas, str[array_length_1d(str)-1]);
               file_text_writeln(buscarlas);           
}
file_text_close(buscarlas);

 


Desconectado BssString

Respuesta #3 en: Agosto 01, 2018, 03:02:52 am
Hola Dublan

Algunas correcciones:
1- En el "while loop", estás usando la función "file_text_readln" que a parte de leer la línea, lee carácteres de control no deseados que después podrían aparecer en tu archivo final, como espacios o saltos de línea. Para evitar eso, cámbialo por lo siguiente:
Código: [Seleccionar]
str[valor++] = file_text_read_string(file);//Un array de 1D
file_text_readln(file);
2- El principal problema del código es que tu "for loop" debe tener el signo "menor" en la condición, de esta forma:
Código: [Seleccionar]
for (i=0; i<15; i++)//Numero de palabras a encontrar
3- Como consejo, la función "randomize()" se usa sólo 1 vez y al inicio, no 15 veces dentro de un for loop, lo que hace la función es cargar una semilla aleatoria para que game maker use para generar los próximos números aleatorios, pero no es necesario cambiar la semilla 15 veces, si no usas ni una sola vez el randomize(), GM creará siempre el mismo patrón de número aleatorios.

4- Y último, el índice del array debe tener la función "irandom()" que es la que te genera el número aleatorio.
Código: [Seleccionar]
file_text_write_string(buscarlas, str[irandom(array_length_1d(str)-1)]);
Espero no haberte confundido con la explicación... corrigiendo las 4 líneas, el código debería funcionar a la perfección.

Saludos

 


Desconectado Dublan

Respuesta #4 en: Agosto 01, 2018, 09:23:46 pm
Funciona perfectamente!!!

Mil gracias! ;)