JUEGO SNAKE en Assembler

30
UNIVERSIDAD NACIONAL DEL ALTIPLANO FACULTAD: INGENIERIA MECANICA ELECTRICA, ELECTRONICA Y SISTEMAS ESCUELA PROFECIONAL: INGENIERIA DE SISTEMAS CURSO: Computación y Programación de Bajo Nivel PROYECTO: JUEGO SNAKE PRESENTADO POR: MAMANI MOYA, Roberth

description

JUEGO SNAKE, Assembler

Transcript of JUEGO SNAKE en Assembler

Page 1: JUEGO SNAKE en Assembler

UNIVERSIDAD NACIONAL DEL ALTIPLANO

FACULTAD: INGENIERIA MECANICA ELECTRICA, ELECTRONICA Y SISTEMAS

ESCUELA PROFECIONAL: INGENIERIA DE SISTEMAS

CURSO: Computación y Programación de Bajo Nivel

PROYECTO:

JUEGO SNAKE

PRESENTADO POR:

MAMANI MOYA, Roberth

PUNO – PERÚ

2012

Page 2: JUEGO SNAKE en Assembler

SNAKE

INTRODUCCIÓN

El presente proyecto se desarrolla un juego muy famoso llamado SNAKE

(Serpiente). Trata de una serpiente que cuando mas bloques come, la cola de

la culebra se alarga, el jugador no debe colisionar con los limites o con el

mismo cuerpo de la serpiente, claro que los bloques aparecen

aleatoriamente en la pantalla, un juego muy divertido.

En este proyecto se desarrolla tal juego en puro código ASSEMBLER.

Page 3: JUEGO SNAKE en Assembler

DESCRIPCIÓN DEL JUEGO

El presente juego está desarrollado completamente en lenguaje ensamblador,

en este caso el presente juego fue compilado y enlazado con (TURBO

ASSEMBLER).

Este juego utiliza el modo texto (03h) y la utilización de los caracteres como

figuras o imágenes de los bordes, los bloques de comida, los bordes y otros.

También se utiliza las interrupciones tanto de la B.I.O.S. como del D.O.S.

Page 4: JUEGO SNAKE en Assembler

EL PROPÓSITO DEL JUEGO

Como se dijo en la introducción el propósito del juego es comer la mayor

cantidad de bloques posibles que aparecen en la pantalla, donde la serpiente

se va largando a medida que va comiendo los bloques, no debe chocar con

las paredes ni con su mismo cuerpo.

LOS MOVIMIENTOS DE LA SERPIENTE

Apenas empiece el juego la serpiente que inicialmente aparece la serpiente

de un solo bloque y detenida. Necesita apretar una de las cuatro teclas

direccionales para partir. Entonces al mover… solo bastara mover las mismas

teclas para direccionar .

FIN DEL JUEGO

El juego acaba cuando la serpiente choca contra la pared o con su cuerpo, si

desea salir del juego, solo debe presionar la tecla F1 para salir de famoso

juego del SNAKE.

Page 5: JUEGO SNAKE en Assembler

TECLAS

:Para moverse hacia la derecha de la serpiente.

:Para moverse hacia la izquierda de la serpiente.

:Para moverse hacia abajo de la serpiente.

:Para moverse hacia arriba la serpiente.

“ ” :Para hacer una pausa en el juego.

F1 :Para terminar el juego.

LAS CUENTAS O SCORE MÁS BUENOS

En este programa se visualiza un score o hall of fame, donde se encontrara

una relación con los puntajes mas altos del juego, claro que para eso te

pedirá tu nombre al finalizar el juego.

REQUISITOS PARA EL BUEN DESEMPEÑO DEL JUEGO

Simplemente debe tener tu computadora una tarjeta VGA o SVGA, creo que

todos los monitores llevan estas tarjetas.

Page 6: JUEGO SNAKE en Assembler

MODO DE COMPILACIÓN Y ENLAZAMIENTO

Para este caso ya se menciono que se utiliza el TASM.

Estos son los pasos a seguir.

1ro: Ya estando el D.O.S. y el la carpeta que contiene al TASM se sigue la

