Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: cristopher2545 en Agosto 02, 2019, 06:03:37 AM

Título: [SOLUCIONADO]Lista de elección aleatoria
Publicado por: cristopher2545 en Agosto 02, 2019, 06:03:37 AM
Hola a todos! vengo con una nueva duda el día de hoy, eh estado tratando de hacer una lista de 10 artículos,  todos los artículos empiezan con una variable al azar se escoje  entre un 0 y 1 al crear el objeto para que sea totalmente aleatoreo

peine=     choose(0,1)
cepillo=     choose(0,1)
jabon=      choose(0,1)
corta=     choose(0,1)
papel=    choose(0,1)
pasta=    choose(0,1)
desodrante= choose(0,1)
toalla=     choose(0,1)
crema=      choose(0,1)
esponja=    choose(0,1)

me gustaría que cuando el juego inicie de todos los números dentro de la lista solo existan 3 elecciones que sumen 3 es decir que cuando todo sea aleatorio cada que reinicie el juego la lista cambie quedando solo 3 objetos en la lista mientras los demás se "apagan" la suma de estos numeros jamas puede ser mayor a 3 ni menor a 3

peine=     0
cepillo=    0
jabon=      1
corta=    0
papel=    0
pasta=    1
desodorante= 1
toalla=     0
crema=      0
esponja=    0

cual seria la manera mas eficiente de lograr obtener solo 3 artículos de la lista cada vez que el juego inicie? si alguien puede ayudarme lo agradecería muchísimo!
Título: Re:Lista de elección aleatoria
Publicado por: Silver_light en Agosto 02, 2019, 03:00:25 PM
Hace nada respondí un tema sobre inventario, que si uno lo abstrae de una manera conveniente podrías convertirlo en lista.
Personalmente te recomiendo usar las funciones para listas: ds_list_*
Ya que estas cuentan con funciones muy interesantes que a la par de útiles, como mezclar y sacar elementos. Básicamente, lo que necesitas.

Dado que, tu lista de artículos está conformado por un grupo de objetos que pueden instanciarse:
1) Yo crearía la lista y colocaría el nombre de los objetos
2) Mezclaría la lista
3) Sacaría el elemento que esta al tope
4) Lo instanciaría
5) Mezclaría la lista
6) Sacaría el elemento que esta al tope
7) Instanciaría ese elemento
8 ) Mezclaría la lista
9) Sacaría el elemento que esta al tope
10) Instanciaría ese elemento

Entonces tendrías tres instancias de objetos distintos.

Hmmm, en otro caso, si son simplemente variables, podrías hacer un ciclo que recorra la lista indefinidamente, iniciadas con 0 al inicio, e ir usando un contador que vaya registrando la cantidad de unos que se ponen aleatoriamente dentro de la lista.

Saludos!
Título: Re:Lista de elección aleatoria
Publicado por: Goganpis en Agosto 03, 2019, 01:06:06 AM
Bueno Yo lo haria de esta forma...

var tanteo, maxObj, Lista, ListaMax;
maxObj = 2; // Numero de repeticiones (numero maximo de objetos tanteados)
ListaMax = 10; // Espacio de la lista

var i;
for(i=0;i<ListaMax;i+=1)
    {// Vaciar Lista
     Lista[i] = 0;
    }

var i;
for (i=0;i<maxObj;i+=1) // Repetir el ciclo hasta llegar al limite de objetos en este caso "3"
    {// Tantear maxObj que tienen que ser ajustados
     tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
     
     Lista[tanteo] = 1; // Ajustar como creado o elegido como lo llames
    }


PD: Ya el array Lista tiene que ser declarado anteriormente o dara error otra opcion seria usar ds_list.
Título: Re:Lista de elección aleatoria
Publicado por: Silver_light en Agosto 03, 2019, 02:07:27 AM
Cita de: Goganpis en Agosto 03, 2019, 01:06:06 AM
Bueno Yo lo haria de esta forma...

var tanteo, maxObj, Lista, ListaMax;
maxObj = 2; // Numero de repeticiones (numero maximo de objetos tanteados)
ListaMax = 10; // Espacio de la lista

var i;
for(i=0;i<ListaMax;i+=1)
    {// Vaciar Lista
     Lista[i] = 0;
    }

