Félix Albertos Marco

Snake Game Source Code

08/05/2018

Home/blog/2018>

Snake Game Source Code

[programming]

By request, here is the source code for the Snake in C and assembler game that I have developed some time ago.

#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
#include "..\perlib.h"
 
/* Cambio del juego de caracteres para mostrar figuritas XD  */
/* posibilidad de grabar y reproducir partidas */
typedef struct TCuerpo{
    struct TCuerpo* PSig; /* puntero a la siguiente posici¢n */
    char* mem; /* puntero a la memoria de video */
}*PCuerpo;
char prepara_video()
{
char* p=NULL;
char* nvi=NULL;
int i;
struct REGPACK rp;
FILE *f;
    nvi=(char*)malloc(256*16*sizeof(char));
    if(nvi==NULL)
        return 0;
    rp.r_ax=0x1130;
    rp.r_bx=0x0600;
    intr(0x10,&rp);
    p=(char*)MK_FP(rp.r_es,rp.r_bp);
    for(i=0;i<256*16;i++)
        *(nvi+i)=*(p+i);
    *(nvi+88*16)=255;
/* Patron caracter */
/* modifica objeto que se coge 'X' */
    cambia_car("obj1.txt",'X',nvi);
/* modifica pared '#' */
    cambia_car("obj2.txt",'#',nvi);
/* modifica cuerpo culebra '*' */
    cambia_car("obj3.txt",'*',nvi);
/* Fin patr¢n caracter */
 
asm push ax;
asm push bx;
asm push cx;
asm push dx;
asm push es;
asm push bp;
asm mov ax,1110h;
asm mov bx,1000h;
asm mov cx,0100h;
asm mov dx,0;
asm les bp,nvi;
asm int 10h;
asm pop bp;
asm pop es;
asm pop dx;
asm pop cx;
asm pop bx;
asm pop ax;
        
}
 
void encola(PCuerpo cabeza,char* p)
{
PCuerpo ncu=(PCuerpo) malloc(sizeof(struct TCuerpo));
    
    ncu->mem=p;
    ncu->PSig=NULL;
 
    if(cabeza->PSig==NULL)
    {
 
        cabeza->PSig=ncu;
    }   
    else
    {
        ncu->PSig=cabeza->PSig;
        cabeza->PSig=ncu;   
    }
}
PCuerpo desencola(PCuerpo cabeza)
{
PCuerpo aux,ant;
PCuerpo p;
aux=NULL;
p=NULL;
    if(cabeza->PSig!=NULL)
    {
        aux=cabeza->PSig;
        ant=NULL;
        while(aux->PSig!=NULL)
        {
            ant=aux;
            aux=aux->PSig;
        }
        p=aux;
        ant->PSig=NULL;
    }
    return p;
}
 
void pantalla()
{
    clrscr();
    caracter(35,23,'P',5,3);
    caracter(36,23,'u',5,3);
    caracter(37,23,'n',5,3);
    caracter(38,23,'t',5,3);
    caracter(39,23,'o',5,3);
    caracter(40,23,'s',5,3);
    cuadrado(0,0,79,22,'#',1,4);
}
 
void actualiza(PCuerpo snk,char* p,char x)
{
PCuerpo aux;
    if(x==0)
    {
        PCuerpo aux=desencola(snk);
        pintaaddr(aux->mem,'',0,0);/*borramos £ltima direccion*/
        free(aux);
    }
    encola(snk,p);
    pintaaddr(p,'*',3,2);
}
 
 
void tachan(char modo,FILE *f)
{
int x;
int y;  
    if(modo)
    {
        x=(getc(f)-'0')*10;
        x=x+(getc(f))-'0';
        y=(getc(f)-'0')*10;
        y=y+(getc(f))-'0';
    }
    else
    {
        do
        {
            x=random(78);
            y=random(21);
        }while(retcar(1+x,1+y)=='#'|retcar(1+x,1+y)=='*');
        if(x<10)
        {
            putc('0',f);
            putc('0'+x,f);
        }
        else
        {
            putc('0'+x/10,f);
            putc('0'+x%10,f);
        }
        if(y<10)
        {
            putc('0',f);
            putc('0'+y,f);
        }
        else
        {
            putc('0'+y/10,f);
            putc('0'+y%10,f);
        }
 
    }
    caracter(1+x,1+y,'X',1+random(5),1+random(5));
}
 
void veopun(int puntos)
{
    caracter(42,23,'0'+puntos/10,2,3);
    caracter(43,23,'0'+puntos%10,2,3);
}
 
int main(int argc,char* argv[])
{
    FILE *f;
    char modo;
    int crece=35;
    int puntos=0;
    int i;
    char c;
    int x=5;
    int y=5;
    char sx=1;
    char sy=0;
    PCuerpo cola=(PCuerpo) malloc(sizeof(struct TCuerpo));
    cola->PSig=NULL;
    cola->mem=NULL;
    pantalla();
    prepara_video();
    randomize();
    
    if(argc==2 && *argv[1]=='r')    /* reproducir jugada guardada */
    {
        f=fopen("partida.dat","r");
        modo=1;
        if(f==NULL)
        {
            printf("No se puede abrir:r-partida.dat\n");
            return 0;
        }
    }
    else
    {
        f=fopen("partida.dat","w");
        modo=0;
        if(f==NULL)
        {
            printf("Error abriendo:w->partida.dat\n");
            return 0;
        }
    }
    tachan(modo,f);
    do{
        c=' ';
        if(modo || kbhit()!=0)
        {
            if(modo)
                c=getc(f);
            else        
                c=getch();
            switch(c)
            {
            case 'o':
                if (!sy) sy=-1;
                sx=0;
                break;
            case 'l':
                if (!sy) sy=+1;
                sx=0;
                break;
            case '¤':
                sy=0;
                if(!sx) sx=1;
                break;
            case 'k':
                sy=0;
                if(!sx) sx=-1;
                break;
            }
        }
        delay(75+(50*abs(sy))-(puntos*2));
        
        if(modo==0)
            putc(c,f);
        x=x+sx;
        y=y+sy;
        c=retcar(x,y);
        if(retcar(x,y)=='X')
        {
            crece=crece+12;
            tachan(modo,f);
            veopun(++puntos);
        }
        if (crece&&crece--)
            actualiza(cola,addrxy(x,y),1);
        else
            actualiza(cola,addrxy(x,y),0);
    }while (c!='#'&&c!='*');
return 0;
}

Comments are in spanish, if you need any information about it, please let me know.