您的位置:首页 > 编程语言 > C语言/C++

(C语言)自制贪吃蛇

2016-09-13 21:16 363 查看
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<time.h>

#define MAXL 20
#define MAXC 60

int flag=0; //chang du kong zhi
int changdu=2; //chang du yao jian qu 1
int xiaochuflag=0;
int count=0;//dao yi ding shu zhi sheng cheng yi ge dou zi
char gezi[MAXL][MAXC];
int fangxiang[4][2]={0,-1,0,1,-1,0,1,0};//shang xia zuo you x y
int zuobiao[100][2]; //chang du zui da wei 100
int zhongzi[100][2]; //bao cun dou zi zuo biao
int zhongzicount=0;

void zeromemory(char a[][MAXC]);
void gotoxy(int,int);
void panduan(char,int *,int *);
void savezuobiao(int a[][2],int *,int *);
void shengchengdian(int a[]); //hui diao han shu bi xu jia shang CALLBACK ,bu ran you cuo wu
int zhuangqiang(int a[]);
int shifouchidaodouzi(int a[]);

int main()
{
int x,y,m,n;
int temp[2];
char c='8';
int speed=200;
zeromemory(gezi);
for(m=0;m<MAXL;m++)
{
for(n=0;n<MAXC;n++)
{
printf("%c",gezi[m]
);
}
putchar('\n');
}
//timeSetEvent(3000,1,shengchengdian,0,TIME_PERIODIC);
x=MAXC/2;
y=MAXL/2;
gotoxy(x,y);
while(!(x>=(MAXC-1)||y>=(MAXL-1)||x<=0||y<=0))
{
while(!_kbhit())
{
panduan(c,&x,&y);
temp[0]=x;
temp[1]=y;
if(flag==0&&xiaochuflag==0)
xiaochuflag=1;
if(xiaochuflag==1)
{
gotoxy(zuobiao[flag][0],zuobiao[flag][1]);
putchar(' ');
}

gotoxy(temp[0],temp[1]);
Sleep(speed);//kong zhi she de su du
count++;
if(count==(2000/speed))//mei 2s sheng cheng yi ge dou zi
{
shengchengdian(temp);
count=0;
}
if(x>=(MAXC-1)||y>=(MAXL-1)||x<=0||y<=0)
{
MessageBox(NULL,"撞墙了","呵呵",MB_OK);
exit(0);
}
if(zhuangqiang(temp))
{
MessageBox(NULL,"撞到自己了","呵呵",MB_OK);
exit(0);
}
if(shifouchidaodouzi(temp))
{
changdu++;
}
putchar('a');
}
if(_kbhit())
c=getch();
}
MessageBox(NULL,"撞墙了","呵呵",MB_OK);
return 0;
}

void zeromemory(char a[][MAXC])
{
int m,n;
for(m=0;m<MAXL;m++)
{
for(n=0;n<MAXC;n++)
{
a[m]
=' ';
if(n==(MAXC-1)||m==(MAXL-1)||m==0||n==0)
a[m]
='*';
}
}
}

void gotoxy(int x,int y)
{
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE),c);
}

void panduan(char c,int *x,int *y)
{
savezuobiao(zuobiao,x,y);
switch(c)
{
case '2':
*x+=fangxiang[1][0];
*y+=fangxiang[1][1];
break;
case '4':
*x+=fangxiang[2][0];
*y+=fangxiang[2][1];
break;
case '6':
*x+=fangxiang[3][0];
*y+=fangxiang[3][1];
break;
case '8':
*x+=fangxiang[0][0];
*y+=fangxiang[0][1];
break;
default:
break;
}
}

void savezuobiao(int a[][2],int *x,int *y)
{
a[flag][0]=*x;
a[flag][1]=*y;
flag++;
if(flag>=changdu)
flag%=changdu;
}

void shengchengdian(int a[])
{
int x,y,m;
srand((unsigned)time(NULL));
x=rand()%(MAXC-1);
//srand((unsigned)time(NULL)); zhi xu yao yi ju liang ge de hua hui chan sheng xiang tong de
y=rand()%(MAXL-1);
if(x==0)
x=1;
if(y==0)
y=1;
for(m=0;m<100;m++)
{
if(zhongzi[m][0]==0&&zhongzi[m][1]==0)
{
zhongzi[m][0]=x;
zhongzi[m][1]=y;
break;
}
}
gotoxy(x,y);
printf("A");
gotoxy(a[0],a[1]);
}

int zhuangqiang(int a[])
{
int m;
for(m=0;m<(changdu-1);m++)
{
if(zuobiao[m][0]==a[0]&&zuobiao[m][1]==a[1])
return 1;
}
if(m==(changdu-1))//zhe ju ye cuo wu de hua ,hui hua bu chu tu xiang
return 0;
else
return 1;
}

int shifouchidaodouzi(int a[])
4000

{
int m;
for(m=0;m<100;m++)
{
if(zhongzi[m][0]==a[0]&&zhongzi[m][1]==a[1])
{
zhongzi[m][0]=0;
zhongzi[m][1]=0;
return 1;
}
}
if(m==100)
return 0;
else
return 1;
}

闲来无事,做了个贪吃蛇程序。只实现了基本的功能,吃豆子长大以及撞墙自杀判定。
操作方法:8 2 4 6分别代表上下左右。

制作思路:①先做出蛇移动的地图(含边界),用一个二维字符数组保存,并在主函数里画出来;

    ②再实现按键让蛇动起来,先一次动一下,实现了之后,尝试用循环让其自己动,并用Sleep()控制行动的速度;

    ③想办法让画出的字符消掉,用另外的字符数组保存蛇的轨迹,根据其长度,每运行至超过长度的点就控制光标返回保存的最后一个点的位置,消除,再返回;

    ④再想办法让蛇经过一点时长大,实现了之后,制作随机生成点的函数,我是用数组保存生成的每个点,当判定吃掉这个点之后,将点去掉;

    ⑤制作撞墙判定,光标位置不超过边界即可;

    ⑥制作自杀判定, 光标的坐标与蛇的轨迹相重合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息