C++课程设计贪吃蛇游戏设计.docx
《C++课程设计贪吃蛇游戏设计.docx》由会员分享,可在线阅读,更多相关《C++课程设计贪吃蛇游戏设计.docx(49页珍藏版)》请在沃文网上搜索。
1、目录C+程序课程设计1第一章课题介绍31.1选题背景31.2关于编译软件41.3关于兼容性4第二章设计概要42.1程序功能简介42.2程序流程5第三章游戏实现53.1创建工程63.2游戏界面控制73.2.1墙、框体的绘制73.2.2蛇身的绘制83.2.3食物的绘制93.3游戏控制113.3.1蛇的移动113.3.2蛇死亡的判断133.3.3消息窗口的弹出133.3.3.1开始消息框143.3.3.2关卡消息框143.3.3.3结束消息框153.3.4游戏音效16第四章 结果与讨论174.1程序运行174.2对源程序的改进184.3错误调试与分析184.3.1关于窗口的重画问题184.3.2关于
2、双音轨的问题184.3.3程序的稳定性194.4课程设计心得与体会19附录21第一章 课题介绍1.1选题背景蛇-传说中的圣灵之物,仰头为神、俯首为魔。蛇是月亮国膜拜的神,月亮国的子民们都认为蛇是万能的主宰派来保护他们的守护者。蛇在这个岛屿就像空气一样自然的出现在各个角落,有些还成为居民的宠物, 陪伴孩子长大, 和年轻人一起去探险,守护着散步的老人。在善良的女娟神保佑下,人们的生活安宁平静。为了答谢女娟的庇佑,每年月亮国的国民都会举办一个守护蛇大赛,大家都会拿出自己最强、最炫、最快、最稀有的蛇来参加比赛, 获得第一名的人将得到国王的特别嘉奖。所以国民一生都在不断的培养更有威力、更长、更壮的蛇。
3、贪吃蛇 是一个产生于1970 年代中后期的计算机游戏,也叫蛇吃豆。该游戏在1990 年代由于一些手机将其引入而一时间再度流行起来。在游戏中,玩家操控一条细长的蛇爬行于一个带边界的平面之上,一路拾起触碰到之事物或其它类似的物件, 并要避免触碰到自身或者包围着游戏区的墙。每次贪吃蛇吃掉一件食物, 它的身体便增长一些,这让游戏的难度渐渐变大。操控贪吃蛇时,玩家操控贪吃蛇的头部的朝向(向上、向下、向左或向右)控制贪吃蛇的进行方向,贪吃蛇的身体将跟随着其头部行进。另外, 玩家不可在游戏中途停止贪吃蛇的进行。随着贪吃蛇的成功移植到手机系统,贪吃蛇的操作按键要求与手机按键的完美匹配,使贪吃蛇游戏风靡起来。贪
4、吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。我希望通过自己的所学知识把它剖析开来,真正的了解它的本质和精髓。虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。1.2关于编译软件本程序采用Microsoft Visual C+6.0的中文版本进行编译。Visual C+6.0是Microsoft公司推出的基于Windows操作系统的可视化C+编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但
5、由于其良好的界面和可操作性,加上支持标准C/C+规范,但仍有相当多的编程人员使用Visual C+6.0进行应用系统的开发。1.3关于兼容性本程序经过调试,可以在XP系统下编译运行,也可以在Vista/Win 7下运行,界面稍有不同,但不影响运行结果。第二章 设计概要2.1程序功能简介据分析,贪吃蛇游戏一共要实现如下几个功能: 开始运行 蛇在上下左右键的操作下运动 闯关设置 游戏音效 游戏说明2.2程序流程根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程(图1)。贪吃蛇的内容主要包括: 开始游戏,随机出现食物,控制蛇的运动,吃食物,关卡处的消息询问,游戏音效的播放,分数的输出,游戏帮助的输出等等。
6、开始游戏出现食物蛇向右运动控制蛇的运动方向否是否否是是是是蛇身增长退出游戏蛇死亡判断蛇头与食物坐标是否重合开始下一关消息响应判断蛇头和蛇身以及墙坐标是否重合判断分数是否达到下一关图1.流程图第三章 游戏实现3.1创建工程本程序使用Win32 Application工程,编辑在Windows窗口中打开的应用程序。由于之前没有接触过这类工程,所以我在短短几天内笼统的学习了一些相关的基本知识。在程序的编写过程中,遇到了很多问题,通过查阅资料和请教别人,解决了很多问题,但是仍然有遗留的未解决的问题,所以本程序虽然实现了大部分功能,但不是很完善,需要在将来的学习过程中逐渐改进。 图2.创建Win32 A
7、pplication工程Win32 Application工程与Win32 Console Application工程有很大的不同(图2)。其主函数是WinMain()函数。创建一个经典的”Hello,World!”工程,就会有已经写好的WinMain()函数。WinMain()函数是整个程序的入口,虽然区区几行。不需要改动什么,但确实最主要的函数。函数定义如下:int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)在创建好的工程中,还有注册窗口函数和窗口过程函
8、数。ATOM MyRegisterClass(HINSTANCE hInstance)注册窗口函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)窗口过程函数实现贪吃蛇游戏的算法就写在窗口过程函数中。3.2游戏界面控制贪吃蛇游戏的游戏界面包括墙的绘制、蛇身体的绘制、蛇移动范围的绘制、食物的绘制、分数框和注释的绘制等等。其中贪吃蛇的身体的绘制,是本程序中的核心算法。3.2.1墙、框体的绘制在win32 application工程中,有很多绘制图形的函数。这里最多使用到的是Rectang
9、le()函数绘制矩形。通过坐标控制矩形的两对角点来确定矩形的长、宽、高,通过在窗口中添加画笔和画刷,使用不同的线条颜色和样式,画出所需的图框。如下是墙的绘制:hpen=CreatePen(PS_SOLID,1,RGB(255,255,255);/创建无色的画笔hbru=CreateSolidBrush(RGB(255,255,255);/创建无色的画刷hpenold=(HPEN)SelectObject(hdc,hpen);hbruold=(HBRUSH)SelectObject(hdc,hbru);Rectangle(hdc,rt.left,rt.top,rt.right,rt.bottom
10、);/绘制背景SelectObject(hdc,hpenold);/恢复笔SelectObject(hdc,hbruold);/恢复画刷hpen=CreatePen(PS_SOLID,1,RGB(255,100,0);/创建一支砖红色的笔hpenold=(HPEN)SelectObject(hdc,hpen);/把砖红色的笔选进画板Rectangle(hdc,45,35,615,465);hbru=CreateSolidBrush(RGB(255,100,0);/创建一支砖红色的画刷hbruold=(HBRUSH)SelectObject(hdc,hbru);/把砖红色的画刷选进画板hbruo
11、ld=(HBRUSH)SelectObject(hdc,hbru);/把砖红色的画刷选进画板for(i=50;i=600;i+=10)/画围墙Rectangle(hdc,i,40,i+10,49);/上边Rectangle(hdc,i,451,i+10,460);/下边for(i=40;i0;i-)/蛇的每个环节往前移动snake.xi=snake.xi-1;snake.yi=snake.yi-1;当蛇头的坐标和食物的坐标重合,就表明蛇吃到食物了,此时蛇要增长,将原来的食物用无色的笔“擦除”,node+1。如下:if(snake.x0=food.x&snake.y0=food.y)/吃到食物后
12、hpen=CreatePen(PS_SOLID,1,RGB(255,255,255);/创建一支无色的笔hpenold=(HPEN)SelectObject(hdc,hpen);/把无色的笔选进画板Rectangle(hdc,food.x,food.y,food.x+10,food.y-10);/用无色的笔绘制食物以取消 /被吃掉的食物SelectObject(hdc,hpenold);/恢复有色笔在程序完成之后,我又添加了闯关模式的功能,其中每过一关,蛇的颜色就会改变,这是使用switch-case语句,每一关都改变绘制蛇的画笔和画刷来实现的。3.2.3食物的绘制确定用坐标绘制贪吃蛇蛇身以后
13、,贪吃蛇的食物如何达到随机出现,蛇吃完食物后再次出现的食物不与蛇身相重合,并且能够按照网格式与蛇头无偏差相接就是一个亟待解决的问题。随机出现应采用rand()函数来实现,使食物随机出现在蛇可以运动的范围内;使用语句“food.x=rand()%400+60;food.y=rand()%350+60;”,让食物的坐标产生在墙内来;而食物与蛇头无偏差相接则用if语句判断生成的坐标是否可用最小网格的间距整除处理。使随机出现的点能够整除最小网格,也就是使食物与蛇头无偏差相接。for(i=2;isnake.node;i+)food.x=rand()%400+60;food.y=rand()%350+60
14、;if(food.x!=snake.xi)break;在游戏运行的过程中,经常会出现新出现的食物与蛇身重叠的情况,让玩家看不清食物到底在哪。经过认真的考虑,解决这个问题的办法就是,每次随机出现食物坐标时,用循环语句判断要出现的食物坐标是否与蛇身某一节的坐标重合,若是重合,重新生成一组随机数,再次判断,直到不重合时在画面上显示新食物。代码如下:再由食物坐标(food.x,food.y)与蛇头坐标是否相同判断蛇是否“吃”到了食物,设置判断标签food.yes,如果吃到了,food.yes为0,则再出现下一个食物,反之,如果没吃到,则不出现食物直到标签为0为止。代码如下:srand(unsigned
15、)time(NULL);/随机数发生器food.yes=1;/食物标记:1表示需要出现新食物,0表示已存在食物if(food.yes=1)/需要出现新食物food.x=rand()%400+60;food.y=rand()%350+60;while(food.x%10!=0)/食物随机出现后必须让食物能在整格内,这样才能让蛇吃到food.x+;while(food.y%10!=0)food.y+;food.yes=0;/画面上有食物了hpen=CreatePen(PS_SOLID,1,RGB(255,255,255);/创建一只无色的笔hbru=CreateSolidBrush(RGB(0,0
16、,0);/创建一支黑色的画刷hpenold=(HPEN)SelectObject(hdc,hpen);/把无色的笔选进画板hbruold=(HBRUSH)SelectObject(hdc,hbru);/把黑色的画刷选进画板if(food.yes=0)/画面上有食物就显示Rectangle(hdc,food.x,food.y,food.x+10,food.y-10);3.3游戏控制3.3.1蛇的移动开始游戏后的重点是如何用键盘来控制蛇的移动并传递到时间控制器中去判断蛇是否死亡。首先说明键盘与蛇的响应,设置一个方向控制变量snake.direction,设置其值为1、2、3、4分别表示左、右、前、
17、后,在窗口控制过程的WM_KEYDOWN中实现键盘消息的传递,按下不同的键盘按键,snake.direction会相应的改变,再利用if语句对坐标进行相应改变即可。如下:case WM_KEYDOWN:key=int(wParam);/接受按键if(key=VK_UP&snake.direction!=4)/判断是否往相反的方向移动snake.direction=3;else if(key=VK_RIGHT&snake.direction!=2)snake.direction=1;else if(key=VK_LEFT&snake.direction!=1)snake.direction=2;
18、else if(key=VK_DOWN&snake.direction!=3)snake.direction=4;在这里,需要注意的是,蛇在转向的时候,不可能转到前进方向的反方向,即向右运动时,蛇不可能转到屏幕的左边前进,需要用if语句进行筛选判断处理。蛇的移动速度是用SetTimer()函数和KillTimer()函数打开和关闭计时器来控制的。其中,SetTimer()函数中的参数控制蛇的速度,例如刚开始时为“SetTimer(hWnd,1,500,NULL);”,表示每500毫秒蛇向前移动一格,此时的速度很慢,玩家可以很方便的控制其位置。为了增加游戏难度,我使用switch-case语句,
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 贪吃 游戏 设计
