Buscar una secuencia

Started by Drumpi, June 04, 2010, 01:18:10 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:

Pregunta de exámen para aquellos que saben métodos de programación.
Estoy haciendo un juego que tiene algo similar a una combinación de movimientos para hacer un golpe, para lo que tengo un buffer de "últimas teclas pulsadas" y varios arrays con las secuencias que corresponden a cada ataque.

1-Si yo declaro:
byte combinaciones[2][4]=1,5,3,
6,4,2,
9,3,1,
9,7,2,
3,1,7;
¿lo e inicializado bien o he confundido el orden de los índices como siempre?

2-¿Cual es la mejor forma de comparar el buffer circular con dichos arrays? Lo único que se me ocurre es que COMBINACIONES esté ordenado de menor a mayor (según el primer byte, luego el segundo...) de manera que si el primer byte de la cadena es mayor que el primero del buffer es que hemos terminado.

3-Supongo que no hay una función que me compare los datos del tirón, teniendo en cuenta que uso un buffer circular (array con un índice que vuelve al principio si detecta que está al final).

Gracias.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

grisendo

#1
A riesgo de meter la pata: yo creo que el punto 1 está bien:
Lo que tienes es un array de 4 (+1) elementos de <<algo>>... ¿qué es ese <<algo>>? un array de 2 (+1) elementos. Con lo cual el orden parece correcto.

En el 3 creo que no hay forma de hacerlo directamente (igual me equivoco)

Para el punto 2, en cuanto a uso de memoria lo que dices está bien (orden N), y con lo de ordenarlos para terminar antes, es una buena optimización de velocidad.

Siendo "nazis" en velocidad... lo mejor sería un árbol/máquina de estados. De forma chapucera para hacerte una idea (aunque ocupa bastante más memoria) sería hacer algo así (memoria orden EXP, velocidad orden K):

[code language="bennu"]byte combinaciones[9][9][9];
for... // todos los elementos de combinaciones a ceros;
combinaciones[1][5][3] = id_combo1 (distinto de cero);
combinaciones[6][4][2] = id_combo2 (distinto de cero);
...
[/code]
De esta forma si en esa posición hay algo distinto de cero, ejecutas el combo correspondiente a id_combo. Aunque la memoria crece exponencialmente con el número de golpes, pero haciendo un árbol real no habría ese problema, perdiendo un poquito de velocidad (memoria orden N, velocidad orden LOG_N) pero a fin de cuentas mejor que la versión que propones... y más complicado de implementar también :D

SplinterGU

has confundido el orden de las dimensiones.

lo que creaste es un array de 3 filas y 5 columnas, segun lo que se ve en la forma en que escribiste los valores, necesitas que sea al reves,
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Gracias a los dos por la ayuda (ya sabía yo que...).

He estado echando cuentas, y me parece que un algoritmo de búsqueda normal no procede, pues no se usan todos los valores numéricos en el primer dato, y la cosa está bastante descompensada. Pero sí, lo de ordenar es lo mejor que puedo hacer.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

grisendo

Quote from: SplinterGU on June 04, 2010, 03:14:04 PM
has confundido el orden de las dimensiones.

lo que creaste es un array de 3 filas y 5 columnas, segun lo que se ve en la forma en que escribiste los valores, necesitas que sea al reves,

¿Esto es así también en C o sólo es una rareza de Bennu por compatibilidad con Fenix/DIV??? Como lo de la posición "extra" en los vectores o el ángulo en milésimas de grado

SplinterGU

asi es el lenguaje heredado.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2