Miren, estoy haciendo un simple juego de memoria, el típico "memory" de juntar parejas. Y no se me ocurre una manera (facilita) de colocar las tarjetitas aleatoriamente en la cuadrícula

Tengo un objeto para cada tarjeta, se me ocurre alguna manera, pero es demasiado comerme la olla, seguro que hay alguna manera buena y eficaz :B


Grachie :B
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

puedes usar arrays, o list, o queues o maps... o casi cualquiera de esas estructuras de datos.

hay muchas maneras, deberias primero comentar que tienes en mente o por lo menos intentar ponerlo a prueba antes de preguntar.
entra a!:

a ver, repito, que puedo hacerlo tranquilamente, pero que la manera en que se me ocurre es una parrafada, apenas he usado listas y aun no las domino, por eso pregunto.

La idea ya la he dicho, tengo un grupo de objetos y quiero que se coloquen de forma aleatoria, dentro del "tablero" sin que haya una encima de otra y eso
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Se me ocurre esto. Primero guarda las imágenes de las tarjetas como sub-imágenes de un sprite, después crea un objeto tarjeta y un objeto controlador, en el controlador crea un ds_list y agrega los números de las sub-imágenes:
[gml]
lista = ds_list_create();

for( i=0; i<sprite_get_number(spr_x); i+=1 )
{
    repeat(2)
    ds_list_add( lista, i );
}
[/gml]
se pone repeat(2) porque cada número debe estar 2 veces.

Después desordena la lista y crea las instancias tarjeta:
[gml]
ds_list_shuffle( lista );

k = 0;
for( j=100; j<1000; j+=100 )
for( i=100; i<1000; i+=100 )
{
    with instance_create( i,j, obTarjeta )
    image_index = ds_list_find_value( lista, other.k );
   
    k += 1;
}
[/gml]

sry, el sistema de las parejas ya lo tengo hecho, y no uso el sprite, va por identificación de objeto, tengo por ejemplo:
tarjeta1A, tarjeta1B.
tarjeta2A, tarjeta2B...

Me explico? :B

Y por ejemplo, tengo esas 4 tarjetas y tengo 4 posiciones
1- x=4; y=4;
2- x=8; y=4;
3- x=4; y=8;
4- x=8; y=8;

Pues con todo esto preparado, es lo que busco exactamente
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

kostra es exactamente lo que hace la segunda parte del codigo que te paso clamud.

[gml]
ds_list_shuffle( lista );//con nuestra lista ya creada y revuelta procedemos a crear las cartas

k = 0;
for( j=1; j<=2; j+=1 )
for( i=1; i<=2; i+=1 )
{
    with instance_create( i*4,j*4, obTarjeta )
    /*image_index = ds_list_find_value( lista, other.k );*/ //lo dejo por si te funciona
    carta=ds_list_find_value(lista, other.k )//donde carta es el valor que tendra esa carta
    k += 1;
}
[/gml]

el codigo de clamud es para crear instancias y agregarles una variable con que tipo de carta son,esta es la manera mas eficiente, un objeto al que se le asigna un valor y apartir de hay hace algo.

ahora bien si tienes un objeto por carta, que no es nada eficientes por temas de reescritura de codigo, tendrias que usar un switch, del largo de cantidad de objetos por cartas tengas (por eso digo que no es muy eficiente).

[gml]
ds_list_shuffle( lista );//con nuestra lista ya creada y revuelta procedemos a crear las cartas

k = 0;
for( j=1; j<=2; j+=1 )
for( i=1; i<=2; i+=1 )
{
    carta=ds_list_find_value(lista, k)//donde carta es el valor que tendra esa carta
    switch (carta)
    {
     case 1:
     instance_create( i*4,j*4, obTarjeta1);
     break;
     case 2:
     instance_create( i*4,j*4, obTarjeta2);
     break;
     .
     .
     .
     case n:
     instance_create( i*4,j*4, obTarjetan);//es tajeta a la n,  no tarjetan XD
     break;
    }
    k += 1;
}
[/gml]
y como ves arriba te acabo de mostrar porque un objeto por carta es lo mas ineficiente que puedes hacer, parece comodo al principio, pero luego pasa lo de arriba.
ps: los codigos que pase son los de clamud adaptados a tu ejemplo
no puedo creer que me hice un tumblr.
YGE Productions yep, otro tumblr.
y como no, el manual tambien

En GMS los mejor es usar pocos objetos, eso lo comprobó MegaG:
http://www.comunidadgm.org/preguntas-y-respuestas/tarda-demasiado-en-cargar-en-android/

Si aún quieres usar un objeto por carta, en lugar agregar los índices manualmente podrías usar un script como este:
http://www.gmlscripts.com/script/map_objects
cambiando algunas cosas, como usar una ds_lista o arreglo en vez de un ds_map, y agregando una condición extra para no listar los objetos que no son cartas, con la función object_get_parent.

pues va ser que no me sale xD

Es decir, bien, crea la cuadricula bien, se posicionan bien pero... en ocasiones, las cartas se repiten (cosa que no quiero, cada carta es única y ha de aparecer una sola vez, por eso tantos objetos), además, en ocasiones, hay lugares que quedan vacíos, no sé si porque se pondrá una tarjeta encima de otra o que no se pone ahi directamente :/

https://gyazo.com/5b48a59fbc3b00402b4b512872143ed9

este es el código que quedó al yo editarlo como pienso que se edita... muy probable que haya hecho un fail xD
[gml]///place cards
lista = ds_list_create();

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

ds_list_shuffle( lista );//con nuestra lista ya creada y revuelta procedemos a crear las cartas