siguiente instrucción, en este caso:

El cual creara un archivo objeto (*.obj), en este caso SNAKE.OBJ

Después de esta secuencia se crea un archivo ejecutable SNAKE.EXE

aunque no es necesario incluir la extensión, pues por si acaso verdad.

3ro: Simplemente ejecutar el programa y a disfrutar del juego.

Page 7: JUEGO SNAKE en Assembler

Luego nos muestra la presentación, presionamos una tecla y nos muestra la pantalla del Juego.

Luego de jugar nos muestra los puntajes como se muestra a continuacion:

Page 8: JUEGO SNAKE en Assembler

Si se choca con la pared o con la cola misma pierdes, aquí una captura después de haber perdido.

Presionamos una tecla y nos muestra como esta captura.

Page 9: JUEGO SNAKE en Assembler

ANÁLISIS DEL CODIGO FUENTE

Para este caso tomaremos porciones del código fuente, simplemente esto por la gran cantidad de líneas de la que se compone el código.

En este código se utilizan procedimientos (PROC) y varias etiquetas (LABEL), para su mejor entendimiento, ya en si el cogido fuente esta detallado con comentarios que serán mas fácil su comprensión.

Empecemos:

En esta parte del código estamos definiendo las variables que se utilizaran en el juego, tanto para los colores, carácter de la serpiente , carácter del bloque de comida, de los bordes, del almacenamiento del hall of fame, de los mensajes a mostrarse.

Todos estas variables son definiciones globales.

.model small

.386

Tiempo equ 1 ;numero de 55 Milisegundos entre los movimientosLineaInicio equ 1 ;primera linea del borde (de 0 a 24)LineaFin equ 24 ;ultima linea del bordeColInicio equ 0 ;primera columna del borde ( de 0 a 79)ColFin equ 60 ;ultima columna del bordeAltura equ LineaFin-LineaInicio-1 ;número de filas de altura excepto las

esquinasLargo equ ColFin-ColInicio-1 ;número de columnas de ancho excluyendo

las esquinasXPunt equ 6*160+60 ;Columna de la puntuaciónXInicio equ 59 ;Columna inicial de la serpienteYInicio equ 12 ;Línea de salida de la serpienteCharSerp equ 'Û'CharOgg equ 02h ;Carácter de los números que se deben tomar

Page 10: JUEGO SNAKE en Assembler

ColPunt equ 0Ah ;Color de puntuaciónColBorde equ 0Fh ;color del bordeColFondo equ 01h ;color de fondoColSerp equ 0Ah ;color de la serpierteColChar equ 0Eh ;color del caracter

MsgPersoLen equ MsgPersoEnd-MsgPerso ;longitud del mensajeMsgPuntLen equ MsgPuntEnd-MsgPunt

En esta pedazo del código estamos definiendo la pila y las variables que se encuentran dentro del segmento data? Sin inicializar por supuesto ya que se encuentra el signo de interrogación, de la misma manera aquí también hay definiciones de variables que se utilizaran durante el juego.

.stack 200h

.data?Cola dw 100 dup(?) ;cola de la serpienteColaStop LABEL ;bytes en cola

InicioCola dw ? ;dirección de inicio de la colaFinCola dw ? ;direccion de Fin ColaFlag dw ? ;flag para TiempoNumPos dw ? ;coordinate del numeroCrecer db ? ;1 = debe alargarse , 0 = no debe alargarseModoVideo db ? ;Modo de vídeo antes de la salida

En esta pedazo del código estamos definiendo también otras variables pero estas ya están inicializadas ya que se encuentran dentro del segmento data

.dataIncY db 0 ;Incremento de la lineaIncX db 0 ;Incremento de columna

Numero db 1 ;Puntaje dw 0 ;puntuaciónPerdio db ' Perdiste :(',10,10,13

Page 11: JUEGO SNAKE en Assembler

MsgPunt db ' PUNTOS : 0'MsgPuntEnd LABEL

Presenta db 10,10,10,10,13,' SNAKE v1.0.0',10,10,13db ' INGENIERIA DE SISTEMAS UNA-PUNO',10,10,13db ' CURSO: COMPUTACION Y PROGRAMACION DE

