Snake Game Source Code
08/05/2018

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.