Agosto 02, 2019, 06:03:37 AM Ultima modificación: Agosto 07, 2019, 03:19:24 AM por cristopher2545
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!
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!

#1 Agosto 02, 2019, 03:00:25 PM Ultima modificación: Agosto 03, 2019, 02:00:20 AM por Silver_light
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!

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.

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

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]

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

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
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!