Vistas de página en total

89910

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

No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.