Вы находитесь на странице: 1из 23

UNIVERSIDAD NACIONAL DEL ALTIPLANO

FACULTAD: INGENIERIA MECANICA ELECTRICA, ELECTRONICA Y SISTEMAS

ESCUELA PROFECIONAL: INGENIERIA DE SISTEMAS

CURSO: Computacin y Programacin de Bajo Nivel PROYECTO: JUEGO SNAKE

PRESENTADO POR: MAMANI MOYA, Roberth

PUNO PER 2012

SNAKE

INTRODUCCIN
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 cdigo ASSEMBLER.

DESCRIPCIN 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 utilizacin de los caracteres como figuras o imgenes de los bordes, los bloques de comida, los bordes y otros.

Tambin se utiliza las interrupciones tanto de la B.I.O.S. como del D.O.S.

EL PROPSITO DEL JUEGO Como se dijo en la introduccin el propsito 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. F1 :Para hacer una pausa en el juego. :Para terminar el juego.

LAS CUENTAS O SCORE MS BUENOS En este programa se visualiza un score o hall of fame, donde se encontrara una relacin con los puntajes mas altos del juego, claro que para eso te pedir tu nombre al finalizar el juego.

REQUISITOS PARA EL BUEN DESEMPEO DEL JUEGO Simplemente debe tener tu computadora una tarjeta VGA o SVGA, creo que todos los monitores llevan estas tarjetas.

MODO DE COMPILACIN 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 instruccin, en este caso:

El cual creara un archivo objeto (*.obj), en este caso SNAKE.OBJ Despus de esta secuencia se crea un archivo ejecutable SNAKE.EXE aunque no es necesario incluir la extensin, pues por si acaso verdad. 3ro: Simplemente ejecutar el programa y a disfrutar del juego.

Luego nos muestra la presentacin, 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 despus de haber perdido. Presionamos una tecla y nos muestra como esta captura.

ANLISIS DEL CODIGO FUENTE

Para este caso tomaremos porciones del cdigo fuente, simplemente esto por la gran cantidad de lneas de la que se compone el cdigo. En este cdigo se utilizan procedimientos (PROC) y varias etiquetas (LABEL), para su mejor entendimiento, ya en si el cogido fuente esta detallado con comentarios que sern mas fcil su comprensin. Empecemos: En esta parte del cdigo estamos definiendo las variables que se utilizaran en el juego, tanto para los colores, carcter de la serpiente , carcter 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 movimientos LineaInicio equ 1 ;primera linea del borde (de 0 a 24) LineaFin equ 24 ;ultima linea del borde ColInicio equ 0 ;primera columna del borde ( de 0 a 79) ColFin equ 60 ;ultima columna del borde Altura equ LineaFin-LineaInicio-1 ;nmero de filas de altura excepto las esquinas Largo equ ColFin-ColInicio-1 las esquinas XPunt equ 6*160+60 ;Columna de la puntuacin XInicio equ 59 ;Columna inicial de la serpiente YInicio equ 12 ;Lnea de salida de la serpiente CharSerp equ '' CharOgg equ 02h ;Carcter de los nmeros que se deben tomar ;nmero de columnas de ancho excluyendo

ColPunt ColBorde ColFondo ColSerp ColChar

equ 0Ah equ 0Fh equ 01h equ 0Ah equ 0Eh

;Color de puntuacin ;color del borde ;color de fondo ;color de la serpierte ;color del caracter

MsgPersoLen equ MsgPersoEnd-MsgPerso ;longitud del mensaje MsgPuntLen equ MsgPuntEnd-MsgPunt

En esta pedazo del cdigo 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 interrogacin, de la misma manera aqu tambin hay definiciones de variables que se utilizaran durante el juego. .stack 200h .data? Cola dw 100 dup(?) ;cola de la serpiente ColaStop LABEL ;bytes en cola InicioCola dw ? ;direccin de inicio de la cola FinCola dw ? ;direccion de Fin Cola Flag dw ? ;flag para Tiempo NumPos dw ? ;coordinate del numero Crecer db ? ;1 = debe alargarse , 0 = no debe alargarse ModoVideo db ? ;Modo de vdeo antes de la salida

En esta pedazo del cdigo estamos definiendo tambin otras variables pero estas ya estn inicializadas ya que se encuentran dentro del segmento data
.data IncY IncX Numero Puntaje Perdio db 0 db 0 ;Incremento de la linea ;Incremento de columna

db 1 ; dw 0 ;puntuacin db ' Perdiste :(',10,10,13

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

BAJO NIVEL',10,10,13 db ' PRESENTADO POR:',10,10,13 MsgPerso db ' MAMANI MOYA, ROBERTH ',10,10,13,10,10 db ' Presione una tecla para continuar...',10,10,13,'$' MsgPersoEnd LABEL .code start:

