问题补充说明:求大神给我一份贪吃蛇的代码,不要用到图形库函数的,只用time,stlib,stdio就好了,谢谢!
#include
#include
#include
#include
#include
#include
#defineN21
intapple[3],num;
char来自score[3];
cha360问答rtail[3];
voidgotoxy(intx,inty毛完参)//输出坐标
{
COORDpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
voidcolor(intb)//颜色函数
{
HANDLEhConsole=GetStdHa让吃振席什合威渐班频攻ndle((STD_OUTPUT_HANDLE));
SetConsoleTextAttribute(hConsole,b);
}
intBlock(char低工矿技济吗背水皇城head[2])//判断出界
{
if((head[优0]<1)||(head[0]>N)||(head[1]<1)||(head[1]>N))
return1;
return0;
}
intEat(charsnake[2])//吃了苹果
{
if((snake[0]==apple[0])&&(snake[1]==染调居粮神官要一apple[1]))
{
apple[0]=apple[1]=apple[2]=0;
gotoxy(N+44,10);
color(13);
printf("%d",score[0]*1告考地义艺卫么技留础杆0);
color(11);
return1;
}
return0;
}
voidDraw(char**snake,intlen)//蛇移动
{
if(apple[2])
{
gotoxy(apple[1]*2,apple[0]);
color(12);
printf("●");
color(仅希万货11);
}
gotoxy(tail[1]*2,t期容血界跟判死ail[0]);
if(tail终仍费互兰烧它井[2])
{
color(nu展命现培善误安蒸直m);
printf("★");
color(num);
}
else
printf("■");
gotoxy(snake[0][1]*2,snake[0][0]);
color(num);
printf("★");
color(num);
putchar('\n');
}
char**Move线(char**snake,chardirx,int*len)//控制方向
{
inti,full=Eat(snake[0]);
memcpy(tail,snake[(*len)-1],2);
for(未县随初小i=(*len)-1;i>0;--i)
memcpy(snake[i]训核做司终念永,snake[i-1],2);
switch(dirx)
{
case'w':case'W':--snake[0][0];break;
case's':case'S':++snake[0][0];break;
case'a':case'A':--s后天考下铁劳改谓宪nake[0][1];break;
case'd':case'D':++snake[0][1];break;
洲会如想都汽台间训实default:;
}
if(full)
{
snake=(char**)realloc(snake,sizeof(cha支介群神县权裂局r*)*((*len)+1));
snake[(*len)]=(char*)malloc(sizeof(char)*2);
memcpy(snake[(*len)],tail,2);
++(*len);
++score[0];
if(score[3]<16)
++score[3];
tail[2]=1;
}
else
tail[2]=0;
returnsnake;
}
voidinit(charplate[N+2][N+2千加居天金费民亲强],char***snake_x,int*len)//初始化
{
inti,j;
cha斯路r**snake=NULL;
*len=3;
score[0]=score[3]=3;
snake=(char**)realloc(snake,sizeof(char*)*(*len));
for(i=0;i<*len;++i)
snake[i]=(char*)malloc(sizeof(char)*2);
for(i=0;i<3;++i)
{
snake[i][0]=N/2+1;
snake[i][1]=N/2+1+i;
}
for(i=1;i<=N;++i)
for(j=1;j<=N;++j)
plate[i][j]=1;
apple[0]=rand()%N+1;apple[1]=rand()%N+1;
apple[2]=1;
for(i=0;i { gotoxy(0,i); for(j=0;j { switch(plate[i][j]) { case0: color(12);printf("□");color(11);continue; case1:printf("■");continue; default:; } } putchar('\n'); } for(i=0;i<(*len);++i) { gotoxy(snake[i][1]*2,snake[i][0]); printf("★"); } putchar('\n'); *snake_x=snake; } voidManual() { gotoxy(N+30,2); color(10); printf("按WSAD移动方向"); gotoxy(N+30,4); printf("按space键暂停"); gotoxy(N+30,8); color(11); printf("历史最高分为:"); color(12); gotoxy(N+44,8); printf("%d",score[1]*10); color(11); gotoxy(N+30,12); printf("你现在得分为:0"); } intFile_in()//取记录的分数 { FILE*fp; if((fp=fopen("C:\\tcs.txt","a+"))==NULL) { gotoxy(N+18,N+2); printf("文件不能打开\n"); exit(0); } if((score[1]=fgetc(fp))!=EOF); else score[1]=0; return0; } intFile_out()//存数据 { FILE*fp; if(score[1]>score[0]) {gotoxy(10,10); color(12); puts("闯关失败加油耶"); gotoxy(0,N+2); return0; } if((fp=fopen("C:\\tcs.txt","w+"))==NULL) { printf("文件不能打开\n"); exit(0); } if(fputc(--score[0],fp)==EOF) printf("输出失败\n"); gotoxy(10,10); color(12); puts("恭喜您打破记录"); gotoxy(0,N+2); return0; } voidFree(char**snake,intlen)//释放空间 { inti; for(i=0;i free(snake[i]); free(snake); } intmain(void) { intlen; charch='g'; chara[N+2][N+2]={{0}}; char**snake; srand((unsigned)time(NULL)); color(11); File_in(); init(a,&snake,&len); Manual(); while(ch!=0x1B)//按ESC结束 { Draw(snake,len); if(!apple[2]){ apple[0]=rand()%N+1; apple[1]=rand()%N+1; apple[2]=1; num++; if(num>8) num=0; } Sleep(200-score[3]*10); setbuf(stdin,NULL); if(kbhit()) { gotoxy(0,N+2); ch=getche(); } snake=Move(snake,ch,&len); if(Block(snake[0])==1) { gotoxy(N+2,N+2); puts("你输了"); File_out(); Free(snake,len); getche(); exit(0); } } Free(snake,len); exit(0); }