var i;
for (i=0;i<maxObj;i+=1) // Repetir el ciclo hasta llegar al limite de objetos en este caso "3"
    {// Tantear maxObj que tienen que ser ajustados
     tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
     
     Lista[tanteo] = 1; // Ajustar como creado o elegido como lo llames
    }


PD: Ya el array Lista tiene que ser declarado anteriormente o dara error otra opcion seria usar ds_list.
El único problema que tiene este algoritmo es que, la instrucción mas importante:
[gml]
  tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
[/gml]
Podría dar un numero repetido y el ciclo contaría de todas maneras la iteración. En el peor de los casos se dará para un elemento repetido y no habrán 3 elementos seleccionado sino 2 o para peor, solo 1.
Lo que cabría hacer es, verificar, que el número que saca "tanteo" no está repetido.
[gml]
  tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
if (lista[tanteo] == 0)
     lista[tanteo] = 1;
  else
      i -= 1;  //repetir el ciclo restando -1, para decir que no cuente esta vuelta. (Aclaro que esto para mi desde un punto estructural siguiendo el paradigma de programacion estructurada, esta super mal XD )
[/gml]

El problema con este algoritmo es, lo que se llama "aplazamiento indefinido", que en el peor de los casos cae siempre en un espacio ocupado y se repite innecesariamente muchas iteracion.
Por lo que:
Citarcual seria la manera mas eficiente [...]
No es la mejor manera, pero sigue siendo una solución corta de implementar. <3
Título: Re:Lista de elección aleatoria
Publicado por: 3dgeminis en Agosto 03, 2019, 05:58:16 AM
Yo lo haria usando un 2Darray que contenga los nombres y su cantidad, y una lista para elegir 3 valores al azar.
[gml]
item[0,0]="peine"
item[0,1]=0
item[1,0]="cepillo"
item[1,1]=0
item[2,0]="jabon"
item[2,1]=0
item[3,0]="corta"
item[3,1]=0
item[4,0]="papel"
item[4,1]=0
item[5,0]="pasta"
item[5,1]=0
item[6,0]="desodorante"
item[6,1]=0
item[7,0]="toalla"
item[7,1]=0
item[8,0]="crema"
item[8,1]=0
item[9,0]="esponja"
item[9,1]=0

randomize()

lista=ds_list_create()

for(i=0;i<10;i+=1) {ds_list_add(lista,i)}

ds_list_shuffle(lista)

for(i=0;i<3;i+=1) {item[ds_list_find_value(lista,i),1]=1}

[/gml]
Título: Re:Lista de elección aleatoria
Publicado por: Goganpis en Agosto 06, 2019, 12:53:12 AM
Cita de: Silver_light en Agosto 03, 2019, 02:07:27 AM
El único problema que tiene este algoritmo es que, la instrucción mas importante:
[gml]
  tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
[/gml]
Podría dar un numero repetido y el ciclo contaría de todas maneras la iteración. En el peor de los casos se dará para un elemento repetido y no habrán 3 elementos seleccionado sino 2 o para peor, solo 1.
Lo que cabría hacer es, verificar, que el número que saca "tanteo" no está repetido.
[gml]
  tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
if (lista[tanteo] == 0)
     lista[tanteo] = 1;
  else
      i -= 1;  //repetir el ciclo restando -1, para decir que no cuente esta vuelta. (Aclaro que esto para mi desde un punto estructural siguiendo el paradigma de programacion estructurada, esta super mal XD )
[/gml]

El problema con este algoritmo es, lo que se llama "aplazamiento indefinido", que en el peor de los casos cae siempre en un espacio ocupado y se repite innecesariamente muchas iteracion.
Por lo que:No es la mejor manera, pero sigue siendo una solución corta de implementar. <3

Lo hice sin probarlo  :-[ :-[ Pues gracias por corregirme
Título: Re:Lista de elección aleatoria
Publicado por: cristopher2545 en Agosto 07, 2019, 03:19:00 AM
wow agradezco la pronta respuesta <3 a final de todo use todos los códigos para diferentes cuestiones ya que es algo exigente lo que quiero lograr y todo funciono como un engrane! se loa agradezco mucho <3