Aqu en si se encuentra la parte del segmento de cdigo la parte mas importante del cdigo fuente. En esta parte existen varios procedimientos que hacen posible el mejor manejo del programa tambin el uso de etiquetas ya que es mas fcil hacer llamadas a ciertos procedimientos que se repiten en el programa.
.code start: mov ax,@data mov ds,ax mov ax,0B800h mov es,ax mov ah,0Fh int 10h mov ModoVideo,al mov ax,3 int 10h lea dx,Presenta mov ah,9 int 21h ;establece el modo video a 80x25

;muestra la presentacion

mov ah,7 int 21h mov ax,3 int 10h mov ah,2 mov bl,0 mov dx,2500h int 10h

;espera pulsa una tecla

;borra la pantalla

;oculta el cursor

mov al,ColSerp + 16*ColFondo ;Color mov di,1 ;primer atributo de la primera pgina mov cx,2000 ;numero total de casillas PreparaFondo: mov es:[di],al add di,2 dec cx jnz 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,2 mov cx,Largo BordeSup: mov es:[di],ax add di,2 dec cx jnz BordeSup mov al,'' mov es:[di],ax mov al,''

;Borde superior

mov di,(160*LineaFin)+(2*ColInicio) mov es:[di],ax add di,2 mov al,'' mov cx,Largo BordeInf: mov es:[di],ax add di,2 dec cx jnz BordeInf mov al,'' mov es:[di],ax mov bx,160 ;longitud en bytes de una lnea

;Borde inferior

mov al,'' mov di,160*(LineaInicio+1)+(2*ColInicio) ;inicio del borde izquierdo mov cx,Altura BordeIzq: mov es:[di],ax add di,bx dec cx jnz BordeIzq mov di,160*(LineaInicio+1)+(2*ColFin) mov cx,Altura BordeDer: mov es:[di],ax add di,bx dec cx jnz BordeDer call MuestraPuntaje ;Muestra el Puntaje

; bx = 160

mov ah,XInicio mov al,YInicio mov Cola,ax

;establece el punto de partida de la serpiente

mov InicioCola,offset Cola mov FinCola,offset Cola

call ConvertAddr mov di,ax ;llama la cabeza de la serpiente mov word ptr es:[di],256*(16*ColFondo+ColSerp)+CharSerp mov ah,0 int 1Ah mov Flag,dx call Crea_numero mov Crecer,0 ciclo: mov ah,0 int 1ah mov ax,dx sub ax,Flag cwd xor ax,dx adc ax,0 cmp ax,Tiempo ja Mover_cursor mov ah,1 int 16h jnz ControlaTecla jmp ciclo Mover_cursor: ;mueve la serpierte mov ah,0 int 1ah mov Flag,dx ;verifica el Tiempo mov si,FinCola cmp Crecer,0 jne Inicio_Cola mov ax,[si] ;inicia el ciclo

;pulsa caracter

;salta si crece

call ConvertAddr mov di,ax mov ax,256*(ColSerp+16*ColFondo)+' ' mov es:[di],ax add si,2 cmp si,offset ColaStop ;sobre la cola jne Inicio_Cola mov si,offset Cola Inicio_Cola: mov FinCola,si mov Crecer,0 mov si,InicioCola ;cabeza de la serpiente mov ax,[si] add ah,IncX add al,IncY push ax call ConvertAddr mov di,ax mov word ptr es:[di],256*(ColFondo*16+ColSerp)+CharSerp add si,2 cmp si,offset ColaStop jne Fin_mover mov si,offset Cola Fin_mover: ;Fin del los movimientos mov InicioCola,si pop ax mov [si],ax ;gurda las coordenadas de la cabeza call ControlarChoque ;controlar si se tropa con algo jmp ciclo ControlaTecla: ;compruebe que ha pulsado el tecla mov ax,offset CtrTecla_Fin push ax mov ah,0 int 16h ;remueve el caracter del buffer cmp ax,4800H ;flecha hacia arriba je Flecha_Arriba cmp ax,4B00H ;flecha hacia izquierda je Flecha_Izq

cmp ax,4D00H je Flecha_Der cmp ax,5000H je Flecha_Abajo cmp ax,3B00H je Fin CtrTecla_Fin: jmp ciclo

;flecha hacia la derecha ;flecha hacia abajo ; tecla F1 para terminar o salir del juego

Flecha_Arriba: cmp IncY,1 je FlechaArriba_OK mov word ptr [IncY],00FFh ;IncX = 0, IncY = -1 FlechaArriba_OK: ;inversione di direzione retn Flecha_Izq: cmp IncX,1 je FlechaDer_OK mov word ptr [IncY],0FF00H FlechaDer_OK: retn Flecha_Der: cmp IncX,-1 je FlechaIzq_OK mov word ptr [IncY],0100h FlechaIzq_OK: retn Flecha_Abajo: cmp IncY,-1 je FlechaAbajo_OK mov word ptr [IncY],0001h FlechaAbajo_OK: retn

;IncX = -1, IncY = 0

;IncX = 1, IncY = 0

;IncX = 0, IncY = 1

ControlarChoque: ;controla si golpea el muro o un numero cmp al,LineaInicio ;Borde superior jz Choque cmp al,LineaFin ;Borde inferior

