C语言 贪吃蛇 自动行走

  • 格式:doc
  • 大小:26.00 KB
  • 文档页数:6

#include<>
#include<>
#include<>
#include <>

//定位函数
void GotoXY(short y,short x)
{
HANDLE app=GetStdHandle(STD_OUTPUT_HANDLE);
COORD t;
=y;
=x*2;
SetConsoleCursorPosition(app,t);
}
#define CHANG 30
#define KUAN 30
#define LONG 100 //蛇的最大长度
int Y=(CHANG+2)/2;
int X=(KUAN+8)/2; //头的初始坐标
int Y1=(CHANG+2)/2-1;
int X1=(KUAN+8)/2-4; //头在数组中的初始位置

int main()
{
int i,j,k=0,n=0;
int judge=1; //judge--判断是否可执行del,0可,1不可
int score=0; //score--分数
int randjudge=0; //食物置放条件的判断
int rulejudge=0;
char c=0,c1;
int youxi[CHANG][KUAN]={0}; //外围边框初始化
int del[2]={Y,X}; //定位到删除的位置
char snlong[LONG]={0}; //snack long简写,蛇的长度,记录消除坐标
clock_t time;
int timedif;
int speed=500;
int speedjudge;
printf("\t\t\t\t 贪吃蛇\n");

// 外围框架
for(i=0;i {
printf("\t");
for(j=0;j

if(i==0||j==0||KUAN-j==1||CHANG-i==1)
{
youxi[i][j]=1;
printf("■");
if(KUAN-j==1)
printf("\n ");
}
else printf(" ");
}

GotoXY(6,0); //操作和退出说明
printf("方向:\n 5\n123\n");
printf("\n退出:\nESC\n\n");
printf("加速:7\n");
printf("减速:4\n");

GotoXY(Y,X); //初始头的位置
printf("■");
youxi[Y1][X1]=1;

while(c!=27)
{
if(randjudge==0) //满足食物置放条件
{
do
{
i=rand()%(CHANG-2)+2;
j=rand()%(KUAN-2)+5;
}
while(youxi[i-1][j-4]!=0);

GotoXY(i,j); //食物置放
printf("■");
youxi[i-1][j-4]=2;
}
randjudge=1; // 重置随机食物置放的条件
srand(clock()); // 运用随机数种子,使置放更随机

//if-3个elseif上下左右
if(c=='5')//上
{
if(youxi[Y1-1][X1]==1)
{
rulejudge=1;
break;
}
else if(youxi[Y1-1][X1]!=2) //判断是否吃到,没吃到则达到尾端消除条

judge=0;
else //吃到则满足随机放置食物条件
{
randjudge=0;
score++;
}
snlong[k++]=c; //用于消除的坐标存储

youxi[--Y1][X1]=1; //行进的位置置1,用于阻断头的穿插重复
GotoXY(--Y,X); //行进显示
printf("■");

}
else if(c=='2')//下
{
if(youxi[Y1+1][X1]==1)
{
rulejudge=1;
break;
}
else if(youxi[Y1+1][X1]!=2)
judge=0;
else
{
randjudge=0;
score++;
}

snlong[k++]=c;
youxi[++Y1][X1]=1;
GotoXY(++Y,X);
printf("■");
}
else if(c=='1')//左
{
if(youxi[Y1][X1-1]==1)
{
rulejudge=1;
break;
}
else if(youxi[Y1][X1-1]!=2)
judge=0;
else
{
randjudge=0;
score++;
}
snlong[k++]=c;

youxi[Y1][--X1]=1;
GotoXY(Y,--X);
printf("■");
}

else if(c=='3')//右
{
if(youxi[Y1][X1+1]==1)
{
rulejudge=1;
break;
}
else if(youxi[Y1][X1+1]!=2)
judge=0;
else
{
randjudge=0;
score++;
}
snlong[k++]=c;

youxi[Y1][++X1]=1;
GotoXY(Y,++X);
printf("■");
}
//记录消除坐标的数组的循环使用
if(k>=LONG)
k=0;

//if{} 消除区
if(judge==0)
{
if(n>=LONG)
n=0;
switch(snlong[n])
{
case
'5':youxi[del[0]-1][del[1]-4]=0;GotoXY(del[0]--,del[1]+1);printf("\b ");break;
case
'2':youxi[del[0]-1][del[1]-4]=0;GotoXY(del[0]++,del[1]+1);printf("\b ");break;
case
'1':youxi[del[0]-1][del[1]-4]=0;GotoXY(del[0],del[1]--);printf(" ");break;
case
'3':youxi[del[0]-1][del[1]-4]=0;GotoXY(del[0],++del[1]);printf("\b ");break;
}
n++;
}
//重置消除入口的条件
judge=1;

//显示位置和分数
GotoXY(0,0);
printf("位置:\n%2d %2d\n",Y1,X1);
printf("分数:\n%d\n",score);

//超出长度
if(score>=LONG-1)
break;
//方向输入
time=clock();
timedif=1;
while(timedif)
{
if(kbhit())
c=getch();
if(clock()-time>=speed)
timedif=0;
}
//变速区
if(c!='4'&&c!='7')
c1=c;
switch(c)
{
case '7':speed-=speed>100100:0;c=c1;break;
case '4':speed+=speed<1000100:0;c=c1;break;
}
}
system("cls");
if(rulejudge==1)
printf("你输了,分数是:%d",score);
else printf("游戏结束, 你的分数是:%d",score);
printf("\n请按任意键退出");
getch();
}