BAJO NIVEL',10,10,13db ' PRESENTADO POR:',10,10,13

MsgPerso db ' MAMANI MOYA, ROBERTH ',10,10,13,10,10db ' Presione una tecla para continuar...',10,10,13,'$'

MsgPersoEnd LABEL

.codestart:

Aquí en si se encuentra la parte del segmento de código la parte mas importante del código fuente.En esta parte existen varios procedimientos que hacen posible el mejor manejo del programa también el uso de etiquetas ya que es mas fácil hacer llamadas a ciertos procedimientos que se repiten en el programa.

.codestart:

mov ax,@datamov ds,axmov ax,0B800hmov es,ax

mov ah,0Fhint 10hmov ModoVideo,al

mov ax,3 ;establece el modo video a 80x25int 10h

lea dx,Presenta ;muestra la presentacionmov ah,9int 21h

Page 12: JUEGO SNAKE en Assembler

mov ah,7 ;espera pulsa una teclaint 21h

mov ax,3 ;borra la pantallaint 10h

mov ah,2 ;oculta el cursormov bl,0mov dx,2500hint 10h

mov al,ColSerp + 16*ColFondo ;Colormov di,1 ;primer atributo de la primera páginamov cx,2000 ;numero total de casillas

PreparaFondo:mov es:[di],aladd di,2dec cxjnz PreparaFondo

mov ah,ColBorde+16*ColFondo ;color del Borde

mov al,'É'mov di,(160*LineaInicio)+(2*ColInicio)mov es:[di],ax

mov al,'Í'add di,2mov cx,Largo ;Borde superior

BordeSup:mov es:[di],axadd di,2dec cxjnz BordeSup

mov al,'»'mov es:[di],ax

mov al,'È'

Page 13: JUEGO SNAKE en Assembler

mov di,(160*LineaFin)+(2*ColInicio)mov es:[di],axadd di,2

mov al,'Í'mov cx,Largo ;Borde inferior

BordeInf:mov es:[di],axadd di,2dec cxjnz BordeInf

mov al,'¼'mov es:[di],ax

mov bx,160 ;longitud en bytes de una línea

mov al,'º'mov di,160*(LineaInicio+1)+(2*ColInicio) ;inicio del borde izquierdomov cx,Altura

BordeIzq:mov es:[di],axadd di,bxdec cxjnz BordeIzqmov di,160*(LineaInicio+1)+(2*ColFin) ; bx = 160mov cx,Altura

BordeDer:mov es:[di],axadd di,bxdec cxjnz BordeDer

call MuestraPuntaje ;Muestra el Puntaje

mov ah,XIniciomov al,YIniciomov Cola,ax ;establece el punto de partida de la serpiente

mov InicioCola,offset Colamov FinCola,offset Cola

Page 14: JUEGO SNAKE en Assembler

call ConvertAddrmov di,ax

;llama la cabeza de la serpientemov word ptr es:[di],256*(16*ColFondo+ColSerp)+CharSerp

mov ah,0 ;inicia el cicloint 1Ahmov Flag,dx

call Crea_numeromov Crecer,0

ciclo:

mov ah,0int 1ahmov ax,dxsub ax,Flagcwdxor ax,dxadc ax,0 cmp ax,Tiempoja Mover_cursor

mov ah,1int 16hjnz ControlaTecla ;pulsa caracter

jmp ciclo

Mover_cursor: ;mueve la serpiertemov ah,0int 1ahmov Flag,dx ;verifica el Tiempo

mov si,FinColacmp Crecer,0jne Inicio_Cola ;salta si crece

mov ax,[si]

Page 15: JUEGO SNAKE en Assembler

call ConvertAddrmov di,axmov ax,256*(ColSerp+16*ColFondo)+' 'mov es:[di],ax add si,2cmp si,offset ColaStop ;sobre la colajne Inicio_Colamov si,offset Cola

Inicio_Cola:mov FinCola,simov Crecer,0

