热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

游戏编程笔记起步(三)贪吃蛇游戏实现

游戏编程笔记-起步3.贪吃蛇游戏实现代码下载:http:download.csdn.netdetailyou_lan_hai3738025核心代码实现如下࿰

游戏编程笔记-起步


3.贪吃蛇游戏实现





代码下载:http://download.csdn.net/detail/you_lan_hai/3738025

核心代码实现如下,算法描述见 “起步(一)”:

#include "app.h"
#include
#include int g_map[100][100];//2维地图int g_nWidth = 610; //窗口宽度
int g_nHeight = 514;//窗口高度int g_rows = 0; //地图行数
int g_cols = 0; //地图列数
int g_nSize = 30; //地图方格尺寸struct Point//二维点
{int r;//行int c;//列
};Point g_snake[1000]; //蛇
int g_nLength = 0; //蛇的长度
int g_nSpeed;
bool g_bLive = true; //是否存活
int g_nSnakeDir = 0; //蛇的当前移动方向。0-左,1-右,2-上,3-下const Point g_direction[4] = {{0,-1},{0,1},{-1,0},{1,0}};//四个方向运动增量。Point g_prizePos; //奖子坐标bool g_bPause = true; //是否暂停HBRUSH g_brushs[4]; //背景画刷void setSnakeDir(int dir)//设置蛇的运动方向。
{if ((dir==0 && g_nSnakeDir==1)|| (dir==1 && g_nSnakeDir==0)|| (dir==2 && g_nSnakeDir==3)|| (dir==3 && g_nSnakeDir==2))//反方向移动则令他暂停{g_bPause = true;return;//直接返回,什么也不做。}else{g_bPause = false;g_nSnakeDir = dir;}
}void resetLevel()//重置关卡
{/*初始化地图。将四边初始为障碍,即不可通过。* 0-可通过,1-障碍,2-奖子,3-蛇*/memset(g_map,0,sizeof(g_map));for (int r=0; r}void init()//游戏初始化
{g_brushs[0] = CreateSolidBrush(RGB(255,255,255));//白色画刷g_brushs[1] = CreateSolidBrush(RGB(0,0,255));//绘制障碍画刷g_brushs[2] = CreateSolidBrush(RGB(255,0,0));//绘制奖子画刷g_brushs[3] = CreateSolidBrush(RGB(0,255,0));//绘制蛇画刷srand(GetTickCount());//矫正窗口高度、宽度数据RECT rc;GetClientRect(getHWnd(),&rc);g_nWidth = rc.right - rc.left;g_nHeight = rc.bottom - rc.top;//计算行列值g_rows = g_nHeight / g_nSize;g_cols = g_nWidth / g_nSize;resetLevel();
}void update()//逻辑更新
{//时钟控制static int oldTime = 0;int curTime = GetTickCount();if (curTime - oldTime 10000)//每隔10s更新一次位置。{//lastOcurTime不为-1表示,没有被吃掉,则将原来位置的奖子从地图擦掉。if (lastOcurTime != -1){g_map[g_prizePos.r][g_prizePos.c] = 0;}lastOcurTime = curTime;//随机产生奖子位置。bool flag = true;while(flag){g_prizePos.r = rand()%(g_rows-2)+1;g_prizePos.c = rand()%(g_cols-2)+1;if (g_map[g_prizePos.r][g_prizePos.c] == 0)//符合条件{flag = false;g_map[g_prizePos.r][g_prizePos.c] = 2;}}}if (!g_bLive || g_bPause)//死亡或暂停{return ;}//先判断是否可走,即是否撞死。Point newHead;newHead.r = g_snake[0].r + g_direction[g_nSnakeDir].r;newHead.c = g_snake[0].c + g_direction[g_nSnakeDir].c;if (g_map[newHead.r][newHead.c]==1 || g_map[newHead.r][newHead.c]==3){g_bLive = false;if(IDYES == MessageBox(getHWnd(),L"你撞死啦!是否重新来过?",L"撞死提示",MB_YESNO)){resetLevel();}else{PostQuitMessage(0);}return ;}else if (g_map[newHead.r][newHead.c] == 2)//遇到奖子{++g_nLength ;lastOcurTime = -1;g_nSpeed -= 10;}else{//撤销尾部在地图上遗留数据g_map[g_snake[g_nLength-1].r][g_snake[g_nLength-1].c] = 0;}memmove(g_snake+1,g_snake,sizeof(Point)*(g_nLength-1));//移动蛇的中间数据g_snake[0].r = newHead.r;g_snake[0].c = newHead.c;//添加蛇头数据g_map[g_snake[0].r][g_snake[0].c] = 3;//
}void render()//画面渲染
{HDC hDC = GetDC(getHWnd()); //获得系统绘图设备HDC memDC = CreateCompatibleDC(0); //创建辅助绘图设备HBITMAP bmpBack = CreateCompatibleBitmap(hDC,g_nWidth,g_nHeight);//创建掩码位图(画布)SelectObject(memDC,bmpBack); //将画布贴到绘图设备上HPEN penBack = CreatePen(PS_SOLID,1,RGB(255,0,255));//创建画笔SelectObject(memDC,penBack); //将画笔选到绘图设备上//擦除背景RECT rcClient;//区域结构GetClientRect(getHWnd(),&rcClient);//获得客户区域HBRUSH brushTemp = (HBRUSH)GetStockObject(WHITE_BRUSH);//获得库存物体,白色画刷。FillRect(memDC,&rcClient,brushTemp);//填充客户区域。////绘制2维网格,矩形画法。for (int r=0; r}void clear()//资源释放
{//释放画刷资源for (int i&#61;0; i<4; &#43;&#43;i){if(g_brushs !&#61; NULL){DeleteObject(g_brushs[i]);g_brushs[i] &#61; NULL;}}
}/*窗口过程。如果没有处理消息请返回0&#xff0c;否则返回1。*/
LRESULT wndProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam )
{switch(uMsg){case WM_KEYDOWN:{switch(wParam){case VK_LEFT: setSnakeDir(0); break; //向左case VK_RIGHT: setSnakeDir(1); break; //向右case VK_UP : setSnakeDir(2); break; //向上case VK_DOWN: setSnakeDir(3); break; //向下case VK_ESCAPE: DestroyWindow(hwnd);break;}}break;default:return 0;}return 1;
}//主函数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE , LPSTR , int )
{if(!initApp(hInstance,L"贪吃蛇游戏",g_nWidth,g_nHeight)){return 0;}//初始化游戏init();//游戏循环mainLoop();//释放资源clear();return 0;
}



转:https://www.cnblogs.com/ygxsk/p/7694015.html



推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
author-avatar
欢乐的小码农
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有