Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Tuxmmer on January 11, 2012, 01:37:11 AM

Title: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 11, 2012, 01:37:11 AM
Hola, Comunidad BennuGD.

En esta ocación pido su ayuda para elaborar un código, péro no sé por dónde empezar.
La lógica del programa sería la siguiente:

Crear una array del tamaño que indique una variable, que contenga de forma igualmente aleatoria unas teclas previamente definidas; por ejemplo:
tx=7;
ArrayTeclas=[tx]=_UP,_DOWN,_RIGHT,_LEFT,_UP,_UP,_LEFT,_DOWN;

Donde los valores designados al array (_UP,_DOWN,_RIGHT,_LEFT...) fueron aleatorios, pero según el valor de tx (8 elementos) Los nobres de las teclas se definene anteriormente en una lista.
¿Me entienden? Ojalá me puedan ayudar, necesito mucho esa parte del código :)
Title: Re: ¿Vector de distancia random con valores random?
Post by: BlySntK on January 11, 2012, 02:30:20 AM
¿Buscas que salgan de manera aleatoria o que pulsando una tecla, el programa sepa cual apretamos...? Si es lo segundo, no será randomizado...
Title: Re: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 11, 2012, 03:08:12 AM
Quote from: BlySntK on January 11, 2012, 02:30:20 AM
¿Buscas que salgan de manera aleatoria o que pulsando una tecla, el programa sepa cual apretamos...? Si es lo segundo, no será randomizado...

Busco que se genere esa lista de forma aleatoria, es una lista de teclas que se deberán pulsar después,no las que se están pulsando en ese momento.
La lista debe generarse de otra lista que contenga las teclas ya definidas. El número de elementos de la lista está sujeto al valor de una variable tx.
Title: Re: ¿Vector de distancia random con valores random?
Post by: Hokutoy on January 11, 2012, 06:10:59 AM
A ver si yo tambien lo entiendo...
Quieres qu en un array de x elementos se queden guardados, de forma aleatoria, elementos (teclas) de otro array predefinido no?
La lista de tecla puede contener teclas repetidas o no se pueden repetir? En el array puede salir Izquierda, Izquierda, Derecha, Izquierda?
Title: Re: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 11, 2012, 06:20:56 AM
Quote from: Hokutoy on January 11, 2012, 06:10:59 AM
A ver si yo tambien lo entiendo...
Quieres qu en un array de x elementos se queden guardados, de forma aleatoria, elementos (teclas) de otro array predefinido no?
La lista de tecla puede contener teclas repetidas o no se pueden repetir? En el array puede salir Izquierda, Izquierda, Derecha, Izquierda?

Sí, pueden repetirse como lo señalas, no importa.
X sería una variable que indicará de cuántos valores será la lista de botones aleatorios, por ejemplo:

tx=3;
ArrayTeclas=[tx]=_UP,_DOWN,_RIGHT,_LEFT;
----------------------------------------------------------------------
tx=5;
ArrayTeclas=[tx]=_UP,_DOWN,_RIGHT,_LEFT,_UP,_UP;
----------------------------------------------------------------------
Title: Re: ¿Vector de distancia random con valores random?
Post by: Hokutoy on January 11, 2012, 07:12:43 AM
Te he apañado un ejemplo a ver si con este te vale para hacer lo que quieres...
LISTA_DE_TECLAS[29] INT ELEGIDA... Vector que contendra tu futura lista de teclas al azar. Para el ejemplo le he puesto un valor maximo de 30 teclas
STRUCT TECLAS[9] INT ELEGIDA... Vector que contiene las teclas predefinidas que tienes que repartir... para el ejemplo he puesto 10 teclas
NUMERO_DE_TECLAS... Numero al azar (de 10 a 20 en el ejemplo) de la cantidad de teclas a repartir.


       
PROGRAM EJEMPLO;

import "mod_video";
import "mod_key";
import "mod_text";
import "mod_time";
import "mod_rand";
import "mod_say";                 

PRIVATE
CONTADOR;
STRUCT LISTA_DE_TECLAS[29] INT ELEGIDA; END= 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
STRUCT TECLAS[9] INT ELEGIDA; END= _A,_B,_C,_D,_E,_SPACE,_UP,_DOWN,_LEFT,_RIGHT;
NUMERO_DE_TECLAS;

BEGIN
    set_mode(320,240,16);
    set_fps ( 60 , 0 );
    rand_seed(TIME());
       
    NUMERO_DE_TECLAS=RAND(10,20);
   
    FOR(CONTADOR=0;CONTADOR<NUMERO_DE_TECLAS;CONTADOR++)
       
            LISTA_DE_TECLAS[CONTADOR].ELEGIDA=TECLAS[RAND(0,9)].ELEGIDA;
            SAY(LISTA_DE_TECLAS[CONTADOR].ELEGIDA);
    END

   
