Diciembre 21, 2014, 04:34:20 PM Ultima modificación: Marzo 09, 2015, 04:13:34 PM por Granaino81
Buenas a todos

Estoy intentando crear objetos aletorios y unicos de entre una lista de 3 posibles objetos. Para verlo más claro: en el juego tenemos 3 habitaciones, en cada una de ellas saldra siempre un objeto de entre estos 3, pero no se podran repetir.

Por ahora he creado un codigo que da un numero aleatorio del 1 al 3, cada numero sera uno de los objetos y si no se ha usado antes, lo crea y cambia la variable para que no se pueda repetir.



randomize()
CofreElegido = irandom_range (1,3)



if CofreElegido = 1 && global.Cofre_Llave = 0
{
instance_create(x,y,Cofre_Llave_OBJ)
global.Cofre_Llave = 1
}


if CofreElegido = 2 && global.Cofre_Arma = 0
{
instance_create(x,y,Cofre_Arma_OBJ);
global.Cofre_Arma = 1
}


if CofreElegido = 3 && global.Cofre_Vida = 0
{
instance_create(x,y,Cofre_Vida_OBJ);
global.Cofre_Vida = 1
}




El problema es que no se como mandar que si sale el numero correspondiente a un objeto ya creado, repita la operacion hasta que salga uno que si sea nuevo... lo queria hacer con una orden estilo goto (para que vaya al principio del codigo hasta que lo consiga) pero no existe en GMS hasta donde he investigado


el goto se ha ido eliminando de los lenguajes de programación por que volvía los programas literalmente un m**rdero difícil de manejar, te recomiendo que estudies las estructuras while, do y for, para que puedas usar ese "reemplazo del goto" que estas buscando

una manera interesante de hacer eso que tu dices seria crear una lista (list) con los valores en orden 1,2,3...

luego desordenarlos (hay una función para eso)

y ir leyendo los valores en orden cada ves que se abra un cofre, por ejemplo, si abres el primer cofre, lees la primera posición (y le sumas un +1 a una variable de conteo)

y cuando vayas a abrir el segundo cofre, se lee la segunda posición, creando el objeto en consecuencia.

aqui te dejo la referencia de las listas:
http://docs.yoyogames.com/source/dadiospice/002_reference/data%20structures/ds%20lists/index.html
entra a!:

Desconocia por completo esa funcion.

Es justo lo que necesitaba! muchas gracias!  :D

En cuanto la implemente, podre la solucion al problema por si a alguien le pueda interesar

Gracias!

Para quien pueda interesarle, ya lo tengo solucionado:

Primero creo una lista, en mi caso en un evento "create" al principio del juego. Tendra numeros del 1 al 4 y mezclados de forma aleatoria


global.Lista_Cofres = ds_list_create()          //Crea lista con ese nombre
ds_list_add(global.Lista_Cofres, 1, 2, 3, 4);  //Añade numeros 1 2 3 4
randomize()
ds_list_shuffle(global.Lista_Cofres);            //Mezcla los valores


Despues creo un objeto donde ira un evento "Draw", donde se elegira el primer valor de la lista, creara un cofre a consecuencia y eliminara ese valor, siendo el proximo valor totalmente nuevo. Evito asi que se repitan los valores y por tanto los cofres


Cofre = ds_list_find_value(global.Lista_Cofres,0); //Define cofre como el primer elemento de la lista

if Cofre = 1
{action_change_object(Cofre_Arma_OBJ,true);
ds_list_delete(global.Lista_Cofres, 0);
}

if Cofre = 2
{action_change_object(Cofre_Vida_OBJ,true);
ds_list_delete(global.Lista_Cofres, 0);
}

if Cofre = 3
{action_change_object(Cofre_Mental_OBJ,true);
ds_list_delete(global.Lista_Cofres, 0);
}

if Cofre = 4
{action_change_object(Cofre_LlavePeque_OBJ,true);
ds_list_delete(global.Lista_Cofres, 0);
}


Con esto consigo que con un unico objeto, se creen todos los cofres siempre y cuando se repita el objeto tantas veces como elementos tenga la lista, nunca mas! que si no da error claramente.

Si no me he explicado bien o si teneis dudas, comentadlo