je Choque cmp ah,ColInicio jz Choque cmp ah,ColFin je Choque call ChoqueCola jc Choque cmp ax,NumPos jne Fin_ConChoque call Crea_numero

;Borde izquierdo ;Borde derecho

;verifica si se golpeo la cola ;saltar si la colisin se produjo ;verifica si se golpeo un numero

add Puntaje,10 ;incrementa el Puntaje call ConvPuntaje ;convierte en una cadena call 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 ; mov al,[si] ; mov es:[di],al ; inc si ; add di,2 ; dec cx ; jnz Choque_msg

; Choque_msg:

mov ah,7 int 21h jmp Fin Crea_numero: mov ah,0

int 1ah xor ax,ax mov al,dl mov dl,Altura div dl mov bl,ah add bl,LineaInicio+1 mov ah,0 int 1ah xor ax,ax mov al,dl mov dl,Largo div dl mov bh,ah add bh,ColInicio+1 mov ax,bx mov [NumPos],ax push ax cmp Numero,2 jbe CreaNumero_OK call ChoqueCola ;controla si se golpeo la Cola jc Crea_numero ;si se encuentra en otra posicion CreaNumero_OK: pop ax ;ax = posicion del numero call ConvertAddr mov di,ax mov ah,16*ColFondo+ColChar mov al,CharOgg mov es:[di],ax ;visualiza el numero inc Numero mov Crecer,1 ;dice a la cola crecer ret Fin: mov al,ModoVideo mov ah,0 int 10h lea dx,Perdio mov ah,9 int 21h ;establece el modo de vdeo a la anterior

;muestra msg perdiste

S1: mov ah,0 int 16h cmp ax,3B00H je Salir jmp S1 Salir: mov ax,4c00h int 21h ;*************************************************************************** ConvertAddr proc near ;convierte la X e Y pasado en la direccin de AH y AL en memoria de vdeo ;requiere: ; AH = X ; AL = Y ; ;retorna: ; AX = offset push bx push cx mov bx,ax xor ah,ah shl ax,5 mov cx,ax shl ax,2 add ax,cx shl bh,1 add al,bh adc ah,0 pop cx pop bx retn ConvertAddr endp ;*************************************************************************** ChoqueCola proc ;controla si se algo afecto ala cola ;requiere: ;espera la pulsacion de una tecla

; tecla F1 para terminar o salir del juego

;AL * 32 ;AL * 4 ;AL * 5 = AL * 160 ;X * 2 ;ADDR = 2*X + 160*Y

; AH = X ; AL = Y ;retorna: ; CF = 1 si se produjo la colision ; CF = 0 si no se produjo la colision cmp Numero,2 je ChoqueCola_Fin mov di,[InicioCola] mov si,[FinCola] cmp si,di ja ChoqueCola_inv sub di,si ;Longitud de la Cola en bytes mov cx,di shr cx,1 ;longitud en word call ChoqueCiclo ;verifica el choque o impacto jmp ChoqueCola_Fin ;esce ChoqueCola_inv: mov si,offset Cola ;inicio de la cola sub di,si jz ChoqueCola_inv2 mov cx,di shr cx,1 ;convierte en word call ChoqueCiclo jc ChoqueCola_Fin ;salta si se produjo la colision ChoqueCola_inv2: ;controla la parte final mov si,[FinCola] mov cx,offset ColaStop sub cx,si shr cx,1 ;la longitud de la segunda parte call ChoqueCiclo ChoqueCola_Fin: ret ChoqueCola endp ;Fin del procedimiento

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

; DS:SI = direccin de inicio de la bsqueda ; 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],ax je ChoqueCiclo_urtato add si,2 dec cx jnz ChoqueCiclo_ciclo clc jmp ChoqueCiclo_Fin ChoqueCiclo_urtato: stc ChoqueCiclo_Fin: ret ChoqueCiclo endp ;*************************************************************************** ConvPuntaje proc ;Convierte el puntaje en String o cadena pusha mov cl,30h mov bx,10 mov ax,Puntaje lea di,MsgPuntEnd-1 ConvP_ciclo: xor dx,dx div bx add dl,cl ;convierte el resto en ASCCI mov [di],dl ;copia la cifra dec di ;decrementa puntero de la cadena or ax,ax jnz ConvP_ciclo popa ;char se produjo el choque

;Apunta al final de la cadena

ret ConvPuntaje endp ;*************************************************************************** MuestraPuntaje proc ;Muestra el Puntaje push si push di push ax push cx lea si,MsgPunt ;offset de la cadena MsgPunt mov di,2*XPunt ;Direccion del Puntaje mov cx,MsgPuntLen ;Longitud de la de la cadena Puntos mov ah,ColPunt+(16*ColFondo) ;Color del Puntaje MuestraP_ciclo: mov al,[si] mov es:[di],ax inc di inc si inc di dec cx jnz MuestraP_ciclo pop cx pop ax pop di pop si ret MuestraPuntaje endp ;*************************************************************************** end start

Bueno esto es todo.

BIBLIOGRAFA:

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

Вам также может понравиться