¿Vector de distancia random con valores random?

Started by Tuxmmer, January 11, 2012, 01:37:11 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Tuxmmer

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 :)

BlySntK

¿Buscas que salgan de manera aleatoria o que pulsando una tecla, el programa sepa cual apretamos...? Si es lo segundo, no será randomizado...
Esnucándote contra la pared no sé si conseguiré mucho, mejor lo pruebo y salímos de dudas ^_^
-------------------------------------------------------
Blaisantka Games > (Official developer web site)

Tuxmmer

#2
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.

Hokutoy

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?

Tuxmmer

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;
----------------------------------------------------------------------

Hokutoy

#5
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                                     

SplinterGU

Hokutoy, no tienen por que ser STRUCTs, simplemente un vector de INTs.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

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

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hokutoy

Gracias maestro! Siempre se aprende algo nuevo.

Hokutoy

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

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Tuxmmer

Muchas gracias a los dos, con su ayuda ya supe por dónde era la solución ;) Muy buena.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

gecko

(nota mental: no se ve tan dificil los vectores dinamicos... TENGO QUE REESCRIBIR BASTANTE DE MI CODIGO ME PARECE! :P )
Torres Baldi Studio
http://torresbaldi.com

Tuxmmer

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.