mov si,InicioCola ;cabeza de la serpientemov ax,[si]add ah,IncXadd al,IncYpush axcall ConvertAddrmov di,axmov word ptr es:[di],256*(ColFondo*16+ColSerp)+CharSerpadd si,2cmp si,offset ColaStopjne Fin_movermov si,offset Cola

Fin_mover: ;Fin del los movimientosmov InicioCola,sipop axmov [si],ax ;gurda las coordenadas de la cabezacall ControlarChoque ;controlar si se tropa con algo

jmp ciclo

ControlaTecla: ;compruebe que ha pulsado el tecla Šmov ax,offset CtrTecla_Finpush axmov ah,0int 16h ;remueve el caracter del buffercmp ax,4800H ;flecha hacia arribaje Flecha_Arribacmp ax,4B00H ;flecha hacia izquierdaje Flecha_Izq

Page 16: JUEGO SNAKE en Assembler

cmp ax,4D00H ;flecha hacia la derechaje Flecha_Dercmp ax,5000H ;flecha hacia abajoje Flecha_Abajocmp ax,3B00H ; tecla F1 para terminar o salir del juegoje Fin

CtrTecla_Fin:jmp ciclo

Flecha_Arriba:cmp IncY,1je FlechaArriba_OKmov word ptr [IncY],00FFh ;IncX = 0, IncY = -1

FlechaArriba_OK: ;inversione di direzioneretn

Flecha_Izq:cmp IncX,1je FlechaDer_OKmov word ptr [IncY],0FF00H ;IncX = -1, IncY = 0

FlechaDer_OK:retn

Flecha_Der:cmp IncX,-1je FlechaIzq_OKmov word ptr [IncY],0100h ;IncX = 1, IncY = 0

FlechaIzq_OK:retn

Flecha_Abajo:cmp IncY,-1je FlechaAbajo_OKmov word ptr [IncY],0001h ;IncX = 0, IncY = 1

FlechaAbajo_OK:retn

ControlarChoque: ;controla si golpea el muro o un numerocmp al,LineaInicio ;Borde superiorjz Choquecmp al,LineaFin ;Borde inferior

Page 17: JUEGO SNAKE en Assembler

je Choquecmp ah,ColInicio ;Borde izquierdojz Choquecmp ah,ColFin ;Borde derechoje Choque

call ChoqueCola ;verifica si se golpeo la colajc Choque ;saltar si la colisión se produjo Š

cmp ax,NumPos ;verifica si se golpeo un numerojne Fin_ConChoquecall Crea_numero

add Puntaje,10 ;incrementa el Puntajecall ConvPuntaje ;convierte en una cadenacall MuestraPuntaje ;muestra el Puntaje

Fin_ConChoque:ret

Choque: ;si se produjo un choque o golpe; mov ax,2009h ;muestra el mensaje; call ConvertAddr; mov di,ax; mov cx,MsgPersoLen; lea si,MsgPerso

; Choque_msg:; mov al,[si]; mov es:[di],al; inc si; add di,2; dec cx; jnz Choque_msg

mov ah,7int 21h

jmp Fin

Crea_numero:mov ah,0

Page 18: JUEGO SNAKE en Assembler

int 1ahxor ax,axmov al,dlmov dl,Alturadiv dl mov bl,ahadd bl,LineaInicio+1mov ah,0 int 1ahxor ax,axmov al,dlmov dl,Largodiv dlmov bh,ahadd bh,ColInicio+1mov ax,bxmov [NumPos],axpush axcmp Numero,2jbe CreaNumero_OKcall ChoqueCola ;controla si se golpeo la Colajc Crea_numero ;si se encuentra en otra posicion

CreaNumero_OK:

pop ax ;ax = posicion del numerocall ConvertAddrmov di,axmov ah,16*ColFondo+ColCharmov al,CharOggmov es:[di],ax ;visualiza el numeroinc Numeromov Crecer,1 ;dice a la cola crecerret

Fin:mov al,ModoVideo ;establece el modo de vídeo a la anteriormov ah,0int 10h

lea dx,Perdio ;muestra msg perdistemov ah,9int 21h

Page 19: JUEGO SNAKE en Assembler

