Este, por lo tanto, es el fichero .asm completo que habrá que compilar.
En el usamos funciones de time, de stdio, de string, y de main.
El ejecutable resulta de 5232 Bytes
Es importante pedir la letra con getch, la almacenamos en letra, y luego la convertimos en mayúsculas con upr.
El programa está preparado para ser un .exe. Para que sea .com debemos colocar la directiva "_modelo com" y linkarlo con una librería preparada para .com.
Esta librería se formará compilando todas las rutinas expuestas anteriormente pero con esta directiva. y creando luego una libreria completa para .com
En el caso de que se compile como .com habrá que pasar los datos al final del programa. Esto no lo podemos hacer ahora, pues se producen problemas de compilación.
AHORCADO.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/>.
include main.mac
include stdio.mac
include string.mac
include time.mac
_modelo exe
_stack 250
_data
;palabras
p1 db 9,"BARCELONA",0
P2 DB 4,"CASA",0
P3 DB 4,"CAMA",0
P4 DB 5,"ARBOL",0
P5 DB 7,"ARMARIO",0
P6 DB 5,"COJIN",0
P7 DB 5,"SUELO",0
P8 DB 4,"FLOR",0
P9 DB 3,"PAN",0
P10 DB 11,"ENCRUCIJADA",0
P11 DB 4,"HOJA",0
P12 DB 8,"CUADERNO",0
P13 DB 11,"ENSAMBLADOR",0
P14 DB 8,"PROGRAMA",0
P15 DB 7,"COLEGIO",0
P16 DB 6,"CAMARA",0
TABLA DW OFFSET P1
DW OFFSET P2
DW OFFSET P3
DW OFFSET P4
DW OFFSET P5
DW OFFSET P6
DW OFFSET P7
DW OFFSET P8
DW OFFSET P9
DW OFFSET P10
DW OFFSET P11
DW OFFSET P12
DW OFFSET P13
DW OFFSET P14
DW OFFSET P16
PAL_SEL DW 0
mascara DB "__________________________",0
a_buscar dw 0
letra db 0
fallos db 0
titulo db "AHORCADO",0
pregunta db "INDICA UNA LETRA",0
acierto db "!Enhorabuena! Acertaste",0
perdio db "!Lo siento! Has periddo",0
NW_intento db "Quieres intentarlo de nuevo? S/N",0
limpia db " ",0
HORCA DB 218,196,196,196,0 ;"┌───┐"
_code
ahorcado proc far
main ; inicia
nw:
call nw_pal ;gernera una nueva palabra
mov fallos,0 ;coloca el contador fallos a 0
;Preparamos la pantalla
clrscr
gotoxy 10,2 ;dibujamos horca
puts titulo
gotoxy 8,4
puts horca
gotoxy 8,5
putchar 179
gotoxy 8,6
putchar 179
gotoxy 8,7
putchar 179
gotoxy 8,8
putchar 179
gotoxy 8,9
putchar 193
gotoxy 10,10 ; muestra la mascara incial
puts mascara
gotoxy 10,13 ; hacemos la pregunta
puts pregunta
_otro:
gotoxy 29,13 ;limpia la ultima respuesta
puts limpia
gotoxy 29,13
getch letra ;pedimos la letra
upr letra ;convierte en mayuscula
call buscar ;busca la letra
cmp bh,1 ; 1 si encuentra la letra
je bien
inc fallos ; cuenta un fallo
cmp fallos,8
jne bien
;perido el juego
gotoxy 11,4
putchar 191 ;"┐" ;dibuja la horca
gotoxy 10,20 ;Perdiste
puts perdio
jmp nw_int
bien:
gotoxy 10,10
puts mascara
call muneco
cmp bl,1 ;1 si faltan letras
jne _fin ; estrucutra de saltos debido a que el salto relativo no llega hasta _otro
jmp _otro
_fin:
gotoxy 10,20 ;ha acertado
puts acierto
nw_int:
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: exit 0
endp
nw_pal proc near
push di
push si
random
and ax,0fh ; tomo numeros >16
shl ax,1 ;multiplico por dos
add ax,offset tabla ;indexo a la tabla de punteros a palabras
mov si,ax ;paso la dirección a 'SI' para indexar
mov ax,[si] ; recupero la dirección de la palabra de la tabla de punteros
mov pal_sel,ax ; almaceno la dirección de la palabra
mov si,ax ; paso esta dirección a si para indexar
mov di,offset mascara ; usa 'DI' como indexador de mascara
mov al,[si] ; leo el numero de letras de la palabra
ini:
mov byte ptr [di],'_' ;borra la mascara
inc di ; incrementamos puntero busqueda
dec al ; decremento el número de letras
jnz ini
mov byte ptr [di],0 ; pongo final de cadena
pop si
pop di
ret
nw_pal endp
; busca la letra
; devuelve bl=1 si la encuentra la letra
; bh=1 si faltan letras
buscar proc near
push di
push si
push cx
mov bx,0 ;borra banderas
mov si,pal_sel
mov di,offset mascara
mov cl,[si] ;numero de letras a contador de busqueda
inc si ;salta la longitud de la palabra
prueba:
mov al,letra
cmp byte ptr [si],al ;comprueba la letra pasada en al
jne otra
mov [di],al ; almacena la letra en mascara
mov bh,1 ; marca bandera letra encontrada
otra:
cmp byte ptr [di],"_"
jne sigue
mov bl,1 ; bandera palabra incompleta
sigue:
inc si
inc di
dec cl
jnz prueba
pop cx
pop si
pop di
ret
buscar endp
;representación del muneco
; el contador está en la variable 'fallos'
muneco proc near
push bx
mov bl,fallos
cmp bl,7
jb s1
gotoxy 12,8
putchar '\'
s1:
cmp bl,6
jb s2
gotoxy 10,8
putchar '/'
s2:
cmp bl,5
jb s3
gotoxy 11,7
putchar 179 ;"│"
s3:
cmp bl,4
jb s4
gotoxy 11,6
putchar 179 ;"│"
s4:
cmp bl,3
jb s5
gotoxy 12,6
putchar '\'
s5:
cmp bl,2
jb s6
gotoxy 10,6
putchar '/'
s6:
cmp bl,1
jb fin
gotoxy 11,5
putchar 'O'
fin:
pop bx
ret
muneco endp
_end ahorcado
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.