k = 0;
for( j=1; j<=4; j+=1 )
for( i=1; i<=5; i+=1 )
{
    carta=ds_list_find_value(lista, k)//donde carta es el valor que tendra esa carta
    switch (carta)
    {
     case 1:
     instance_create( i*284,j*284, oqparrotA);
     show_message("placed");
     break;
     case 2:
     instance_create( i*284,j*284, oqparrotB);
     break;
     case 3:
     instance_create( i*284,j*284, oqpenguinA);
     break;
     case 4:
     instance_create( i*284,j*284, oqpenguinB);
     break;
     case 5:
     instance_create( i*284,j*284, oqpigA);
     break;
     case 6:
     instance_create( i*284,j*284, oqpigB);
     break;
     case 7:
     instance_create( i*284,j*284, oqrabbitA);
     break;
     case 8:
     instance_create( i*284,j*284, oqrabbitB);
     break;
     case 9:
     instance_create( i*284,j*284, oqsnakeA);
     break;
     case 10:
     instance_create( i*284,j*284, oqsnakeB);
     break;
     case 11:
     instance_create( i*284,j*284, oqelephantA);
     break;
     case 12:
     instance_create( i*284,j*284, oqelephantB);
     break;
     case 13:
     instance_create( i*284,j*284, oqgiraffeA);
     break;
     case 14:
     instance_create( i*284,j*284, oqgiraffeB);
     break;
     case 15:
     instance_create( i*284,j*284, oqhippoA);
     break;
     case 16:
     instance_create( i*284,j*284, oqhippoB);
     break;
     case 17:
     instance_create( i*284,j*284, oqmonkeyA);
     break;
     case 18:
     instance_create( i*284,j*284, oqmonkeyB);
     break;
     case 19:
     instance_create( i*284,j*284, oqpandaA);
     break;
     case 20:
     instance_create( i*284,j*284, oqpandaB);
     break;
    }
    k += 1;
}[/gml]
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Diciembre 21, 2015, 01:05:11 PM
pues va ser que no me sale xD

Es decir, bien, crea la cuadricula bien, se posicionan bien pero... en ocasiones, las cartas se repiten (cosa que no quiero, cada carta es única y ha de aparecer una sola vez, por eso tantos objetos), además, en ocasiones, hay lugares que quedan vacíos, no sé si porque se pondrá una tarjeta encima de otra o que no se pone ahi directamente :/

https://gyazo.com/5b48a59fbc3b00402b4b512872143ed9

este es el código que quedó al yo editarlo como pienso que se edita... muy probable que haya hecho un fail xD
[gml]///place cards
lista = ds_list_create();

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

ds_list_shuffle( lista );//con nuestra lista ya creada y revuelta procedemos a crear las cartas

k = 0;
for( j=1; j<=4; j+=1 )
for( i=1; i<=5; i+=1 )
{
    carta=ds_list_find_value(lista, k)//donde carta es el valor que tendra esa carta
    switch (carta)
    {
     case 1:
     instance_create( i*284,j*284, oqparrotA);
     show_message("placed");
     break;
     case 2:
     instance_create( i*284,j*284, oqparrotB);
     break;
     case 3:
     instance_create( i*284,j*284, oqpenguinA);
     break;
     case 4:
     instance_create( i*284,j*284, oqpenguinB);
     break;
     case 5:
     instance_create( i*284,j*284, oqpigA);
     break;
     case 6:
     instance_create( i*284,j*284, oqpigB);
     break;
     case 7:
     instance_create( i*284,j*284, oqrabbitA);
     break;
     case 8:
     instance_create( i*284,j*284, oqrabbitB);
     break;
     case 9:
     instance_create( i*284,j*284, oqsnakeA);
     break;
     case 10:
     instance_create( i*284,j*284, oqsnakeB);
     break;
     case 11:
     instance_create( i*284,j*284, oqelephantA);
     break;
     case 12:
     instance_create( i*284,j*284, oqelephantB);
     break;
     case 13:
     instance_create( i*284,j*284, oqgiraffeA);
     break;
     case 14:
     instance_create( i*284,j*284, oqgiraffeB);
     break;
     case 15:
     instance_create( i*284,j*284, oqhippoA);
     break;
     case 16:
     instance_create( i*284,j*284, oqhippoB);
     break;
     case 17:
     instance_create( i*284,j*284, oqmonkeyA);
     break;
     case 18:
     instance_create( i*284,j*284, oqmonkeyB);
     break;
     case 19:
     instance_create( i*284,j*284, oqpandaA);
     break;
     case 20:
     instance_create( i*284,j*284, oqpandaB);
     break;
    }
    k += 1;
}[/gml]


ese reapeat(20) dentro del for para que es? estas añadiendo 20 ceros, 20 unos....20 veintes, entonces estas creando una lista con 400 valores, de los cuales solo estas tomando 20, obviamente te saldran repetidos algunos y otros no saldran nunca.

ademas en tu case no estas evaluado el valor 0, por lo que de hay que tengas espacios vacios. que son los 20 ceros que añadiste en tu for anterior.

si quieres añadir 20 cartas random y no 400 no coloces ese repeat(20), clamud y yo te pusimos ese repeat porque dijiste que querias un memoria, en donde hay una pareja por carta, repeat(2).
no puedo creer que me hice un tumblr.
YGE Productions yep, otro tumblr.
y como no, el manual tambien

Aaah es por esooo xD entonces sobra, pues, no es una carta por pareja, son dos xD
estoy ocupadillo con otros proyectos prioritarios, mañana miro y posteo, gracias :B
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]