END                                     
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 11, 2012, 08:19:50 AM
Hokutoy, no tienen por que ser STRUCTs, simplemente un vector de INTs.
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 11, 2012, 08:39:14 AM
el codigo seria algo asi...


import "mod_key";
import "mod_time";
import "mod_rand";
import "mod_say";
import "mod_mem"; 

function int * InitRandomKeys( int * key_names, int key_names_len, int out_len )
private
    int i;
    int *out;
begin
    out = alloc( out_len * sizeof(int));
    if (!out) return NULL; end
    for( i = 0; i < out_len; i++ )
        out[i] = key_names[rand( 0, key_names_len - 1 )];
    end
    return out;
end


private
    int keys_names[]= _A,_B,_C,_D,_E,_SPACE,_UP,_DOWN,_LEFT,_RIGHT;
    int *array_teclas=NULL;
    int tx = 20;
    int i;
begin

    rand_seed(time());

    array_teclas = InitRandomKeys(&keys_names, sizeof(keys_names)/sizeof(keys_names[0]), tx );

    if ( array_teclas )
        for ( i = 0; i < tx; i++ )
            say( array_teclas[i] );
        end
        free(array_teclas); // importante liberar la memoria cuando ya no usemos mas el vector
    end
end

Title: Re: ¿Vector de distancia random con valores random?
Post by: Hokutoy on January 11, 2012, 08:43:51 AM
Gracias maestro! Siempre se aprende algo nuevo.
Title: Re: ¿Vector de distancia random con valores random?
Post by: Hokutoy on January 11, 2012, 08:51:10 AM
Quote from: Hokutoy on January 11, 2012, 08:43:51 AM
Gracias maestro! Siempre se aprende algo nuevo.

Pd: Mirandome tu codigo e intentando comprenderlo todo  con ansias de aprender, me puedes explicar que es lo siguiente:
Cuando haces  cosas como:   
int *array_teclas
int *out;

Que significa el *?

Asias
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 11, 2012, 08:53:47 AM
punteros... esto es para luego crear el array/vector de forma dinamica... segun el valor de tx  (segun requerimiento)... y no estar limitado a un valor fijo siempre...
Title: Re: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 11, 2012, 05:20:13 PM
Muchas gracias a los dos, con su ayuda ya supe por dónde era la solución ;) Muy buena.
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 11, 2012, 06:07:33 PM
de nada...

y por donde era?
Title: Re: ¿Vector de distancia random con valores random?
Post by: gecko on January 11, 2012, 06:21:33 PM
(nota mental: no se ve tan dificil los vectores dinamicos... TENGO QUE REESCRIBIR BASTANTE DE MI CODIGO ME PARECE! :P )
Title: Re: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 11, 2012, 06:59:06 PM
Quote from: SplinterGU on January 11, 2012, 06:07:33 PM
de nada...

y por donde era?

:D Con punteros, la cosa era como decias, SplinterGU. Ha quedado muy bien.
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 11, 2012, 07:51:27 PM
bien, me alegro!
Title: Re: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 12, 2012, 06:34:40 AM
Quote from: SplinterGU on January 11, 2012, 07:51:27 PM
bien, me alegro!

Aunque ahora me resultó otro lio, ¿cómo podría mostrar en vez de esos números (75,77,80...) imágenes?
Por ejemplo; un gallo para _SPACE, un cerdito para _LEFT, etcétera.
jeje sonará raro, pero busco hacer un juego de animales de granja, por eso lo de las imágenes.

Gracias una vez más por su ayuda.
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 12, 2012, 12:06:49 PM
simple...


    int keys_names[]= _A,_B,_C,_D,_E,_SPACE,_UP,_DOWN,_LEFT,_RIGHT;
    string keys_names_str[]= "A", "B", "C", "D", "E", "SPACE", "UP", "DOWN", "LEFT", "RIGHT";


y tomas de uno u otro vector segun necesites.
Title: Re: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 13, 2012, 08:20:17 AM
Espero no te esté fastidiando mucho con mis problemas por el foro  :P No me gustaría se piense me gustan las cosas fáciles, pero en ahora que me he aventado algo más complejo no sé por dónde resolverlo. Gracias por su ayuda.