S1:mov ah,0 ;espera la pulsacion de una teclaint 16h

cmp ax,3B00H ; tecla F1 para terminar o salir del juegoje Salirjmp S1

Salir:mov ax,4c00hint 21h

;***************************************************************************ConvertAddr proc near;convierte la X e Y pasado en la dirección de AH y AL en memoria de vídeo;requiere:; AH = X; AL = Y;;retorna:; AX = offset

push bxpush cx

mov bx,axxor ah,ahshl ax,5 ;AL * 32mov cx,axshl ax,2 ;AL * 4add ax,cx ;AL * 5 = AL * 160shl bh,1 ;X * 2add al,bhadc ah,0 ;ADDR = 2*X + 160*Y

pop cxpop bxretn

ConvertAddr endp

;***************************************************************************ChoqueCola proc;controla si se algo afecto ala cola;requiere:

Page 20: JUEGO SNAKE en Assembler

; AH = X; AL = Y;retorna:; CF = 1 si se produjo la colision; CF = 0 si no se produjo la colision

cmp Numero,2je ChoqueCola_Finmov di,[InicioCola]mov si,[FinCola]cmp si,dija ChoqueCola_inv

sub di,si ;Longitud de la Cola en bytesmov cx,dishr cx,1 ;longitud en word call ChoqueCiclo ;verifica el choque o impactojmp ChoqueCola_Fin ;esce

ChoqueCola_inv:mov si,offset Cola ;inicio de la colasub di,si jz ChoqueCola_inv2mov cx,dishr cx,1 ;convierte en wordcall ChoqueCiclojc ChoqueCola_Fin ;salta si se produjo la colision

ChoqueCola_inv2: ;controla la parte finalmov si,[FinCola]mov cx,offset ColaStopsub cx,sishr cx,1 ;la longitud de la segunda partecall ChoqueCiclo

ChoqueCola_Fin: ;Fin del procedimientoret

ChoqueCola endp

;***************************************************************************ChoqueCiclo proc;;Requiere:

Page 21: JUEGO SNAKE en Assembler

; DS:SI = dirección de inicio de la búsqueda; CX = numero en word a controlarse; AX = word de cercare;Restituisce :; CF = 1 sis se produjo el choque; CF = 0 si no se produjo el choque

ChoqueCiclo_ciclo:cmp [si],axje ChoqueCiclo_urtatoadd si,2dec cxjnz ChoqueCiclo_cicloclc jmp ChoqueCiclo_Fin

ChoqueCiclo_urtato: ;char Š se produjo el choquestc

ChoqueCiclo_Fin:ret

ChoqueCiclo endp

;***************************************************************************ConvPuntaje proc;Convierte el puntaje en String o cadena

pusha mov cl,30h mov bx,10 mov ax,Puntajelea di,MsgPuntEnd-1 ;Apunta al final de la cadena

ConvP_ciclo:xor dx,dxdiv bx add dl,cl ;convierte el resto en ASCCImov [di],dl ;copia la cifradec di ;decrementa puntero de la cadenaor ax,ax jnz ConvP_ciclo

popa

Page 22: JUEGO SNAKE en Assembler

retConvPuntaje endp

;***************************************************************************MuestraPuntaje proc;Muestra el Puntaje

push sipush dipush axpush cx

lea si,MsgPunt ;offset de la cadena MsgPuntmov di,2*XPunt ;Direccion del Puntajemov cx,MsgPuntLen ;Longitud de la de la cadena Puntosmov ah,ColPunt+(16*ColFondo) ;Color del Puntaje

MuestraP_ciclo:mov al,[si]mov es:[di],axinc diinc siinc didec cxjnz MuestraP_ciclo

pop cxpop axpop dipop siret

MuestraPuntaje endp;***************************************************************************end start

Bueno esto es todo.

Page 23: JUEGO SNAKE en Assembler

BIBLIOGRAFÍA:

Programacion en lenguaje ensamblador 80386 / 80286, Willian H. Murray III, Chris Pappas.

Guia del programador para el IBM, PC y PS/2, Peter Norton y Richard Wilton

Internet