juego snake en assembler
Post on 07-Aug-2015
1.413 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
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.
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.
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.
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.
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.
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:
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.
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
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
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
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,'È'
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
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]
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
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
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
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
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:
; 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:
; 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
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.
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
top related