1.
PRINCIPAL Main
PROC FAR
mov ax,@DATA
;Direccionamos DS a el segmento de datos
mov ds,ax call Quita
;Quitamos cursor Hard.
Pre: call Portada
;Opciones del Men£
cmp Salida,0 je FinJuego call Presentacion
;Imprimimos el Marco de la ventana.
call Inicializar
;Inicializamos el juego
Juego: cmp Estado,2 je GameO call Refresco
;Dibujamos el Snake en pantalla.
call Teclado
;Rastreamos el teclado.
call Desplazar
;Desplazamos el contenido del array Snake.
call Pausa
;Pausa,Impresi¢n puntuaci¢n y obstaculos.
jmp Juego GameO: call GameOver
;Mesaje Game Over.
jmp Pre FinJuego: call Pon
;Recuperamos el cursor Hard.
mov ax,4c00h int 21h Main
;Acabamos el programa y retornamos al DOS ENDP
2.
INICIALIZAR
Inicializar
PROC NEAR
mov bx,0 mov cx,0 Otra: cmp cx,Largo je FinI mov Snake[bx].x,0 ;40 mov Snake[bx].y,25 ;12 add bx,2 inc cx jmp Otra
FinI: mov Snake[0].x, 40 mov Snake[0].y, 12 mov Estado,0 mov Puntos,0 mov _x,40 mov _y,12 mov ix,-1 mov iy,0 mov Largo,3 Inicializar
ENDP
;Este bucle es para inicializar las ;posiciones de Snake desde la primera ;hasta Largo
;Estado del juego ;Puntuación cero. ;Coordenadas iniciales ;Empieza moviéndose a la Izquierda. ;Largo de la serpiente.
3. COLISION: Proceso que comprueba la colisión de la cabeza de la serpiente con la comida, paredes o consigo misma.
Colision PROC NEAR
mov ah,08h mov bh,0 int 10h cmp al,' ' je Salir cmp al,'X' je SalirA mov Estado,2 jmp Salir SalirA: inc Puntos cmp Largo,MAX_TAM-2 jge Salir mov ax, Largo add ax, 3 mov Largo, ax Salir: ret Colision ENDP
;Función de leer el carácter de pantalla ;que está en la posición del cursor.
;Si no hay colisión salimos.
;Hay colisión con las paredes o con sigo ;mismo
;Hay colisión con una 'X' de comida.
4. REFRESCO: Esta Subrutina mientras recorre el array Snake con índice bx, pone en pantalla un trozo de la serpiente en las coordenadas x,y almacenadas en el indice bx del array Snake.
Refresco PROC NEAR push ax
;Guardamos registros afectados
push bx push dx push cx push di mov ah,02h
;Funci¢n posicionar cursor
mov bh,0
;Pagina 0
mov dl,Snake[0].x
;Coordenada x
mov dh,Snake[0].y
;Coordenada y
int 10h call Colision mov ah,02h
;Imprimimos cabeza de Snake en coordenadas x,y
mov dl,'#' int 21h mov bx,2
;Inicializamos desplazamiento para el segundo ;elemento de Snake
mov di,1
;Inicializamos contador de elementos
mov cx,Largo dec cx
;La comparación será con Largo-1
BucleR: cmp di,cx
;Comprobamos que ya hemos volcado en pantalla
je FinRefresco
;todo el Snake menos la ultima posición la ; cual nos servirá para ir borrando la cola del ;Snake a medida que avanza.
mov ah,02h
;Funci¢n posicionar cursor
mov dl,Snake[bx].x
;Coordenadas x,y de elemento bx de Snake
mov dh,Snake[bx].y push bx mov bh,0
int 10h pop bx mov ah,02h
;Imprimimos cuerpo de Snake
mov dl,'*' int 21h add bx,2
;Incrementamos el desplazamiento de elemento ;de Snake. ;Incremento de dos bytes porque cada ;elemento del struc es de dos bytes
inc di
;Incrementamos el contador de elementos
jmp BucleR FinRefresco: mov ah,02h add bx,2
;Posicionamos el último elemento de Snake
mov dl,Snake[bx].x mov dh,Snake[bx].y mov bx,0
;Pagina 0
int 10h mov ah,02h
;Borramos final de Snake
mov dl,' ' int 21h pop di
;Recuperamos registros afectados
pop cx pop dx pop bx pop ax ret Refresco
ENDP
5. MOVIMIENTO Subrutina Teclado, mira si se ha pulsado alguna tecla de cursor: Si se ha pulsado alguna tecla de cursor se actualiza actualiza el tipo de incremento x o y (ix,iy) (ix,iy) y se actualizan tambien las coordenadas x,y con tales incrementos si no se ha pulsado pulsado una tecla solo se actualizan las coordenadas x,y.
Teclado
PROC NEAR
push ax push bx
;Guardamos registros afectados.
mov bl,ix mov bh,iy
;Pasamos ix a bl para la suma x=x+ix. ;Pasamos iy a bh para la suma y=y+iy.
mov ah,01h int 16h
;Funci¢n para obtener el stado del teclado. ;al=0FFh caracter disponible ;al=0 caracter no disponible ;No se ha pulsado niguna tecla.
jz FinTeclado mov ah,0 int 16h
cmp al,0 jne FinTeclado
;Ahora leemos el teclado y si consumimos la ;tecla, esta esta en ax: ;al=ASCII Code ;ah=Scan Code ;Nos aseguramos que no sea una tecla ASCII
cmp ah,48h je Up
;Compara con flecha arriba.
cmp ah,50h je Down
;Compara con flecha abajo.
cmp ah,4dh je Right
;Compara con flecha derecha.
cmp ah,4bh je Left jmp FinPulsacion
;Compara con flecha izquierda.
Up: mov bl,0 mov bh,-1 jmp FinPulsacion
;Actualizamos ix,iy
Down: mov bl,0 mov bh,1 jmp FinPulsacion
;Actualizamos ix,iy
Right: mov bl,1 mov bh,0 jmp FinPulsacion
;Actualizamos ix,iy
Left: mov bl,-1 mov bh,0 jmp FinPulsacion
;Actualizamos ix,iy
FinPulsacion: mov ix,bl mov iy,bh
;Actualizamos los verdaderos ix,iy
FinTeclado: add _x,bl add _y,bh
;Actualizamos _x,_y con ix y iy respectivamente
pop bx pop ax
;Recuperamos registros afectados
ret Teclado
ENDP