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 :)
¿Buscas que salgan de manera aleatoria o que pulsando una tecla, el programa sepa cual apretamos...? Si es lo segundo, no será randomizado...
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.
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?
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;
----------------------------------------------------------------------
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
Hokutoy, no tienen por que ser STRUCTs, simplemente un vector de INTs.
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
Gracias maestro! Siempre se aprende algo nuevo.
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
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...
Muchas gracias a los dos, con su ayuda ya supe por dónde era la solución ;) Muy buena.
de nada...
y por donde era?
(nota mental: no se ve tan dificil los vectores dinamicos... TENGO QUE REESCRIBIR BASTANTE DE MI CODIGO ME PARECE! :P )
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.
bien, me alegro!
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.
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.
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 :)
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.
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 :)
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.
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. :)
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...