使用C语言自带的游戏图新库开发贪吃蛇

我看网上好多制作贪吃蛇的帖子都是对刚学习C语言的同学们很不友好,制作的都是控制台,黑窗口的贪吃蛇游戏,能做出来但是感觉很无趣,不太像正常的游戏,接下来我将制作完全制作一款有趣的C语言贪吃蛇游戏

直接上游戏效果

开发环境搭建

小伙伴们首先应该学会 工欲善其事必先利其器

  1. 开发工具VC 6.0 或 使用VS2010 Express即可
  2. 下载C语言的EasyX图形库

注解1:
首先为啥用VC/VS2010 Express,这两个开发工具兼容C语言的EasyX库,不要在乎工具有多老,和项目最搭配的才是最好的,就像我以前使用Turbe C开发过游戏一样,适合就好。

注解2:
直接面向百度,不了解的小伙伴可以自己查查EasyX是个啥,然后第一条链接是下载的官网里面有任何你想要学习的内容,很多程序员开发的游戏可以学习:

我这里下载的是Vs2010 Express,然后使用图形库的api来开发游戏

开发思路

  1. 制作蛇通过结构体描述
  2. 制作地图通过结构体描述
  3. 制作随机产生食物
  4. 蛇能通过上下左右移动、能穿墙、不能撞自己
  5. 蛇吃到食物长一节身体

项目结构

img保存了所有使用的图片素材
music游戏中使用的音乐、音效
snake.cpp就是这个游戏的代码了

img内容如下

music内容如下

实际开发

首先导入所用到的头文件

#include <easyx.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#pragma comment(lib, "winmm.lib")

再声明好整个项目所用到的所有函数,这里我做了一个具体的思考过后,所用到的函数如下:

void move();
void body();
void wall();
void eat();
void kill();
void gameOver();
void reGame();
void stop();
void gameWin();

然后定义游戏中所用到的所有数据结构,代码如下:

struct BODYXY
{int x;int y;
};struct snake
{int x;int y;int width;int height;bool life;int drection;   //1上 2右 3下 4左int body;BODYXY bodyxy[215];
};struct foods
{bool needcreate;int x;int y;
};struct MAP
{int x;int y;
};

定义好游戏中所有用到的全局变量,代码如下:

snake s;
foods f;
IMAGE bodyimg;
IMAGE foodimg;
IMAGE continueimg;
MOUSEMSG m;
#define WIDTH 900   //屏幕宽高900*600
#define HEIGHT 600
MAP map[12][18];
bool gameover = false;
bool stopgame = false;

这里图形库中播放音乐使用代码如下:

PlaySound("music/game_music.wav", NULL, SND_ASYNC | SND_LOOP);

输出图片的代码如下:

putimage(50*j,50*i,&background);

循环播放SND_LOOP

游戏延迟的代码如下:

Sleep(250);

