C++ 开发贪吃蛇游戏总结
一、思考贪吃蛇的思路:
1.在一个窗口绘制贪吃蛇,肯定少不了绘制的API,所以必不可少需要引入graphics.h这个图形界面库(里面封装了WIN 32大部分绘制API,如果没有的话,可以用GDI)。
2.贪吃蛇吃掉食物就会增长一点,可以把它看成是一节一节的。
3.蛇要移动,肯定会有坐标的变化。
4.既然蛇会移动,那么蛇吃掉食物的时候食物当然也是随机变化的,所以食物也有坐标。
5.蛇的碰撞检测(蛇头碰到边界或者碰到自己的身体某部分,就死亡(game over))。
6.蛇要有方向才可以
7.需要读取键盘操作,改变蛇的方向
二、补充graphics.h图形库的基础知识
1.创建一个绘制窗口
API:
void initgraph(int width,int height) //创建宽x,高y的图形窗口
2.清除窗口屏幕所有绘制
API:
void cleardevice() //清空整个窗口的绘制
3.在指定位置输出文字
API:
void settextxy(int x,int y, LPCTSTR str) //在坐标为(x,y)处输出文字str
void outtextxy( int x, int y, TCHAR c ) // 两种字符串类型
4.绘制矩形
API:
fillrectangle(int left, int top, int right, int bottom) //画填充矩形,从起点(left,top) 到终点(right,bottom)
5.绘制圆角矩形
API:
fillroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight) //画填充矩形,从起点(left,top) 到终点(right,bottom) ellipsewidth构成圆角矩形的圆角的椭圆的宽度。ellipseheight构成圆角矩形的圆角的椭圆的高度。若后两个相当相当于绘制一个圆形 不过不是以圆心的 是按照矩形的。
6.设置当前文字填充色
API:
settextcolor(COLOR color) //设置当前文字也就是下一行文字的颜色 宏定义RED,BLUE,YELLOW等
7.设置当前文字风格
API:
settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, bool bUnderline, bool bStrikeOut) //设置文字宽高 如果 width = 0就是自适应大小,LPCTSTR输出的文字后面可以省略掉
三、如何创建蛇和食物
蛇和食物有一个共同的特点就是都有坐标
所以
//创建坐标
struct Coor { // x y 坐标结构体int x;int y;
};
其次创建蛇和食物结构(其实可以见蛇和食物的对象都可以的)
//蛇
struct Snake { //蛇结构int n; //当前的节数Coor szb[SNAKELENGTH]; //蛇坐标 最大长度是500Ch ch; //蛇的方向
}snake; //结构体变量//食物
struct Food
{Coor fzb; //食物的坐标 只有一个int flag; //是否被吃的标志
}food;
当然,少不了方向 方向无非就是上下左右 可以使会用枚举类型定义
enum Ch
{up = 72,down = 80,left = 75,right = 77
};
四、编写思路(过程)
定义完这些结构体后 我们知道 这个蛇也就是snake.szb[0].x 和snake.szb[0].y就是蛇头
所以只需要移动蛇头就可以。
为什么?because 首先蛇是一节一节的也就是绘制的一个一个小矩形,并且这个矩形是根据上面定义的snake结构的坐标结构数组存放的x,y坐标来绘制的,当蛇移动的时候 只需要将坐标加一个步长就可以了。
这样就真的对了吗?每次移动就在那个放下加或者减?
其实不对,为什么?because 如果是蛇变了很多次方向就像这样
应该使用怎么样的思路来进行所有蛇节方向改变呢?
可以让蛇的最后一节n的x,y坐标每次绘制的时候等于蛇的n-1的坐标 这样不就可以改变方向并且按蛇头走的路原封不动的走一遍吗? 对吧
所以 移动蛇的时候应该有一个循环,根据蛇节数来遍历的
for (int i = snake.n - 1; i > 0; i--){snake.szb[i].x = snake.szb[i - 1].x;snake.szb[i].y = snake.szb[i - 1].y;}
创建蛇(这里一共创建了4个蛇节 初始化的时候就是四个蛇节):
snake.szb[3].x = 50; //当前节数的X坐标snake.szb[3].y = 0; //当前节数的Y坐标snake.szb[2].x = 40;snake.szb[2].y = 0;snake.szb[1].x = 30;snake.szb[1].y = 0;snake.szb[0].x = 20;snake.szb[0].y = 0;
那么蛇的如何判断方向呢(你需要引入头文件 <conio.h>)?
//*****这是判断按键 来改变方向int move = _getch();switch (move){case up: //不能向下走if(snake.ch!=down)snake.ch = up;break;case down:if (snake.ch != up)snake.ch = down;break;case right:if (snake.ch != left)snake.ch = right;break;case left:if (snake.ch != right)snake.ch = left;break;}
//***********/
//********根据方向变化来移动蛇头//先将后一节的坐标等于前一节的坐标for (int i = snake.n - 1; i > 0; i--){snake.szb[i].x = snake.szb[i - 1].x;snake.szb[i].y = snake.szb[i - 1].y;}switch (snake.ch){case up:snake.szb[0].y -= NUM;break;case down:snake.szb[0].y += NUM;break;case right:snake.szb[0].x += NUM;break;case left:snake.szb[0].x -= NUM;break;}
//********/
这里的_getch 用于获取按键ASCII 比如 _getch 获取键盘按键 _kbhit() 检测是否按下某个键无则返回0;
接下来就是每次移动绘制蛇:
//绘制蛇 (根据存储的蛇节n)来
for (int i =0; i < snake.n ; i++){if (i == 0){setfillcolor(YELLOW); //填充颜色}else {setfillcolor(RED); //填充颜色}fillrectangle(snake.szb[i].x, snake.szb[i].y, snake.szb[i].x + size, snake.szb[i].y + size);}
接下来应该是食物了
食物是随机变化的 并且必须是蛇头吃掉食物才能再次随机生成一个食物。
所以开始的时候应该封装一个函数进行初始化食物
food.fzb.x = (rand() % WINDOW_WIDTH / 10) * 10; // 0 1 2 3 4 .. 639food.fzb.y = (rand() % WINDOW_HEIGHT / 10) * 10; // 0 1 2 3 ... 479;//蛇的坐标是10 20 30 40 有规律的 10的倍数food.flag = 1; //没有吃掉 1 随机出现
为什么要 *10?因为设置的窗口是640 * 480 食物的坐标必须和蛇节大到小和每次的步长一致,这样当蛇头与食物重合就可以判断吃掉了食物
//绘制食物
void DrawFood()
{setfillcolor(GREEN);//绘制圆形食物fillroundrect(food.fzb.x, food.fzb.y, food.fzb.x + 10, food.fzb.y + 10,10,10);
}
有了上面说的碰撞的思路
部分代码:
if (snake.szb[0].x < 0 || snake.szb[0].x >= WINDOW_WIDTH || snake.szb[0].y >= WINDOW_HEIGHT || snake.szb[0].y < 0){return true;}
。下面是main
//初始化随机种子srand((unsigned int)time(NULL));//初始化后会有一个像素矩阵,可以使用坐标系去表示它InitSnake();/*改变方向.按键之后按键之前程序在继续移动和绘图*/char buffer[100];while (1){while (!_kbhit()) //检测是否按下某个键 没有按下就返回0{if (food.flag==0){CoorFood();}cleardevice(); //清除重绘if (isCrash()) //如果碰撞了{NUM = 0; //表示撞墙 每次移动的步伐10 变成0 不走了}if (NUM != 0) //{rectangle(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);settextstyle(30, 0, TEXT("微软雅黑"));outtextxy(WINDOW_WIDTH + ((WINDOW_WIDTH + 200) - WINDOW_WIDTH) / 2 - 30, 50, TEXT("贪吃蛇"));settextstyle(25, 0, TEXT("微软雅黑"));settextcolor(YELLOW);outtextxy(WINDOW_WIDTH + ((WINDOW_WIDTH + 200) - WINDOW_WIDTH) / 2 - 60, 80, TEXT("分数:"));settextstyle(60, 0, TEXT("微软雅黑"));settextcolor(WHITE);_itoa_s(FenShu, buffer, _countof(buffer), 10);outtextxy(WINDOW_WIDTH + ((WINDOW_WIDTH + 200) - WINDOW_WIDTH) / 2 - 60, 120, LPCTSTR(buffer));MoveSnake();DrawFood();DrawSnake(10);EatFood();Sleep(100);}else {break;}}if (NUM == 0){break;}ChangeSnakeCh(); //按下后执行方向改变函数}settextstyle(65, 0, TEXT("仿宋"));outtextxy((WINDOW_WIDTH + 200) / 2 - 120, WINDOW_HEIGHT / 2 - 50, TEXT("你挂了!"));settextstyle(33, 0, TEXT("仿宋"));settextcolor(YELLOW);outtextxy((WINDOW_WIDTH + 200) / 2 - 120, WINDOW_HEIGHT / 2 + 20, TEXT("分数:"));outtextxy((WINDOW_WIDTH + 200) / 2 , WINDOW_HEIGHT / 2 + 20, LPCTSTR(buffer));
我的贪吃蛇的源代码已经在github上面
github地址:https://github.com/IAmWilling/SnakeGame
源码里面有详细的注释,可以对照代码根据这篇总结,来读。
C++ 开发贪吃蛇游戏总结相关推荐
- java从零开发贪吃蛇游戏全流程
java从零开始开发贪吃蛇 1.游戏介绍 贪吃蛇是一款经典的益智类小游戏,是最初的翻盖机里面最常见的小游戏之一,学过编程的你有没有想过自己尝试着制作一款自己的贪吃蛇呢. 接下来我将从零开始带着大家做一 ...
- 贪吃蛇javascript代码_源于Jquery开发贪吃蛇游戏——简单思路分析总结
前言 刚开始是学习前端那会,在熟悉 HTML+CSS+JS 后,我开始尝试去做贪吃蛇游戏.没想到在一顿瞎搞后还真搞出来了一个简陋版的贪吃蛇.哈哈!因为这是我刚开始学习前端的时候做的,所以代码有点简陋, ...
- java+手柄开发_手把手教你用java轻轻松松开发贪吃蛇游戏
贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过程. 让我 ...
- 结对-贪吃蛇游戏-开发环境搭建过程
结对编程成员:赵建辉,马壮 搭建环境: 会 html,css,以及java开发知识. 会应用sublime,dw等编辑软件 编写程序阶段: 1.利用html搭建前端页面,构建游戏的页面框架 2.利用j ...
- 实验二、贪吃蛇游戏开发
实验要求 实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右控制"蛇"的移动,吃到"豆子"以后"蛇" ...
- 实验项目二:贪吃蛇游戏开发
贪吃蛇游戏开发 一.前言 二.基本流程 三.游戏界面设计 1. 界面构造 2. 蛇的构造 3. 食物构造 四.游戏过程 1. 蛇的移动 2. 蛇吃食物与碰撞检测 五.游戏结束 1. 结束界面 六.扩展 ...
- 源代码,基于Stm32f030单片机开发日历显示,内部包括,按键检测、蓝牙通讯、温度传感器读取以及贪吃蛇游戏
源代码,基于Stm32f030单片机开发日历显示,内部包括,按键检测.蓝牙通讯.温度传感器读取以及贪吃蛇游戏. OLED 屏幕的i2c驱动代码. 非常是初学者用于参考学习. :862564016125 ...
- Java开发贪吃蛇小游戏
Java开发贪吃蛇小游戏 文章目录 Java开发贪吃蛇小游戏 一.开发思路 二.具体开发过程 1.绘制静态游戏窗口 2.导入素材图标 3.绘制游戏面板 4.绘制一条静态的小蛇 5.让小蛇动起来 ①监听 ...
- 开发Windows贪吃蛇游戏——(二)代码实现
目录 前言 窗体部分 Frame部分 声明全局变量 Panel的初始化 startGame方法 paintComponent方法 drawGame方法 newSnake方法 newFood方法 mov ...
最新文章
- Windows10系统变慢,程序员该出手了,电脑性能大幅度提升!
- 为什么要选择Apache Pulsar(一)
- ios请求php接口失败,laravel,php_iOS调用Laravel接口返回错误信息,laravel,php,ios - phpStudy...
- buuctf 二维码
- [转]showModalDialog()、showModelessDialog()方法使用详解
- ComponentBase.createMetaData and manifest.json oRoute
- Java 中的几种线程池,你之前用对了吗,互联网 面试官 如何面试
- oracle的sql的substr用法,oracle中substr函数的用法(sqlserver right)
- linux数据,Linux数据
- SAS之COMPBL、DEQUOTE函数
- Python 参数解析(getopt模块)
- labview 控件安装步骤
- 信息安全技术标准合集
- LA4487 加权并查集
- query.recordcount 总是为-1 解决方法
- 磁盘的扩展卷和压缩卷显示灰色,无法使用
- pcie gen3 bios设置_唯一还在认真做BIOS的大陆板卡厂商!七彩虹iGame Z490 Vulcan X V20评测...
- 终于明白MSN “I'm” 图标啥意思了
- allegro 走线切换层_高速信号走线的九大规则
- python——annotate函数
热门文章
- 支付结算系统如何应对高并发、热点账户等问题
- 你所不知道的VR全景拍摄地拍步骤和细节
- cf四大服务器位置,CF:从最初的42个服务器到现在的四大战区,穿越火线还能火多久?...
- 总结一些常见的国际标准化组织
- linux常用免杀,【kali linux】详细分析两个免杀远控 了解远控和免杀原理
- MTK平台创建Vendor方法-v1.4
- wxpython 控件,对话框,光标,菜单
- JAVA 日期加减计算
- (转)编程的三层境界——器、术、道
- ajax,HTTP原理 : 网络传输协议,网页从输入url到渲染的流程,函数防抖和节流