贪食蛇(文本模式)
/**********************************************/
/* 程序名称:贪食蛇1.1(文本模式) */
/* 程序作者:Knocker */
/* 完成日期:2004.10.20 */
/* 编译环境:Windows me + Win-TC 1.9.1 */
/* Email : knocker.k@163.com */
/* 程序说明:有两种死法,一:蛇首被困闷死 */
/* 二:咬到自己尾巴 */
/* 方向键控制蛇行方向 */
/* 修改说明:2004.10.21优化了print_mop() */
/**********************************************/
#include <stdio.h>
#include <dos.h>
#define maxX 76
#define maxY 22
void exitt();
void moveadd(int*A,int*x,int*y);
void findend(int x,int y);
void rand_have();
void print_mop();
int X=0,Y=1,X1=0,Y1=0,a=2 ;
/*X,Y 蛇头所在数组下标,a表示蛇的运动方向,
0,1,2,3,分别标记蛇的运动方向上,右,下,左*/
int endX0=5,endY0=5;
int t=1 ;/*食物产生控制旗标*/
char mop[maxY][maxX]={0};
int main()
{
char c ;
union REGS regs;
regs.h.ah=1;
regs.h.ch=13;
regs.h.cl=0;
int86(0x10,®s,®s);
mop[0][0]=-1 ; /*-1标记蛇尾*/
mop[0][1]=4 ;
rand_have();
while(1)
{
while(bioskey(1)==0)
{ X1=X,Y1=Y;
moveadd(&a,&X,&Y);
print_mop();
if(t==0)rand_have(),t=1 ;
delay(3500);
}
c=bioskey(0)>>8 ;
if(c==75)a=3 ;
if(c==77)a=1 ;
if(c==72)a=0 ;
if(c==80)a=2 ;
}
}
void moveadd(int*A,int*X,int*Y)
{
int tmep;
if(*A==0)
if(*X-1>=0&&(!mop[*X-1][*Y]||mop[*X-1][*Y]==10||mop[*X-1][*Y]==-1))
{
if(mop[*X-1][*Y]==-1)exitt();
if(mop[*X-1][*Y]!=10)findend(*X,*Y);
else t=0 ;
mop[*X-1][*Y]=(*A+2)%4+1 ;
*X=*X-1 ;
}
else *A=rand()%2?3:1;
if(*A==2)
if(*X+1<maxY&&(!mop[*X+1][*Y]||mop[*X+1][*Y]==10||mop[*X+1][*Y]==-1))
{
if(mop[*X+1][*Y]==-1)exitt();
if(mop[*X+1][*Y]!=10)findend(*X,*Y);
else t=0 ;
mop[*X+1][*Y]=(*A+2)%4+1 ;
*X=*X+1 ;
}
else *A=rand()%2?1:3;
if(*A==1)
if(*Y+1<maxX&&(!mop[*X][*Y+1]||mop[*X][*Y+1]==10||mop[*X][*Y+1==-1]))
{
if(mop[*X][*Y+1]==-1)exitt();
if(mop[*X][*Y+1]!=10)findend(*X,*Y);
else t=0 ;
mop[*X][*Y+1]=(*A+2)%4+1 ;
*Y=*Y+1 ;
}
else*A=rand()%2?0:2 ;
if(*A==3)
if(*Y-1>=0&&(!mop[*X][*Y-1]||mop[*X][*Y-1]==10||mop[*X][*Y-1]==-1))
{
if(mop[*X][*Y-1]==-1)exitt();
if(mop[*X][*Y-1]!=10)findend(*X,*Y);
else t=0 ;
mop[*X][*Y-1]=(*A+2)%4+1 ;
*Y=*Y-1 ;
}
else*A=rand()%2?2:0 ;
}
void findend(int x,int y)
{
switch(mop[x][y]-1)
{
case 0 :
if(mop[x-1][y]==-1)
{
mop[x-1][y]=0 ;
endX0=x-1;
endY0=y;
mop[x][y]=-1 ;
}
else findend(x-1,y);
break ;
case 1 :
if(mop[x][y+1]==-1)
{
mop[x][y+1]=0 ;
endX0=x;
endY0=y+1;
mop[x][y]=-1 ;
}
else findend(x,y+1);
break ;
case 2 :
if(mop[x+1][y]==-1)
{
mop[x+1][y]=0 ;
endX0=x+1;
endY0=y;
mop[x][y]=-1 ;
}
else findend(x+1,y);
break ;
case 3 :
if(mop[x][y-1]==-1)
{
mop[x][y-1]=0 ;
endX0=x;
endY0=y-1;
mop[x][y]=-1 ;
}
else findend(x,y-1);
break ;
}
}
void rand_have()
{
int x,y ;
qq :
x=rand()%maxY ;
y=rand()%maxX ;
if(mop[x][y]==0)
{
mop[x][y]=10 ;
gotoxy(y+1,x+2);
printf("X");
}
else goto qq ;
}
void print_mop()
{
gotoxy(endY0+1,endX0+2);
printf(" ");
gotoxy(Y+1,X+2);
printf("O");
gotoxy(Y1+1,X1+2);
printf("o");
}
void exitt()
{
gotoxy(10,10);
printf("The game is over!");
getch();
exit();
}