键盘控制上下左右代码如下:

 if(kbhit()){flag = getch();if(flag == 224){flag = getch();if(flag == 72 && s.drection != 3)  //上{s.drection = 1;}if(flag == 80 && s.drection != 1)   //下{s.drection = 3;}if(flag == 75 && s.drection != 2)   //左{s.drection = 4;}if(flag == 77 && s.drection != 4)   //右{s.drection = 2;}}

在游戏地图中,是分成每个块每个块的,所以我们让游戏跑起来之前必先要做的一件事就是开发地图,详细原理如下图:

实现的地图每个块的算法大概就是,如下代码:

 for(int i=0;i<12;i++){for(int j=0;j<18;j++){    map[i][j].x = 50*j;map[i][j].y = 50*i;}}

游戏内所有属性的初始化

 //初始化蛇属性s.x = map[11][9].x;s.y = map[11][9].y;s.width = 50;s.height = 50;s.life = true;s.drection = 1;s.body = 1;for(int i=0;i<215;i++){s.bodyxy[i].x = -10000;s.bodyxy[i].y = -10000;}f.needcreate = true;f.x = -100000;f.y = -100000;//绘制背景initgraph(WIDTH,HEIGHT);IMAGE background;loadimage(&background,_T("img/rectbg3.png"));//绘制蛇头IMAGE head;loadimage(&head,_T("img/snake_head2.png"));loadimage(&bodyimg,_T("img/snake_body.png"));loadimage(&foodimg,_T("img/addblood2.png"));loadimage(&continueimg,_T("img/continue.png"));

主体函数代码如下:

while(true){ int flag;if(kbhit()){flag = getch();if(flag == 224){flag = getch();if(flag == 72 && s.drection != 3) //上{s.drection = 1;}if(flag == 80 && s.drection != 1)   //下{s.drection = 3;}if(flag == 75 && s.drection != 2)   //左{s.drection = 4;}if(flag == 77 && s.drection != 4)   //右{s.drection = 2;}}  if(gameover){if(flag == 32){reGame();}}else if(flag == 32){//暂停stop();}}if(!gameover && !stopgame){//绘制游戏背景for(int i=0;i<12;i++){for(int j=0;j<18;j++){ putimage(50*j,50*i,&background);}}//移动蛇move();//碰撞eat();//蛇头putimage(s.x,s.y,&head);//蛇身体body();//食物if(f.needcreate == false){putimage(f.x,f.y,&foodimg);}//是否自杀kill();//gameoverif(gameover == true){gameOver();}//winif(s.body >= 215){gameover = true;gameWin();}wall();}Sleep(250);}

绘制游戏主体函数,代码如下:

void body()
{       //绘制bodyfor(int i=0;i<s.body;i++){    putimage(s.bodyxy[i].x,s.bodyxy[i].y,&bodyimg);}
}

蛇具体移动函数,代码如下:

void move()
{   //循环得到前一个bodyint prx,pry;for(int i=s.body-1;i>0;i--){s.bodyxy[i].x = s.bodyxy[i-1].x;s.bodyxy[i].y = s.bodyxy[i-1].y;}s.bodyxy[0].x = s.x;s.bodyxy[0].y = s.y;if(s.drection == 1){s.y-=50;}else if(s.drection == 2){s.x+=50;}else if(s.drection == 3){s.y+=50;}else if(s.drection == 4){s.x-=50;}
}

撞墙后,让蛇从另一边穿过,具体代码如下:

void wall()
{   //上方if(s.y+50 < 0){s.y = HEIGHT - 50;}//上方if(s.y+50 > HEIGHT){s.y = 0;}//左方if(s.x+50 < 0){s.x = WIDTH - 50;}//右方if(s.x+50 > WIDTH){s.x = 0;}
}

吃到食物后的具体函数,代码如下:

void eat()
{   int sx = s.x + s.width/2;int sy = s.y + s.height/2;if(sx >= f.x && sx <= f.x + 50)if(sy >= f.y && sy <= f.y + 50){    f.needcreate = true;s.body++;}if(f.needcreate == true){srand((unsigned)time(NULL));int ri = (int)(rand()%12);int rj = (int)(rand()%18);f.x = map[ri][rj].x;f.y = map[ri][rj].y;f.needcreate = false;}}

吃到食物后,也就是碰撞到食物后让食物继续创建,通过needcreate这个枚举变量来操作,通过rand()函数实现让食物随机出现在地图上某个位置。

如果蛇碰到了自己就执行游戏结束,代码如下:

void kill()
{       int sx = s.x + s.width/2;int sy = s.y + s.height/2;for(int i=0;i<s.body;i++){if(sx >= s.bodyxy[i].x && sx <= s.bodyxy[i].x + 50)if(sy >= s.bodyxy[i].y && sy <= s.bodyxy[i].y + 50){    gameover = true;break;}}}

制作游戏结束音效和页面,代码如下:

void gameOver()
{   PlaySound("music/game_over.wav", NULL, SND_ASYNC);putimage(WIDTH/2-150,HEIGHT/2-150,&continueimg);
}

继续游戏,然后初始化数据,代码如下:

void continueGame()
{//初始化蛇属性s.x = map[11][9].x;s.y = map[11][9].y;s.width = 50;s.height = 50;s.life = true;s.drection = 1;s.body = 1;for(int i=0;i<215;i++){s.bodyxy[i].x = -10000;s.bodyxy[i].y = -10000;}f.needcreate = true;f.x = -100000;f.y = -100000;
}

游戏胜利的音效和页面,代码如下:

void gameWin()
{PlaySound("music/win.wav", NULL, SND_ASYNC);putimage(WIDTH/2-150,HEIGHT/2-150,&continueimg);
}

重新游戏,代码如下:

void reGame()
{   gameover = false;//初始化蛇属性s.x = map[11][9].x;s.y = map[11][9].y;s.width = 50;s.height = 50;s.life = true;s.drection = 1;s.body = 1;for(int i=0;i<215;i++){s.bodyxy[i].x = -10000;s.bodyxy[i].y = -10000;}f.needcreate = true;f.x = -100000;f.y = -100000;PlaySound("music/game_music.wav", NULL, SND_ASYNC | SND_LOOP);
}

暂停游戏,代码如下:

void stop()
{stopgame = !stopgame;PlaySound("music/stop.wav", NULL, SND_ASYNC);if(stopgame == false){PlaySound("music/game_music.wav", NULL, SND_ASYNC | SND_LOOP);}
}

整个游戏的代码如下:

#include <easyx.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#pragma comment(lib, "winmm.lib")void move();
void body();
void wall();
void eat();
void kill();
void gameOver();
void reGame();
void stop();
void gameWin();struct BODYXY
{int x;int y;
};struct snake
{int x;int y;int width;int height;bool life;int drection;   //1上 2右 3下 4左int body;BODYXY bodyxy[215];
};struct foods
{bool needcreate;int x;int y;
};struct MAP
{int x;int y;
};snake s;
foods f;
IMAGE bodyimg;
IMAGE foodimg;
IMAGE continueimg;
MOUSEMSG m;
#define WIDTH 900
#define HEIGHT 600
MAP map[12][18];
bool gameover = false;
bool stopgame = false;
int main()
{   PlaySound("music/game_music.wav", NULL, SND_ASYNC | SND_LOOP);for(int i=0;i<12;i++){for(int j=0;j<18;j++){    map[i][j].x = 50*j;map[i][j].y = 50*i;}}//初始化蛇属性s.x = map[11][9].x;s.y = map[11][9].y;s.width = 50;s.height = 50;s.life = true;s.drection = 1;s.body = 1;for(int i=0;i<215;i++){s.bodyxy[i].x = -10000;s.bodyxy[i].y = -10000;}f.needcreate = true;f.x = -100000;f.y = -100000;//绘制背景initgraph(WIDTH,HEIGHT);IMAGE background;loadimage(&background,_T("img/rectbg3.png"));//绘制蛇头IMAGE head;loadimage(&head,_T("img/snake_head2.png"));loadimage(&bodyimg,_T("img/snake_body.png"));loadimage(&foodimg,_T("img/addblood2.png"));loadimage(&continueimg,_T("img/continue.png"));while(true){   int flag;if(kbhit()){flag = getch();if(flag == 224){flag = getch();if(flag == 72 && s.drection != 3) //上{s.drection = 1;}if(flag == 80 && s.drection != 1)   //下{s.drection = 3;}if(flag == 75 && s.drection != 2)   //左{s.drection = 4;}if(flag == 77 && s.drection != 4)   //右{s.drection = 2;}}  if(gameover){if(flag == 32){reGame();}}else if(flag == 32){//暂停stop();}}if(!gameover && !stopgame){//绘制游戏背景for(int i=0;i<12;i++){for(int j=0;j<18;j++){ putimage(50*j,50*i,&background);}}//移动蛇move();//碰撞eat();//蛇头putimage(s.x,s.y,&head);//蛇身体body();//食物if(f.needcreate == false){putimage(f.x,f.y,&foodimg);}//是否自杀kill();//gameoverif(gameover == true){gameOver();}//winif(s.body >= 215){gameover = true;gameWin();}wall();}Sleep(250);}_getch();closegraph();return 0;
}void body()
{       //绘制bodyfor(int i=0;i<s.body;i++){    putimage(s.bodyxy[i].x,s.bodyxy[i].y,&bodyimg);}
}void move()
{   //循环得到前一个bodyint prx,pry;for(int i=s.body-1;i>0;i--){s.bodyxy[i].x = s.bodyxy[i-1].x;s.bodyxy[i].y = s.bodyxy[i-1].y;}s.bodyxy[0].x = s.x;s.bodyxy[0].y = s.y;if(s.drection == 1){s.y-=50;}else if(s.drection == 2){s.x+=50;}else if(s.drection == 3){s.y+=50;}else if(s.drection == 4){s.x-=50;}
}void wall()
{   //上方if(s.y+50 < 0){s.y = HEIGHT - 50;}//上方if(s.y+50 > HEIGHT){s.y = 0;}//左方if(s.x+50 < 0){s.x = WIDTH - 50;}//右方if(s.x+50 > WIDTH){s.x = 0;}
}void eat()
{   int sx = s.x + s.width/2;int sy = s.y + s.height/2;if(sx >= f.x && sx <= f.x + 50)if(sy >= f.y && sy <= f.y + 50){    f.needcreate = true;s.body++;}if(f.needcreate == true){srand((unsigned)time(NULL));int ri = (int)(rand()%12);int rj = (int)(rand()%18);f.x = map[ri][rj].x;f.y = map[ri][rj].y;f.needcreate = false;}}void kill()
{       int sx = s.x + s.width/2;int sy = s.y + s.height/2;for(int i=0;i<s.body;i++){if(sx >= s.bodyxy[i].x && sx <= s.bodyxy[i].x + 50)if(sy >= s.bodyxy[i].y && sy <= s.bodyxy[i].y + 50){    gameover = true;break;}}}void gameOver()
{   PlaySound("music/game_over.wav", NULL, SND_ASYNC);putimage(WIDTH/2-150,HEIGHT/2-150,&continueimg);
}void continueGame()
{//初始化蛇属性s.x = map[11][9].x;s.y = map[11][9].y;s.width = 50;s.height = 50;s.life = true;s.drection = 1;s.body = 1;for(int i=0;i<215;i++){s.bodyxy[i].x = -10000;s.bodyxy[i].y = -10000;}f.needcreate = true;f.x = -100000;f.y = -100000;
}void gameWin()
{PlaySound("music/win.wav", NULL, SND_ASYNC);putimage(WIDTH/2-150,HEIGHT/2-150,&continueimg);
}void reGame()
{   gameover = false;//初始化蛇属性s.x = map[11][9].x;s.y = map[11][9].y;s.width = 50;s.height = 50;s.life = true;s.drection = 1;s.body = 1;for(int i=0;i<215;i++){s.bodyxy[i].x = -10000;s.bodyxy[i].y = -10000;}f.needcreate = true;f.x = -100000;f.y = -100000;PlaySound("music/game_music.wav", NULL, SND_ASYNC | SND_LOOP);
}void stop()
{stopgame = !stopgame;PlaySound("music/stop.wav", NULL, SND_ASYNC);if(stopgame == false){PlaySound("music/game_music.wav", NULL, SND_ASYNC | SND_LOOP);}
}

代码量总共三百多行实现了一个小游戏

[C语言] 自制的贪吃蛇游戏相关推荐

  1. 【C语言项目】贪吃蛇游戏(上)

    00. 目录 文章目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) ...

  2. C 语言实现经典贪吃蛇游戏

    原文链接:C语言 贪吃蛇游戏 文章目录 一.说明 二.效果 2.1 欢迎界面 2.2 游戏规则 2.3 得分排行 2.4 退出游戏 2.5 游戏界面 2.6 游戏结束 三.源码 3.1 cmd.h 3 ...

  3. 贪吃蛇c语言课程设计报告下载,c语言课程设计-贪吃蛇游戏

    c语言课程设计-贪吃蛇游戏 C 语言课程设计 1 山东交通学院 C 语言课程设计 贪吃蛇游戏 院(系)别 交通与物流工程学院 班 级 物联 131 学 号 130516122 姓 名 王赛 指导教师 ...

  4. 好玩的c语言编程游戏,C语言写个贪吃蛇游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言写个贪吃蛇游戏 贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面 ...

  5. bat贪吃蛇游戏代码_C语言写个贪吃蛇游戏

    贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...

  6. C语言写个贪吃蛇游戏

    贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...

  7. x x x x c程序语言,C语言写个贪吃蛇游戏

    贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...

  8. 用C语言复现用贪吃蛇游戏(二)完结

    书接上回,咱们复现了贪吃蛇的页面,接下来是对游戏的操作进行复现: //移动小蛇 //第一步扫描数组canvas的所有元素,找到正数元素都加1 //找到最大元素(蛇尾巴),把其变为0 //找到等于2的元 ...

  9. 用c语言写一个贪吃蛇游戏代码

    首先,贪吃蛇是一个经典的游戏,主要通过控制一条蛇在地图上吃食物,不断长长身体,最终实现最高分数. 以下是使用C语言编写贪吃蛇游戏的示例代码: ``` #include<stdio.h> # ...

最新文章

  1. 【功能升级】达摩盘3.0全新标签介绍前言
  2. 一体机怎么修复音频服务器,教学触摸一体机没有声音怎么办?
  3. Linux命令(7):less命令
  4. jsf 导航_JSF动作方法导航示例教程– from-action标记
  5. 微信小程序(一):微信小程序与服务器的简单链接
  6. Java 求接近黄金分割数的鲁卡斯队列分子分母
  7. Kafka 与 RabbitMQ 如何选择使用哪个?
  8. cadence 旋转快捷键_cadence快捷键
  9. 凸包旋转卡壳(andrew)
  10. AWS云计算题目总结
  11. CUDA入门教程;Transformer太火不是好事?;探求GPU极限性能的利器|AI系统前沿动态...
  12. 风力发电机组的温升问题如何解决呢?
  13. sourcetree连接不上gitlab服务器
  14. python数据分析基础试题_Python数据分析基础知识
  15. 数据库,表数据的插入
  16. ORM的1+N查询问题及解决办法
  17. Excel 2007中日历控件使用
  18. 简单的弹窗应用(二)--AlertDialog
  19. 集成简易图片在线编辑,实现简易图片滤镜裁剪添加对话框
  20. Bellman-ford和SPFA算法

热门文章

  1. jsp+ssm+mysql综合项目实战教程:开发通用进销存管理系统
  2. 新入职员工Git配置方法
  3. 《地理信息系统导论》chapter 18 GIS模型与建模
  4. jquery刷新当前页面、刷新父级页面
  5. 知识点1:节点(树)的高度(深度)求法
  6. angular指令心得(ng-model)
  7. flex-grow和flex的区别
  8. 1131: 神犇的悲惨一生
  9. foxmail收发yahoo邮箱
  10. 最好的医生是自己:把吃出来的病吃回去