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;
=(char*)malloc(256*16*sizeof(char));
nviif(nvi==NULL)
return 0;
.r_ax=0x1130;
rp.r_bx=0x0600;
rp(0x10,&rp);
intr=(char*)MK_FP(rp.r_es,rp.r_bp);
pfor(i=0;i<256*16;i++)
*(nvi+i)=*(p+i);
*(nvi+88*16)=255;
/* Patron caracter */
/* modifica objeto que se coge 'X' */
("obj1.txt",'X',nvi);
cambia_car/* modifica pared '#' */
("obj2.txt",'#',nvi);
cambia_car/* modifica cuerpo culebra '*' */
("obj3.txt",'*',nvi);
cambia_car/* Fin patr¢n caracter */
;
asm push ax;
asm push bx;
asm push cx;
asm push dx;
asm push es;
asm push bp,1110h;
asm mov ax,1000h;
asm mov bx,0100h;
asm mov cx,0;
asm mov dx,nvi;
asm les bpint 10h;
asm ;
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) malloc(sizeof(struct TCuerpo));
PCuerpo ncu
->mem=p;
ncu->PSig=NULL;
ncu
if(cabeza->PSig==NULL)
{
->PSig=ncu;
cabeza}
else
{
->PSig=cabeza->PSig;
ncu->PSig=ncu;
cabeza}
}
(PCuerpo cabeza)
PCuerpo desencola{
,ant;
PCuerpo aux;
PCuerpo p=NULL;
aux=NULL;
pif(cabeza->PSig!=NULL)
{
=cabeza->PSig;
aux=NULL;
antwhile(aux->PSig!=NULL)
{
=aux;
ant=aux->PSig;
aux}
=aux;
p->PSig=NULL;
ant}
return p;
}
void pantalla()
{
();
clrscr(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);
caracter(0,0,79,22,'#',1,4);
cuadrado}
void actualiza(PCuerpo snk,char* p,char x)
{
;
PCuerpo auxif(x==0)
{
=desencola(snk);
PCuerpo aux(aux->mem,'',0,0);/*borramos £ltima direccion*/
pintaaddr(aux);
free}
(snk,p);
encola(p,'*',3,2);
pintaaddr}
void tachan(char modo,FILE *f)
{
int x;
int y;
if(modo)
{
=(getc(f)-'0')*10;
x=x+(getc(f))-'0';
x=(getc(f)-'0')*10;
y=y+(getc(f))-'0';
y}
else
{
do
{
=random(78);
x=random(21);
y}while(retcar(1+x,1+y)=='#'|retcar(1+x,1+y)=='*');
if(x<10)
{
('0',f);
putc('0'+x,f);
putc}
else
{
('0'+x/10,f);
putc('0'+x%10,f);
putc}
if(y<10)
{
('0',f);
putc('0'+y,f);
putc}
else
{
('0'+y/10,f);
putc('0'+y%10,f);
putc}
}
(1+x,1+y,'X',1+random(5),1+random(5));
caracter}
void veopun(int puntos)
{
(42,23,'0'+puntos/10,2,3);
caracter(43,23,'0'+puntos%10,2,3);
caracter}
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) malloc(sizeof(struct TCuerpo));
PCuerpo cola->PSig=NULL;
cola->mem=NULL;
cola();
pantalla();
prepara_video();
randomize
if(argc==2 && *argv[1]=='r') /* reproducir jugada guardada */
{
=fopen("partida.dat","r");
f=1;
modoif(f==NULL)
{
("No se puede abrir:r-partida.dat\n");
printfreturn 0;
}
}
else
{
=fopen("partida.dat","w");
f=0;
modoif(f==NULL)
{
("Error abriendo:w->partida.dat\n");
printfreturn 0;
}
}
(modo,f);
tachando{
=' ';
cif(modo || kbhit()!=0)
{
if(modo)
=getc(f);
celse
=getch();
cswitch(c)
{
case 'o':
if (!sy) sy=-1;
=0;
sxbreak;
case 'l':
if (!sy) sy=+1;
=0;
sxbreak;
case '¤':
=0;
syif(!sx) sx=1;
break;
case 'k':
=0;
syif(!sx) sx=-1;
break;
}
}
(75+(50*abs(sy))-(puntos*2));
delay
if(modo==0)
(c,f);
putc=x+sx;
x=y+sy;
y=retcar(x,y);
cif(retcar(x,y)=='X')
{
=crece+12;
crece(modo,f);
tachan(++puntos);
veopun}
if (crece&&crece--)
(cola,addrxy(x,y),1);
actualizaelse
(cola,addrxy(x,y),0);
actualiza}while (c!='#'&&c!='*');
return 0;
}
Comments are in spanish, if you need any information about it, please let me know.