Espero que os guste.
TIC_TAC_TOE.ASM
; Copyright (C) 2013 José Ángel Moneo Fernández ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/>.
title tic_tac_toe
include main.mac
include stdio.mac
include string.mac
include time.mac
include mouse.mac
.286 ; para poder usar shr al,3
tablero macro jugador,simbolo
push bx
mov bl,jugador
mov bh,simbolo
call _tablero
pop bx
endm
.model compact,pascal
.stack 100
.data
;Mapa de juego
;significado tabla
; oponente,respuesta,siguiente lista(2 byte)
;significado siguiente lista si
; offset ->continual el juego en otro nivel
; 0-> ha finalizado el juego
; 1-> si la situación de la máquina es 30h
; 2-> si la situación de la máquina es 90H
;significado respuesta
; si <>0 es posición de respuesta
; si =0 no hay respuesta. Son tablas
nivel1 db 80h,20h
dw offset n2_20h
db 40h,20h
dw offset n2_20h
db 20h,80h
dw offset n2_80h
db 10h,80h
dw offset n2_80h
db 8,10h
dw offset n2_10h
db 4,80h
dw offset n2_80h
db 2,40h
dw offset n2_40h
db 1,40h
dw offset n2_40h
n2_10h db 9,40h
dw offset n3_40h
db 88h,1,0,0
db 48h,1,0,0
db 28h,1,0,0
db 0ch,1,0,0
db 0ah,1,0,0
dd 0
n2_20h db 84h,10h
dw offset n3_10h_1
db 44h,10h
dw offset n3_10h_2
db 0c0h,4,0,0
db 90h,4,0,0
db 88h,4,0,0
db 82h,4,0,0
db 81h,4,0,0
db 50h,4,0,0
db 48h,4,0,0
db 42h,4,0,0
db 41h,4,0,0
dd 0
n2_40h db 82h,10h
dw offset n3_10h_3
db 81h,4
dw offset n3_4h
db 22h,80h,0,0
db 21h,80h,0,0
db 12h,80h,0,0
db 11h,80h,0,0
db 0ah,80h,0,0
db 9,80h,0,0
db 6,80h,0,0
db 5,80h,0,0
db 3,80h,0,0
dd 0
n2_80h db 60h,10h
dw offset n3_10h_3
db 44h,10h
dw offset n3_10h_3
db 50h,4
dw offset n3_4h
db 30h,40h,0,0
db 28h,40h,0,0
db 24h,40h,0,0
db 22h,40h,0,0
db 21h,40h,0,0
db 0ch,40h,0,0
db 18h,40h,0,0
db 14h,40h,0,0
db 12h,40h,0,0
db 11h,40h,0,0
db 6,40h,0,0
db 5,40h,0,0
dd 0
n3_4h db 70h,8
dw offset n4_8h
db 58h,20h,0,0
db 52h,20h,0,0
db 51h,20h,0,0
db 0a1h,10h,0,0
db 91h,20h,0,0
db 89h,20h,0,0
db 83h,20h,0,0
n3_10h_1 db 0c4h,8,0,0
db 85h,8,0,0
db 8ch,1,0,0
db 86h,8,0,0
dd 0
n3_10h_2 db 0c4h,8,0,0
db 4ch,1,0,0
db 86h,8,0,0
db 85,8,0,0
dd 0
n3_10h_3 db 0c4h,2,0,0
db 0c2h,1,0,0
db 0c8h,2,0,0
db 0c1h,2,0,0
db 4ch,2,0,0
db 86h,1,0,0
db 85h,2,0,0
db 8ah,4,0,0
db 83h,4,0,0
db 0a2h,4,0,0
db 61h,2,0,0
db 62h,1,0,0
db 64h,2,0,0
db 68h,2,0,0
db 46h,1,0,0
db 45h,2,0,0
dd 0
n3_40h db 89h,4,0,0
db 29h,80h,0,0
db 0dh,80h,0,0
db 0bh,80h,0,0
dd 0
n4_8h db 72h,1,1,0
db 71h,2,1,0
dd 0
nivel_act dw 0 ; almacen de puntero de nivel actual
maquina db 0 ; situación de la maquina
oponente db 0 ; situación del oponente
ocupados db 0 ; estado ocupados
estado db 0; estado partida
posx db 0 ; posicion pulsación del raton
posy db 0
raton dw 0
titulo db "TRES EN LINEA",0
ayuda db "PULSA CON EL RATON EN LA POSICION DESEADA",0
m_gana db "Lo siento has perdido.",0
m_tablas db "Esta partida son tablas",0
m_error db " Ha surgido un error",0
tablero1 db 201,205,203,205,203,205,187,0 ; "╔═╦═╦═╗"
Tablero2 db 186,32,186,32,186,32,186,0 ; "║ ║ ║ ║"
Tablero3 db 204,205,206,205,206,205,185,0 ; "╠═╬═╬═╣"
Tablero4 db 200,205,202,205,202,205,188,0 ; "╚═╩═╩═╝
NW_intento db "Quieres intentarlo de nuevo? S/N",0
.code
tic_tac_toe proc far
main ; inicia
setcursor off
resmouse
mouse off
putmouse 8,8
nw:
;inicia tablero
clrscr
gotoxy 9,1
puts titulo
gotoxy 9,2
puts ayuda
gotoxy 9,3
puts tablero1
gotoxy 9,4
puts tablero2
gotoxy 9,5
puts tablero3
gotoxy 9,6
puts tablero2
gotoxy 9,7
puts tablero3
gotoxy 9,8
puts tablero2
gotoxy 9,9
puts tablero4
gotoxy 10,4
putchar 'X'
mov maquina,0
mov oponente,0
mov nivel_act,offset nivel1
otra:
tablero oponente,'O'
tablero maquina,'X'
;espera seleccion oponente
mouse on
espera:
waitmousexy 10,4,4,4
cmp al,0ffh
jz espera
shr ah,1 ; divide por 2 ya que el tablero es de dos caracteres
mov posx,ah
shr al,1 ; divide por 2 ya que el tablero es de dos caracteres
mov posy,al
;coloca el bit
mov al,posy ; posy*3+posx
add al,posy
add al,posy
add al,posx
cmp al,8 ; si pulsamos fuera no procesamos
ja espera
mov cl,al
xor al,al ; borra al
stc ; carry a 1
rcr al,cl ; situa el bit elegido
; comprueba que no esté seleccionada ya
mov ah,oponente
or ah,maquina
mov ocupados,ah
or ah,al ;montamos nuevo bit
cmp ah,ocupados ; ha añadido bit nuevo?
je espera ; si no añade bit nuevo la posición está ya estaba ocupada
or oponente,al ; guarda la jugada
call ver_respuesta
;presentamos la nueva posición del tablero
;si estado = 4 sigue el juego
cmp estado,4
jne sig01
jmp otra
sig01:
;si estado=6 gana
cmp estado,6
je gano
cmp estado,0ffh
jne acierto
gotoxy 10,20 ;error
puts m_error
jmp acabo
acierto:
;si estado=7 tablas
gotoxy 10,20 ;ha acertado
puts m_tablas
jmp acabo
gano:
mouse off
gotoxy 10,20 ;ha acertado
puts m_gana
acabo:
tablero oponente,'O'
tablero maquina,'X'
gotoxy 10,21
puts nw_intento
getch al ;espera pulsación antes de salir
upr ;convierte al en mayusculas
cmp al,'S'
jne salir
jmp nw
salir: setcursor on
mouse off
exit 0
tic_tac_toe endp
proc ver_respuesta
; busca la respuesta a la situación del oponente en la tabla correspondiente
; se pasa la dirección de la tabla en si
; 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
proc _tablero
; 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
end tic_tac_toe
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.