;------------------------------------------------------------------------------
; desp_barravert - despliega una barra vertical
;------------------------------------------------------------------------------
desp_barravert proc
mov bx,DISPLAY
mov cx,1
lea dx,barravert
mov ah,40h
int 21h
ret
desp_barravert endp
;------------------------------------------------------------------------------
; preg_casilla - pregunta una posicion al jugador
;------------------------------------------------------------------------------
preg_casilla proc
; poner el numero del siguiente jugador en el mensaje
mov al,byte ptr [preg+8]
cmp al,31h
je jug2
mov al,31h
mov byte ptr [preg+8],al
jmp desp_pregunta
jug2: mov al,32h
mov byte ptr [preg+8],al
jmp desp_pregunta
; desplegar mensaje con la pregunta
desp_pregunta: mov bx,DISPLAY
mov cx,p_len
lea dx,preg
mov ah,40h
int 21h
; preguntar posicion
mov bx,KEYBRD
mov cx,buf_len
lea dx,casilla
mov ah,3Fh
int 21h
; checar que la posicion dada por el jugador sea valida
xor ax,ax
mov al,byte ptr [casilla]
cmp al,31h
jl desp_pregunta
cmp al,39h
jg desp_pregunta
mov si,offset(tablero)
add si,ax
sub si,30h
mov bl,byte ptr [si]
cmp al,bl
jne desp_pregunta
; actualizar tablero
mov cl,byte ptr [preg+8]
cmp cl,31h
jne poner_O
mov dl,58h
jmp actualizar
poner_O: mov dl,4Fh
actualizar: mov byte ptr [si],dl
ret
preg_casilla endp
;------------------------------------------------------------------------------
; checar_gano - checa el tablero a ver si ya hay un ganador
;------------------------------------------------------------------------------
checar_gano proc
; primero checar cada una de las combinaciones ganadoras
mov dl,0
empezar_comp: inc dl
cmp dl,1
je comp21
cmp dl,2
je comp22
cmp dl,3
je comp23
cmp dl,4
je comp24
cmp dl,5
je comp25
cmp dl,6
je comp26
cmp dl,7
je comp27
cmp dl,8
je comp28
jmp checar_empate
comp21: mov al,byte ptr [tablero+1]
mov bl,byte ptr [tablero+2]
mov cl,byte ptr [tablero+3]
jmp comparar
comp22: mov al,byte ptr [tablero+4]
mov bl,byte ptr [tablero+5]
mov cl,byte ptr [tablero+6]
jmp comparar
comp23: mov al,byte ptr [tablero+7]
mov bl,byte ptr [tablero+8]
mov cl,byte ptr [tablero+9]
jmp comparar
comp24: mov al,byte ptr [tablero+1]
mov bl,byte ptr [tablero+4]
mov cl,byte ptr [tablero+7]
jmp comparar
comp25: mov al,byte ptr [tablero+2]
mov bl,byte ptr [tablero+5]
mov cl,byte ptr [tablero+8]
jmp comparar
comp26: mov al,byte ptr [tablero+3]
mov bl,byte ptr [tablero+6]
mov cl,byte ptr [tablero+9]
jmp comparar
comp27: mov al,byte ptr [tablero+1]
mov bl,byte ptr [tablero+5]
mov cl,byte ptr [tablero+9]
jmp comparar
comp28: mov al,byte ptr [tablero+3]
mov bl,byte ptr [tablero+5]
mov cl,byte ptr [tablero+7]
jmp comparar
; comparar las tres posicion
comparar: cmp al,bl
je comp_3
jmp linea_dif
comp_3: cmp al,cl
jne linea_dif
linea_igual: cmp al,58h
je gano1
jmp gano2
linea_dif: jmp empezar_comp
; checar si el tablero esta lleno
checar_empate: mov cx,9
ver_usada: mov si,offset(tablero)
add si,cx
mov bx,cx
add bx,30h
xor dx,dx
mov dl,byte ptr [si]
cmp dx,bx
je continuar
loop ver_usada
jmp hayempate
; el juego puede continuar
continuar: mov ax,0
ret
; gana el jugador 1
gano1: mov ax,1
ret
; gana el jugador 2
gano2: mov ax,2
ret
; empate
hayempate: mov ax,3
ret
checar_gano endp
;------------------------------------------------------------------------------
; desp_ganador - despliega un mensaje diciendo quien es el ganador
;------------------------------------------------------------------------------
desp_ganador proc
; primero borrar todos los numeros del tablero, dejar X y O
mov cx,9
ver_usada: mov si,offset(tablero)
add si,cx
mov bx,cx
add bx,30h
xor dx,dx
mov dl,byte ptr [si]
cmp dx,bx
je borrar
jmp seguir
borrar: mov byte ptr [si],20h
seguir: loop ver_usada
; desplegar el tablero
push ax
call desp_tablero
pop ax
cmp ax,3
je empate
add ax,30h
mov byte ptr [ganador+25],al
mov cx,g_len
lea dx,ganador
jmp desplegar
empate: mov cx,e_len
lea dx,empatemsg
desplegar: mov bx,DISPLAY
mov ah,40h
int 21h
ret
desp_ganador endp
cseg ends
;------- Fin del programa -----------------------------------------------------
end main
TERCERA PARTE