Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Dublan en Julio 31, 2018, 07:08:24 pm

Título: txt->ds list/array->txt[SOLUCIONADO]
Publicado por: 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!!!!
Título: Re:txt->ds list/array->txt
Publicado por: BssString 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
Título: Re:txt->ds list/array->txt
Publicado por: Dublan 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);
Título: Re:txt->ds list/array->txt
Publicado por: BssString 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
Título: Re:txt->ds list/array->txt
Publicado por: Dublan en Agosto 01, 2018, 09:23:46 pm
Funciona perfectamente!!!

Mil gracias! ;)