HispaMSX

Re: [hispamsx] Números aleatorios

2000-10-22 05:05:10
Hola a todos.

Sobre los números aleatorios en ensamblador yo recuerdo que tambien le dí en
su día vueltas al asunto.

Primeramente probé con LD A,R, pero lo que obtienes con eso francamente no
se si se le puede llamar aleatorio, en cualquier caso no sirve, "siempre te
sale lo mismo", y no superó ni un par de pruebas. No obstante, puede servir
si no necesitas más que obtener un par de numeros aleatorios y entre que
pides uno y que pides otro ha pasado suficiente tiempo (que menos de un par
de segundos).

Lo siguiente que probé fué a leer directamente de la posición de memoria
64670 haciendo LD A,(64670). Pero nada, esto igualmente solo sirve si
necesitas un numero aleatorio unicamente de Pascuas a Ramos. Si representas,
como yo hice, en screen 5 (por ej) los numeros que obtienes con este metodo
lo descartas rápidamente porque si eso es aleatorio yo soy cura. Esto es
evidente, por otra parte, pero yo por entonces no lo sabía.

Lo siguiente fue pensar en el reloj del ordenador. Pero claro, no todos los
modelos ni generaciones tienen el relojito para que puedas consultarle la
hora.... O sea, que nada por este lado, por no hablar de que tienes que
hacer llamadas a la ROM y eso consume mucho tiempo, cosa que no suele sobrar
en lo que yo estaba haciendo en aquellos momentos (un juego).

Lo siguiente, y que fué la solución definitiva y la que sigo usando hoy en
día, fué currarme yo por mi mismo el número y pasar de las supuestas ayudas
al respecto que te ofrece el ordenador.

    Para ello me creé una tabla de 255 numeros ordenados por mí
aleatoriamente. Por ejemplo:

    TABLA: DEFB 230, 3, 122, 66, 55, 0, 14, 21, 255 ...

Obviamente no debe haber ninguno repetido y para construir esta tabla pues
se puede hacer a ojo y usando un poco la inteligencia o bien con algo más
sofisticado y complicado (tira del número aleatorio de la calculadora, por
ej.).

    Despues, cada vez que quería un número aleatorio hacía algo así:

    LD HL, INDEX
    LD C, (HL)
    INC (HL)
    LD HL, TABLA
    LD B,0
    ADD HL,BC
    LD A, (HL)              ; EN A OBTIENES EL N ALEATORIO

    De esta manera vas cogiendo cada vez un número: la primera vez el 230,
la segunda el 3, la tercera el 122... (esto en el ejemplo de tabla que puse
anteriormente, claro). En consecuencia se simula el efecto de obtener un
número aleatorio, cosa que por otra parte en realidad sí que estás haciendo,
aunque sea indirectamente.

    Aclarar que se necesita una posicion de memoria, del tipo:

    INDEX: DEFB 0

    Y que esta posicion de memoria hay que inicializarla al principio del
programa. Yo hacía para ello algo así, en las primeras lineas del juego, y
obviamente fuera el bucle del mismo:

    LD A, (64670)
    LD (INDEX),A

    Con estas líneas de codigo se obtiene un numero "aleatorio" de la
posicion 64670 (que como dije, para usarla una vez puede dar el pego para
obtener algo aleatorio) y se guarda en INDEX.

    De esta manera se consigue que cada vez que inicies el juego el valor
INDEX sea diferente y en consecuenia empezarás a leer de la tabla TABLA cada
vez de una posición tambien diferente. Esto es importante ya que si se
empieza a leer la secuencia siempre desde el mismo sitio al final en el
juego siempre empezaría pasando lo mismo cada vez que jugaras, por que los
números "aleatorios" los obtendrías partida tras partida en el mismo orden.

    Esto es la idea basica. Luego tambien están otros trucos como que si no
quieres molestarte en hacer una secuencia aleatoria de números puedes hacer
que TABLA apunte a un fragmento de tu programa (un fragmento que no sea de
datos, claro, pues allí pudiera haber por ejemplo muchos 0 seguidos, lo cual
estropearía el efecto de "aleatoriedad"), o si quieres hacer una tabla pero
no de 255 numeros sino de 128 pues tendrías que poner el código tal que así:

    LD HL, INDEX
    LD C, (HL)
    INC (HL)
    RES 7,(HL)              ;ESTA SERÍA LA LINEA NUEVA A INTRODUCIR
    LD HL, TABLA
    LD B,0
    ADD HL,BC
    LD A, (HL)              ; EN A OBTIENES EL N ALEATORIO

    Y si quieras hacer la tabla de menos números todavía, como 64 o 32, pues
deberías poner a 0 los bits correspondientes: el 7 y el 6 para 64 y el 7, el
6 y el 5 para 32. Por ejemplo, para una tabla con 32 numeros, quedaría algo
así:

    LD HL, INDEX
    LD C, (HL)
    LD A, C
    AND &B00011111
    LD (HL),A
    LD HL, TABLA
    LD B,0
    ADD HL,BC
    LD A, (HL)              ; EN A OBTIENES EL N ALEATORIO

    Bueno, esto lo he hecho de cabeza, espero no haber metido la pata. Y
espero que se me haya entendido algo despues del pedazo de rollo que he
metido... Me he encontrado cómodo aquí en plan entendido en pájaras preñadas
y casi hago la tesis sobre la generación de un maldito número aleatorio....

    Y son las 5 de la mañana, joder... debo estar loco.

    En fin, un saludo a todos.

    Marcos Vega.



<Anterior en la conversación] Conversación actual [Siguiente en la conversación>