Noticias

¡Ayuda a la Comunidad GM, haz una donación!

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: [SOLUCIONADO]Lista de elección aleatoria  (Leído 432 veces)

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

Desconectado 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!
« última modificación: Agosto 07, 2019, 03:19:24 am por cristopher2545 »

Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!
 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Silver_light

Respuesta #1 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!
« última modificación: Agosto 03, 2019, 02:00:20 am por Silver_light »

 
Los siguientes usuarios dieron las gracias a este tema: cristopher2545


Desconectado Goganpis

Respuesta #2 en: Agosto 03, 2019, 01:06:06 am
Bueno Yo lo haria de esta forma...

Código: [Seleccionar]
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.

 
Los siguientes usuarios dieron las gracias a este tema: cristopher2545


Desconectado Silver_light

Respuesta #3 en: Agosto 03, 2019, 02:07:27 am
Bueno Yo lo haria de esta forma...

Código: [Seleccionar]
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:
  tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
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.
  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 )

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:
Citar
cual seria la manera mas eficiente [...]
No es la mejor manera, pero sigue siendo una solución corta de implementar. <3

 
Los siguientes usuarios dieron las gracias a este tema: cristopher2545


Desconectado 3dgeminis

Respuesta #4 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.
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}


 
Los siguientes usuarios dieron las gracias a este tema: cristopher2545


Desconectado Goganpis

Respuesta #5 en: Agosto 06, 2019, 12:53:12 am
El único problema que tiene este algoritmo es que, la instrucción mas importante:
  tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
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.
  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 )

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

 
Los siguientes usuarios dieron las gracias a este tema: cristopher2545


Desconectado cristopher2545

Respuesta #6 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

Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!