Busco hacer que después te tener el vector aleatorio, espere un segundo para teclear algo; si se presiona una tecla, verificar que esa tecla sea la primera del vector aleatorio, si coincide, entonces elimina ese valor (el primero) del vector aleatorio y recorre los otros datos dando el 2° ahora como el 1° ([0])  y así con los demás valores recorriéndolos hacia la izquierda.Si no coicide la tecla mostrada con la presionada aparecerá un nuevo vector aleatorio, vaciar el vector aleatorio y publicar otro nuevo.
Después dar igualmente otro segundo para presionar lo que ahora sería  el primer valor y así con todos.

Esto daría el efecto de que aparezcan teclas por pantalla, espera un segundo al principio y entre cada tecla para ser presionada, si se presiona bien se elimina y se recorren las teclas a la derecha, sino se presiona bien una tecla de la secuencia del array aleatorio entonces elimina los valores del vector y muestra unos nuevos.


Yo me hice algo así para el bucle de todo el juego, sólo para arriba y abajo, faltarían las otras teclas:
Quotewhile(timer[9]<=100)
        if( key(_UP) )
            timer[9] = 0;
            if( coincidence(_UP) )
                signal( id,s_kill );
                movekey();
            else
                signal( type key_in_window, s_killl );
                new_array();
            end
            if( coincidence(_DOWN) )
                signal( id,s_kill );
                movekey();
            else
                signal( type key_in_window,s_killl );
                new_array();
            end
        end
    end
Y para comprobar hice este código:
Quotefunction int coincidence ( int value_btn ) //Recibe valor de la tecla
begin
    if(array_rand[0]==value_btn) //Si es el primero del vector devuelve True
        say("True");
        for(n=0;n<tx-1;++n) //Recorre los valores del vector random hacia la izquierda
            array_rand[n]=array_rand[n+1];
        end
        return(1);
    else
        return(0); //Si no se encuentra devuelve False
    end
end

Pero no me funciona bien; y ese es el probelma. No sé cómo hacer el ridmo del juego como lo explicaba.
Ahora si no sé por dónde agarrarle, llevo tres semanas con esto y no he dado en una. Por eso expongo todo mi problema y disculpen si los lio mucho. Gracias por su ayuda :)
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 13, 2012, 03:54:35 PM
luego lo miro tranquilo, ahora tengo que salir al medico y no entendi mucho tu problema.

si pones un codigo completo con el error siempre es mejor para diagnosticar tu problema.
Title: Re: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 13, 2012, 06:01:47 PM
Vale. Aquí pongo un código que he echo con su ayuda.
http://www.mediafire.com/file/am2emqcndbp8i0p/test.zip
En él se hace una comparación de las cadenas aleatorias con la cadenas que se escriban, dando tiempo a que pulse.
Lo que yo no consigo hacer es que se elimine la imagen de la tecla en la mira si se presionó bien y se recorran los otros elementos, y en caso de que se pulse una tecla de la secuencia mal; se borre esa lista de teclas y aparezca una nueva secuencia.


Gracias por su ayuda, les estoy muy agradecido y espero pronto pueda sacar esto que ya me tiene mucho tiempo pensando.
Deseando de lo mejor en tu visita al médico :)
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 13, 2012, 09:16:43 PM
tu codigo funciona bien, mira que la linea de arriba de los writes es la de la cola, y la de abajo es la de array_teclas.

una cosa que debes tener en cuenta es, no poner writes dentro de un loop, sin hacer un delete_text de los write previos... los write no son necesarios actualizarlos, se actualizan solos, si apuntan a variables o a punteros.
Title: Re: ¿Vector de distancia random con valores random?
Post by: Tuxmmer on January 13, 2012, 09:27:03 PM
Sí, sí funciona bien, el lio está en que no he podido idearme para hacer que aparezcan teclas por pantalla, espera un segundo al principio y entre cada tecla para ser presionada, si se presiona bien se elimina y se recorren las teclas a la izquierda, sino se presiona bien una tecla de la secuencia del array aleatorio entonces elimina los valores del vector y muestra unos nuevos dando de nuevo un tiempo para presionar el priumer elemento.

El código que armé no espera al principio la respuesta del teclado, no elimina la tecla que se presionó y la recorre, y tampoco crea un nuevo array_teclas si se presionó mal una tecla. Eso es lo que busco, pero no sé por dónde andará la cosa. Espero solucionarle pronto, lo que busco ahora son ideas jeje.

Ojalá me puedan dar soporte para guiarme al solucionar esto, gracias. :)
Title: Re: ¿Vector de distancia random con valores random?
Post by: SplinterGU on January 13, 2012, 11:39:33 PM
ya se que se limpian luego de X tiempo (que no pulsas o tardas en pulsar o pulsas teclas que no son validas), y que las va rotando... por eso digo que funciona...