安装easyx,文件保存为cpp后缀
```C
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <windows.h>
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
void init(void);//初始化
void gamebegin(void);//游戏开始
void gameplay(void);//开始游戏
void gameend(void);//游戏借宿
void drawsnake(void);//绘制小蛇
void drawfood(void);//绘制食物
//定义坐标struct
struct Point{
int x,y;
};
struct Point aps[3871]; //定义界面所有点坐标数组
struct Point snake[3871];//定义蛇身的各个位置的坐标数组
struct Point food[100];//定义食物的各个位置的坐标数组
int apsindex=0; //定义界面所有点坐标数组索引
int snakeindex=0; //定义蛇身的各个位置的坐标数组索引
int foodindex=0; //定义食物的各个位置的坐标数组索引
struct Point snakehead={300,250};//定义蛇头的位置
int snakedirect; //1为上,2为下,3为左,4为右
int snakespeed=1; //设置蛇的速度
int snakelength=3; //初始化蛇的长度
int gamestop=0; //游戏是否结束
int stoptype; //游戏结束原因,值为1,则是撞墙,值为2则为碰到身子
int gamescore=0; //游戏分数
int gamelevel=1; //游戏等级
void main(void){
init();
gamebegin();
gameplay();
gameend();
}
//初始化函数
void init(void){
initgraph(1100,600);
}
//绘制分数
void drawscore(int score){
char s[50];
sprintf(s,"分数:%4d",score);
settextstyle(18, 0, _T("黑体"));
settextcolor(RGB(255,255,0));
outtextxy(950, 60, s);
}
//绘制等级
void drawlevel(int level){
char s[50];
sprintf(s,"等级:%4d",level);
settextstyle(18, 0, _T("黑体"));
settextcolor(RGB(255,255,0));
outtextxy(950, 80, s);
}
//绘制蛇
void drawsnake(){
setlinecolor(RGB(255,255,255));
setlinestyle(PS_SOLID, 1);
for(int i=0;i<snakeindex;i++){
if(i==0){
setfillcolor(RGB(255,0,0));
}else{
setfillcolor(RGB(128,128,0));
}
fillrectangle(snake[i].x-5,snake[i].y-5,snake[i].x+5,snake[i].y+5);
}
}
//擦除蛇尾
void earsesnaketail(){
//setlinestyle(PS_SOLID, 0);
setlinecolor(RGB(0,128,0));
setfillcolor(RGB(0,128,0));
fillrectangle(snake[snakeindex-1].x-5,snake[snakeindex-1].y-5,snake[snakeindex-1].x+5,snake[snakeindex-1].y+5);
}
//绘制食物
void drawfood(Point p1){
setlinestyle(PS_SOLID, 1);
setfillcolor(RGB(255,255,0));
fillrectangle(p1.x-5,p1.y-5,p1.x+5,p1.y+5);
}
//生成食物
void genfood(int index=-1){
//生产随机数0~3871
int r=rand()%3872;
//判断随机点aps[r]是否和蛇身所在位置是否重合
for(int j=0;j<snakeindex;j++){
if(aps[r].x==snake[j].x&&aps[r].y==snake[j].y){
//如果发生重合,j减一,重新循环一次
j--;
//重新生成随机数
r=rand()%3872;
}
}
if(index!=-1){
food[index]=aps[r];
}else{
food[foodindex]=aps[r];
foodindex++;
}
}
//游戏开始
void gamebegin(){
//1 绘制游戏界面
//1.1 设置游戏框
setfillcolor(RGB(0,128,0));
setlinestyle(PS_SOLID, 10);
fillrectangle(100,50,900,550);
//绘制分数
drawscore(gamescore);
//绘制等级
drawlevel(gamelevel);
//初始化所有点的坐标
for(int i=110;i<=890;i+=10){
for(int j=60;j<=540;j+=10){
aps[apsindex].x=i;
aps[apsindex].y=j;
apsindex++;
printf("%d,%d ",i,j);
}
}
//初始化小蛇身体数组
for(i=0;i<snakelength;i++){
snake[i].x=snakehead.x-10*i;
snake[i].y=snakehead.y;
snakeindex++;
}
//初始化食物的数组
//初始化随机数种子
srand((unsigned)time(NULL));
//绘制小蛇
drawsnake();
//绘制食物
//随机5个食物
for(i=0;i<10;i++){
genfood();
}
//画出食物
for(i=0;i<foodindex;i++){
drawfood(food[i]);
}
//drawfood();
}
//方向函数
void toward(struct Point temp){
//判断是否撞墙
if(temp.x<110||temp.x>890||temp.y<60||temp.y>540){
gamestop=1;
stoptype=1;
}
//判断是否蛇头碰到身子
for(int i=0;i<snakeindex;i++){
if(temp.x==snake[i].x&&temp.y==snake[i].y){
gamestop=1;
stoptype=2;
}
}
//定义蛇是否迟到食物变量iseat
bool iseat=0;
//判断是否吃到食物
for(i=0;i<foodindex;i++){
if(food[i].x==temp.x&&food[i].y==temp.y){
iseat=1;
//计算游戏分数
gamescore=gamescore+(snakeindex-snakelength+1)*2;
if(gamescore>400){
gamelevel=6;
}else if(gamescore>300){
gamelevel=5;
}else if(gamescore>200){
gamelevel=4;
}else if(gamescore>100){
gamelevel=3;
}else if(gamescore>10){
gamelevel=2;
}
genfood(i);
drawfood(food[i]);
}
}
Sleep(10);
if(iseat){
for(int i=snakeindex;i>0;i--){
snake[i]=snake[i-1];
}
snakeindex++;
snake[0]=temp;
}else{
earsesnaketail();
for(int i=snakeindex;i>0;i--){
snake[i]=snake[i-1];
}
snake[0]=temp;
}
drawsnake();
}
//向上
void towardsUp(){
struct Point newhead={snake[0].x,snake[0].y-10};
toward(newhead);
}
//向下
void towardsDown(){
struct Point newhead={snake[0].x,snake[0].y+10};
toward(newhead);
}
//向左
void towardsLeft(){
struct Point newhead={snake[0].x-10,snake[0].y};
toward(newhead);
}
//向右
void towardsRight(){
struct Point newhead={snake[0].x+10,snake[0].y};
toward(newhead);
}
void gameplay(){
//判断方向键,绘制蛇头的方块的方向,同时在蛇尾去掉方块
//判断方块是否和墙面接触,如果是则游戏结束,否则,继续往最后一次按键方向绘制方块
int dr=0;
while(gamestop!=1){
//判断方向键是否为上
if(KEYDOWN(VK_UP)&&dr!=2){
dr=1;
}
//判断方向键是否为下
if(KEYDOWN(VK_DOWN)&&dr!=1){
dr=2;
}
//判断方向键是否为左
if(KEYDOWN(VK_LEFT)&&dr!=4){
dr=3;
}
//判断方向键是否为右
if(KEYDOWN(VK_RIGHT)&&dr!=3){
dr=4;
}
switch(dr){
case 1:
towardsUp();
break;
case 2:
towardsDown();
break;
case 3:
towardsLeft();
break;
case 4:
towardsRight();
break;
}
//绘制分数
drawscore(gamescore);
//绘制等级
drawlevel(gamelevel);
switch(gamelevel){
case 1:
Sleep(80);
break;
case 2:
Sleep(70);
break;
case 3:
Sleep(60);
break;
case 4:
Sleep(50);
break;
case 5:
Sleep(40);
break;
case 6:
Sleep(20);
break;
}
}
}
void gameend(){
//绘制结束框
setfillcolor(RGB(255,0,0));
setlinestyle(PS_SOLID, 10);
fillrectangle(300,200,700,300);
char s[200];
if(stoptype==1){
sprintf(s,"你撞墙了,游戏结束!");
}else if(stoptype==2){
sprintf(s,"你咬到自己了,游戏结束!");
}else{
sprintf(s,"游戏结束!");
}
settextstyle(18, 0, _T("黑体"));
settextcolor(RGB(255,255,0));
RECT r = {300,200,700,300};
setbkmode(TRANSPARENT);
drawtext(s, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
while(1){
Sleep(10000);
};
getch();
closegraph();
}
```
![](https://files.ynotes.cn/18-10-30/5567999.jpg)
`下载链接`[贪吃蛇下载](https://files.ynotes.cn/%E8%B4%AA%E5%90%83%E8%9B%87.exe)