Vistas de página en total

sábado, 3 de agosto de 2013

TIC_TAC_TOE (3/5)

   Vais a ver hoy la forma de representar el estado de la jugada. Es el refresh del tablero.
   Podía programar  en esta rutina los bordes del tablero, pero dad que no van a borrarse la pantalla durante el juego, no tiene sentido gastar recursos en redibujar algo que ya está dibujado. Por ello, esta rutina solo rellena el interior del tablero, actualizando las "X" y las "O" según estén los bits de las variables oponente y máquina.
   Como ya se ha podido deducir de la entrada anterior, cada casilla está representada por un bit, partiendo de la segunda, contando desde la esquina superior izquierda.
  Hay nueve casillas, pero como la primera siempre es usada por la máquina como jugada inicial, quedan 8 para elegir. Por eso, un byte =8 bits, nos es suficiente para representar todas las casillas.
  Esta función, por lo tanto analiza cada bit y representa el símbolo.
   Dado que el tablero es idéntico para el oponente y la máquina, podemos utilizar la misma rutina, pasando la variable de máquina o la de oponente, según corresponda. Es por eso que se le pasa a la rutina dos parámetros. El byte con las casillas a presentar, un bit por cada una, y el símbolo a dibujar.

  Se podía haber utilizado un bucle con indices para recorrer las posibilidades, pero no quedaría ni más corto, ni más claro, ni sería más rápido, por lo que mejor lo programo de forma lineal

RUTINA _TABLERO

_tablero proc near
; oponente viene en bl, y el simbolo a imprimir en bh
        mouse off
        shl bl,1
        jnc c2
        gotoxy 12,4
        putchar bh
c2:
        shl bl,1
        jnc c3
        gotoxy 14,4
        putchar bh
c3:
        shl bl,1
        jnc c4
        gotoxy 10,6
        putchar bh
c4:       
        shl bl,1
        jnc c5
        gotoxy 12,6
        putchar bh
c5:
        shl bl,1
        jnc c6
        gotoxy 14,6
        putchar bh
c6:
        shl bl,1
        jnc c7
        gotoxy 10,8
        putchar bh
c7:
        shl bl,1
        jnc c8
        gotoxy 12,8
        putchar bh
c8:
        shl bl,1
        jnc c9
        gotoxy 14,8
        putchar bh
c9:
        mouse on
        ret
_tablero endp

jueves, 1 de agosto de 2013

TIC_TAC_TOE (2/5)

  Hoy voy a colocar la rutina de como pensar la respuesta.
  Como dije en la anterior entrada, esta es la rutina más importante, pues es la que analiza la jugada y toma la decisión correcta. Esta rutina es  realmente el juego.

  La he llamado ver_respuesta.
  A esta rutinano se le pasan parámetros, pues la variable nivel_act, ya es la dirección en la que hay que buscar.
  Esta rutina recorrerá la lista activa, desde el puntero indicado en nivel_act, e irá analizando si el oponente tiene la posición almacenada en la tabla. Si es así almacena la respuesta asociada mediante una "or" con la variable de máquina, para colocar la nueva jugada en el tablero.
  Una vez almacenada la respuesta, verifica si hay puntero a un nuevo nivel, en cuyo caso almacena este nivelen la varible nivel_act, para que sea el nivel a buscar durante la siguiente llamada.
  Si no es así es que el juego ha terminado. Analiza por lo tanto si está en el cuarto nivel, para determinar si es tablas y sale de la rutina indicando en estado el estado de la búsqueda.
   En caso de haber recorrido la tabla y no haber encontrado el estado del oponente, devuelve en estado 0ffh como indicador de error.
  
RUTINA VER_RESPUESTA
(C) José Angel Moneo Fdez

ver_respuesta proc near
; busca la respuesta a la situación del oponente en la tabla correspondiente
; se pasa la dirección de la tabla en nivel_act
; devuelve estado=7 si gana, estado=6 si tablas y estado=4 si sigue el juego
;    0ffh= error
        mov si,nivel_act
comprueba:
        mov al,[si]    ;posibilidad
        cmp al,0        ;error fin de lista. No hay acción
        jne n_error
        mov estado,0ffh   ; marca error
        ret
n_error:
        cmp oponente,al  ;es la jugada hecha?
        je encontrado
sig_estado:
        add si,4   ; siguiente estado
        jmp comprueba
encontrado:
        mov al,[si+1]
        or maquina,al    ;añade al tablero de la máquina la jugada correspondiente
        mov ax,[si+2]    ;dato siguiente estado
        cmp ax,0          ;fin de la partida
        je _fin
        cmp ax,1        ;tablas
        je _fin

        mov nivel_act,ax     ;pasamos el puntero del nivel a la lista del siguiente nivel
        xor al,al
        jmp _fin_ver


_fin:   or  al,2      ; devuelve al=6 si gana y al=7 si tablas
_fin_ver:              
        or  al,4      ;devuelve al=4 si sigue el juego
        mov estado,al
ret
ver_respuesta endp