[C语言] 自制的贪吃蛇游戏
使用C语言自带的游戏图新库开发贪吃蛇
我看网上好多制作贪吃蛇的帖子都是对刚学习C语言的同学们很不友好,制作的都是控制台,黑窗口的贪吃蛇游戏,能做出来但是感觉很无趣,不太像正常的游戏,接下来我将制作完全制作一款有趣的C语言贪吃蛇游戏
直接上游戏效果
开发环境搭建
小伙伴们首先应该学会 工欲善其事必先利其器
- 开发工具VC 6.0 或 使用VS2010 Express即可
- 下载C语言的EasyX图形库
注解1:
首先为啥用VC/VS2010 Express,这两个开发工具兼容C语言的EasyX库,不要在乎工具有多老,和项目最搭配的才是最好的,就像我以前使用Turbe C开发过游戏一样,适合就好。
注解2:
直接面向百度,不了解的小伙伴可以自己查查EasyX是个啥,然后第一条链接是下载的官网里面有任何你想要学习的内容,很多程序员开发的游戏可以学习:
我这里下载的是Vs2010 Express,然后使用图形库的api来开发游戏
开发思路
- 制作蛇通过结构体描述
- 制作地图通过结构体描述
- 制作随机产生食物
- 蛇能通过上下左右移动、能穿墙、不能撞自己
- 蛇吃到食物长一节身体
项目结构
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语言] 自制的贪吃蛇游戏相关推荐
- 【C语言项目】贪吃蛇游戏(上)
00. 目录 文章目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) ...
- C 语言实现经典贪吃蛇游戏
原文链接:C语言 贪吃蛇游戏 文章目录 一.说明 二.效果 2.1 欢迎界面 2.2 游戏规则 2.3 得分排行 2.4 退出游戏 2.5 游戏界面 2.6 游戏结束 三.源码 3.1 cmd.h 3 ...
- 贪吃蛇c语言课程设计报告下载,c语言课程设计-贪吃蛇游戏
c语言课程设计-贪吃蛇游戏 C 语言课程设计 1 山东交通学院 C 语言课程设计 贪吃蛇游戏 院(系)别 交通与物流工程学院 班 级 物联 131 学 号 130516122 姓 名 王赛 指导教师 ...
- 好玩的c语言编程游戏,C语言写个贪吃蛇游戏
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言写个贪吃蛇游戏 贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面 ...
- bat贪吃蛇游戏代码_C语言写个贪吃蛇游戏
贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...
- C语言写个贪吃蛇游戏
贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...
- x x x x c程序语言,C语言写个贪吃蛇游戏
贪吃蛇是个非常经典的游戏,用C语言来实现也是一个好玩的事情.这个游戏我写完后放在知乎,竟然点赞的人数超级多.我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的. 我试了说 ...
- 用C语言复现用贪吃蛇游戏(二)完结
书接上回,咱们复现了贪吃蛇的页面,接下来是对游戏的操作进行复现: //移动小蛇 //第一步扫描数组canvas的所有元素,找到正数元素都加1 //找到最大元素(蛇尾巴),把其变为0 //找到等于2的元 ...
- 用c语言写一个贪吃蛇游戏代码
首先,贪吃蛇是一个经典的游戏,主要通过控制一条蛇在地图上吃食物,不断长长身体,最终实现最高分数. 以下是使用C语言编写贪吃蛇游戏的示例代码: ``` #include<stdio.h> # ...
最新文章
- 【功能升级】达摩盘3.0全新标签介绍前言
- 一体机怎么修复音频服务器,教学触摸一体机没有声音怎么办?
- Linux命令(7):less命令
- jsf 导航_JSF动作方法导航示例教程– from-action标记
- 微信小程序(一):微信小程序与服务器的简单链接
- Java 求接近黄金分割数的鲁卡斯队列分子分母
- Kafka 与 RabbitMQ 如何选择使用哪个?
- cadence 旋转快捷键_cadence快捷键
- 凸包旋转卡壳(andrew)
- AWS云计算题目总结
- CUDA入门教程;Transformer太火不是好事?;探求GPU极限性能的利器|AI系统前沿动态...
- 风力发电机组的温升问题如何解决呢?
- sourcetree连接不上gitlab服务器
- python数据分析基础试题_Python数据分析基础知识
- 数据库,表数据的插入
- ORM的1+N查询问题及解决办法
- Excel 2007中日历控件使用
- 简单的弹窗应用(二)--AlertDialog
- 集成简易图片在线编辑,实现简易图片滤镜裁剪添加对话框
- Bellman-ford和SPFA算法