Anda di halaman 1dari 8

1.

PRINCIPAL
Main

PROC FAR

mov ax,@DATA
mov ds,ax

;Direccionamos DS a el segmento de datos

call Quita
Pre:
call Portada
cmp Salida,0
je FinJuego

;Quitamos cursor Hard.

call Presentacion
call Inicializar
Juego:
cmp Estado,2
je GameO

;Imprimimos el Marco de la ventana.


;Inicializamos el juego

call Refresco
call Teclado
call Desplazar
call Pausa

;Dibujamos el Snake en pantalla.


;Rastreamos el teclado.
;Desplazamos el contenido del array Snake.
;Pausa,Impresin puntuacin y obstaculos.

;Opciones del Men

jmp Juego
GameO:
call GameOver
jmp Pre
FinJuego:
call Pon
mov ax,4c00h
int 21h
Main

ENDP

;Mesaje Game Over.

;Recuperamos el cursor Hard.


;Acabamos el programa y retornamos al DOS

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


;Puntuacin cero.
;Coordenadas iniciales
;Empieza movindose a la Izquierda.
;Largo de la serpiente.

3. COLISION:
Proceso que comprueba la colisin 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

;Funcin de leer el carcter de pantalla


;que est en la posicin del cursor.

;Si no hay colisin salimos.

;Hay colisin con las paredes o con sigo


;mismo

;Hay colisin 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
push bx
push dx
push cx
push di

;Guardamos registros afectados

mov ah,02h
mov bh,0
mov dl,Snake[0].x
mov dh,Snake[0].y
int 10h
call Colision

;Funcin posicionar cursor


;Pagina 0
;Coordenada x
;Coordenada y

mov ah,02h
mov dl,'#'
int 21h

;Imprimimos cabeza de Snake en coordenadas x,y

mov bx,2
mov di,1

;Inicializamos desplazamiento para el segundo


;elemento de Snake
;Inicializamos contador de elementos

mov cx,Largo
dec cx

;La comparacin ser con Largo-1

BucleR:
cmp di,cx
je FinRefresco

mov ah,02h
mov dl,Snake[bx].x
mov dh,Snake[bx].y
push bx
mov bh,0

;Comprobamos que ya hemos volcado en pantalla


;todo el Snake menos la ultima posicin la
; cual nos servir para ir borrando la cola del
;Snake a medida que avanza.
;Funcin posicionar cursor
;Coordenadas x,y de elemento bx de Snake

int 10h
pop bx
mov ah,02h
mov dl,'*'
int 21h

;Imprimimos cuerpo de Snake

add bx,2

;Incrementamos el desplazamiento de elemento


;de Snake.
;Incremento de dos bytes porque cada
;elemento del struc es de dos bytes
;Incrementamos el contador de elementos

inc di
jmp BucleR
FinRefresco:
mov ah,02h
add bx,2
mov dl,Snake[bx].x
mov dh,Snake[bx].y
mov bx,0
int 10h

;Posicionamos el ltimo elemento de Snake

;Pagina 0

mov ah,02h
mov dl,' '
int 21h

;Borramos final de Snake

pop di
pop cx
pop dx
pop bx
pop ax
ret

;Recuperamos registros afectados

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 el tipo de incremento x o y (ix,iy) y se actualizan tambien las
coordenadas x,y con tales incrementos si no se ha 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

;Funcin 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