First 1 c语言贪吃蛇小游戏
欢迎交流 如有侵权还请联系
大家好! 每个人都想第一次尝试做出一个自己的程序。我想做这个贪吃蛇想了很久,但拖拉了不少时间才做出来,教训就是想到就要去做,拖延是可耻的。借鉴了很多人的代码,如果有侵权还请联系我会删除。
程序开发步骤
1.加载头文件
2.写出宏定义
3.系统结构
4.功能模块
5.代码运行调试
6.总结
1.加载头文件
#include<stdio.h> 标准输入输出
#include<string.h> 使用字符数组 strlen strcmp strcpy
#include<windows.h>
包含 WINDEF.H基础数据类型定义,WINNTH.H支持Umicode类型定义,WINBASE.H内核函数,WINUSER.H用户界面函数,WINGDI.H 图形设备接口函数
#include<time.h> 日期和时间头文件
#include<conio.h> 控制台输入输出,UNIX和Linux平台不包含此文件
2.宏定义
#define MAOWIDTH 60
#define MAPHEIGHT 30
#define SNAKESIZE 40
3.系统结构
typedef struct Food
{
int x;
int y;
};
Food food;
typedef struct Snake
{
int x[SNAKESIZE];
int y[SNAKESIZE];
int len;
int speed;
};
Snake snake;
4.功能模块
void Furish(); //游戏结束后
void creatMap(); //画出地图
void creatFood(); //食物更替
void keydown(); //按键处理
int statuesnake(); //判断结束
void gotoxy(int x,int y); //光标移动
5.代码运行调试
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<time.h>
#include<conio.h>
//辅助宏定义
#define MAPHEIGHT 30
#define MAPWIDTH 60
#define SNAKESIZE 100
//数据设计
typedef struct Food
{
int x;
int y;
};
Food food;
typedef struct Snake
{
int x[SNAKESIZE];
int y[SNAKESIZE];
int len;
int speed;
};
Snake snake;
int changeflag=0; //蛇有没有吃食物
int click=‘w’;
void Furish();
void creatMap();
void creatFood();
void keydown();
int statuesnake();
void gotoxy(int x,int y);
int main()
{
creatMap();
while(1)
{
creatFood();
Sleep(snake.speed);
keydown();
if(!statuesnake())
{
Furish();
break;
}
}
return 0;
}
/
void gotoxy(int x,int y)
{
HANDLE handle= GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X=x;
coord.Y=y;
//同步控制台
SetConsoleCursorPosition(handle,coord);
}
int statuesnake()
{
if(snake.x[0]==0||snake.x[0]==MAPWIDTH||snake.y[0]==0||snake.y[0]==MAPHEIGHT)
return 0;
for(int k=1;k<snake.len;k++)
{
if(snake.x[k]==snake.x[0]&&snake.y[k]==snake.y[0])
return 0;
}
return 1;
}
///
void creatMap()
{
srand((unsigned int)time(NULL));
for(int i=0; i<=MAPHEIGHT;i++)
{
gotoxy(0,i);
printf("█");
gotoxy(MAPWIDTH,i);
printf("█");
}
for(int i=0;i<=MAPWIDTH;i+=2)
{gotoxy(i,0);
printf("█");
gotoxy(i,MAPHEIGHT);
printf("█");
}
///
//蛇头
snake.x[0]=MAPWIDTH /2;
snake.y[0]=MAPHEIGHT /2;
gotoxy(snake.x[0],snake.y[0]);
printf("█");
snake.len=3;
snake.speed=300;
for(int k=1;k<snake.len;k++)
{
snake.x[k]=snake.x[k-1]+2;
snake.y[k]=snake.y[k-1];
gotoxy(snake.x[k],snake.y[k]);
printf("█");
}
/
//画食物
food.x=rand() % (MAPWIDTH-4)+2;
food.y=rand() % (MAPHEIGHT-2)+1;
gotoxy(food.x,food.y);
printf("⊙");
}
void creatFood()
{
if(snake.x[0]==food.x&&snake.y[0]food.y)
{
srand((int)time(NULL));//随机函数种子,食物出现位置
int flag =1;
while(flag1)
{
food.x=rand()%(MAPWIDTH-4)+2;
food.y=rand()%(MAPHEIGHT-2)+1;//边框内
for(int k=0;k<snake.len;k++)
{
if(snake.x[k]==food.x&&snake.y[k]==food.y)
{
flag=0;
break;
}
}
if(flag!=0&&food.x%2==0)
{
break;
}
}
gotoxy(food.x,food.y);
printf("⊙");
snake.len++;
changeflag=1; //食物被吃了
gotoxy(MAPWIDTH+2,MAPHEIGHT+2);
printf("%d",snake.len);
}
}
/
void keydown()
{
if(_kbhit()) //有无接收到按键
{
fflush(stdin);
click=_getch();
}
//擦除最后一个的轨迹
if(!changeflag)
{
gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
printf(" ");
}
/后面的蛇身
for(int i=snake.len-1;i>0;i--)
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(click)
{
case 'w':
snake.y[0]--;
break;
case 's':
snake.y[0]++;
break;
case 'a':
snake.x[0] -= 2;
break;
case 'd':
snake.x[0] += 2;
break;
}
gotoxy(snake.x[0],snake.y[0]);
printf("█");
changeflag=0;
gotoxy(MAPHEIGHT+2,0);//移动不能一直看着光标
}
void Furish()
{
system(“cls”);
gotoxy(MAPWIDTH/2,MAPHEIGHT/2);
printf("/");
gotoxy(MAPWIDTH/2,MAPHEIGHT/2+4);
printf(“come over”);
gotoxy(MAPWIDTH/2,MAPHEIGHT/2+8);
printf("/");
system(“pause”);
}
6.总结
kbhit()检查键盘中是否有输入;
ffiush(stdin)清空缓冲区;
system(""cls)清屏函数;
while(1)死循环,除非为假一直执行;
注意标点符号,格式内容是否正确,函数调用是否合理,条件位置是否正确;
还有许多不足,欢迎大家指正。