开通博客有些日子了,突然想贴上自己大一上做的小项目了,纯c语言写的,用的数组。
用devc直接运行的话呢,会有些闪屏,但是用vs稍微处理下就好了。
直接贴代码啦。
#include<stdio.h> #include<conio.h> //方向键输入的读取函数头文件 #include<stdlib.h> //随机函数的头文件 #include<time.h> #include<string.h> const int m=20; //行数, 欲阻止一个变量被改变,可以使用const关键字 const int n=60; //列,定义长宽 const char head='@'; const char body='#'; const char food='$'; char map[m][n]; struct snack { int x,y; int now; }snack[m*n]; int key; int dx[]={0,0,-1,1}; int dy[]={-1,1,0,0}; int sum=1,over=0; void button(); void appear(); void fappear(); void move(); void show(); void eat(int x,int y); int main() { appear(); show(); return 0; } void button() //游戏过程输入方向的判断 { if(kbhit()!=0)//在执行时,检测是否有按键按下,有按下返回非0值,一般是1,没有按下返回0;是非阻塞函数 { while(kbhit()!=0) key=getch();//取出所有的按键 switch(key) { case 75: snack[0].now=0; break; //left //75,77,72,80 is ascll值 case 77: snack[0].now=1; break;//right case 72: snack[0].now=2; break;//up case 80: snack[0].now=3; break;//down } } } void appear() { int sx,sy,i,j; sx=3; sy=5; snack[0].x=sx; //*** must initialize snack[0].y=sy; snack[0].now=1 ; system("title 贪吃蛇"); memset(map, ' ', sizeof(map)); //以‘ ’清零 system("cls"); //qing屏 printf(" c语言 贪吃蛇 "); map[sx][sy]=head; fappear(); for(i=0;i<m;i++) //地图 { for(j=0;j<n;j++) { if(i==0||j==0||i==m-1||j==n-1)map[i][j]='*'; printf("%c",map[i][j]);//头和食物已经包含进去了 } printf(" "); } // getch();// 在执行时,检测按下什么键,如果不按键该函数不返回;是阻塞函数 button(); } void fappear() { int fx,fy; while(1) { srand(time(0)); //种子 fx=rand()%(m-2)+1; fy=rand()%(n-2)+1; if(map[fx][fy]==' ') { map[fx][fy]=food; break; } } } void show() { int i,j; while(1) { _sleep(100); button(); move(); if(over) { printf(" gameover >_<"); getchar(); break; } system("cls"); printf(" c语言 贪吃蛇 "); for(i=0;i<m;i++) //刷新后地图 { for(j=0;j<n;j++) { if(i==0||j==0||i==m-1||j==n-1)map[i][j]='*'; printf("%c",map[i][j]); } printf(" "); } } //getch(); button(); } void move() { int x,y,i; x=snack[0].x; y=snack[0].y;//保存蛇头dang前位置 ,后来变成脖子的位置 map[x][y]=' '; snack[0].x=snack[0].x+dx[snack[0].now]; snack[0].y=snack[0].y+dy[snack[0].now];//蛇头先移动 if(map[snack[0].x][snack[0].y]=='$') eat(x,y);//吃到食物,及处理 if(map[snack[0].x][snack[0].y]=='*'||map[snack[0].x][snack[0].y]=='#') over=1; if(map[snack[0].x][snack[0].y]==' ') { map[snack[0].x][snack[0].y]='@'; for(i=1;i<sum;i++) { if(i==1) //i=1是尾巴,让尾巴为‘ ’ { map[snack[i].x][snack[i].y]=' '; } if(i==sum-1) //蛇头紧跟着的那一节,即脖子 { snack[i].x=x; snack[i].y=y; snack[i].now=snack[0].now; } else { snack[i].x=snack[i+1].x; snack[i].y=snack[i+1].y; snack[i].now=snack[i+1].now; } map[snack[i].x][snack[i].y]=body; } } } void eat(int x,int y) { sum++; map[snack[0].x][snack[0].y]='@'; snack[sum-1].x= x; snack[sum-1].y= y; snack[sum-1].now=snack[0].now; map[snack[sum-1].x][snack[sum-1].y]='#'; fappear(); }