c++课程设计贪吃蛇1_第1页
c++课程设计贪吃蛇1_第2页
c++课程设计贪吃蛇1_第3页
c++课程设计贪吃蛇1_第4页
c++课程设计贪吃蛇1_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+课程设计:贪吃蛇1C+课程设计:贪吃蛇1课程设计报告课程名称:面向对象程序设计 C+设计题目:贪吃蛇专业:计算机科学与技术姓名:学号:指导教师:李晓虹2015年1月10日1需求分析1.1系统需求 操作系统:由于贪吃蛇游戏运行在 windows操作系统上,所以要求计算 机硬件至少能够运行 windows XP及以上的版本的 windows 操作系统。软件需求:贪吃蛇游戏使用控制台以字符的方式来显示画面,控制已经 集成于操作系统中,无需额外的软件支持。硬件需求:贪吃蛇游戏需要键盘作为控制命令的输入,需要显示器作为 结果输生,因此需要计算机至少具备一个包含光标键的键 盘,一个显示分辨率在 800

2、*600以上的显示器。1.2功能需求 根据游戏的一般玩法,游戏应该有如图1-1 所示的功能:图1-1界面绘制:包括显示游戏初始界面,显示游戏结束画面,显示游戏运行 画面三个主要绘制的界面,其中以游戏运行画面显示得最为 频繁。按键响应:应该响应两个部分的按键。一是接受用户的按键操作来控制蛇的运动方向,包括上下左右四个光标键。二是游戏控制按键,包括 ESC退由游戏,SPACE开始游 戏。吃食判定:是对随机在游戏区域内产生的食物与蛇头重合否的判断。如果蛇头位置与食物位置重合,则判断蛇吃到食物,其身 体增长一格,继而食物消失并产生新的食物,如果没有吃掉 当前已经存在的食物将不会有新的食物产生。死亡判定

3、:即游戏失败判定。按照一般规则,当蛇头碰到游戏区域的边界或是自身身体那么就判定游戏失败,整个游戏将结束。2总体设计2.1逻辑设计 控制台设置:由于客户机在默认情况下的设置是不符合程序的一些假设的,所以需要进行一些必要的设置。为使界面显示正常,应该将控制台的编码页更换为437 ,这样才能使用ASCII码的扩展字符。同时应该设置显示的字符字号,减小字号有利于显示效果。在屏幕的频繁刷新中控制台显示会由现闪烁的情况,应该使用缓冲,一次性输生以避免闪烁的由现。游戏界面:由于使用控制台输由界面,则界面必然只能使用字符来模拟位图的显示。游戏的初始界面与结束界面均使用字符拼成,游戏运行时的画面则通过使用扩展

4、ASCII码表中的扩展字符来实现。蛇体结构:使用一个自定义的结构体,具包含X,Y两个坐标位置,两个这个结构体的指针,分别指向前一节点与后一节点。通过链表来实现蛇体的存储。并在全局变量中存储蛇体的开始与结尾。绘制时依次遍历并按坐标绘制即可。2.2系统流程 游戏的流程如图 2-1所示,有以下几个步 骤。初始化:将全局变量初始化,初始化蛇体链表,初始化控制台。等待开始:进入循环,等待用户按下开始键,如果用户没有按下开始建, 那么就绘制游戏初始界面,提示用户需按下开始键才能游戏。如果用户按下了开始键,就绘制游戏区域边界并跳由当前 的循环。游戏循环:等待用户按下方向控制键,如果用户并没有按下方向控制键,

5、那么当前的蛇体按照预设的方向前进一格。否者就按照用户按下的方向前进,同时将全局变量中的方 向指示变量的值由原来的值更改为用户选定的方向的值;接 着判断蛇头的坐标是否与边界或者是自己的身体坐标重合, 如果重合则说明游戏失败,将跳由当前循环。如果没有重合则接着判断是否与食物坐标重合,如果重合 代表吃到食物,计分加一,蛇长加一,否则为没有吃到食物, 不进行任何操作。接着就应该将蛇画在界面上,然后进行下一次游戏循环。游戏结束:如果上面死亡判定通过将会进入这一个步骤,先绘制游戏结束画面,然后显示游戏得分。游戏变结束了。图2-1除了正常的游戏结束外, 还能够通过按下 ESC键 退由游戏,流程如图 2-2所

6、示。游戏退由:在游戏循环中如果用户按下了ESC键,那么游戏将直接从游戏中退生,不会显示游戏结束画面也不会显示得分。游戏重置:用户以除按 ESC退由游戏的方式外的正常结束将经过重置 后重新进入等待开始步骤。图2-2 3详细设计3.1类设计 整个游戏有三个主要的类与几个全局变量分别如图3-1,图3-2所示。Control 类:主要实现初始化控制台设置,构建缓冲,按键监听,死亡检测,吃食检测,生成食物,输由缓冲到屏幕,获取控制状态, 清空屏幕,重置等等功能。UI类:主要实现界面的绘制,包括游戏初始界面,游戏结束界面和边界的绘制使用DrawStart ()、DrawEnd ()、DrawBorder(

7、)三个函数实现。这里的绘制并不是直接向屏幕绘制,而是向缓冲绘制。Snake 类:主要实现蛇的运动,自身的初始化,重置的功能。图3-1全局变量文件:如图3-2所示,它有定义的一个文件包含标志_GLO_,因为每个类文件都有一些变量在全局文件中被定义,但是多重引用会导致重定义,使用包含标志符可以确保文件只会被引用 一次,从而避免重定义的冲突由现。SetConsolFont是一个未在源文件中公开的 Win API函数, 使用它之前需要提前定义,之后再在使用的时候直接从系统 dll中获取入口点。四个方向的定义,分别是上下左右四个键值,用于响应 用户按下键盘上的光标键后的赋值与比较。Buffer是一个屏幕

8、缓冲指针,它将指向一个和游戏显示区 域大小一致的内存区域,所有对屏幕的写操作将先写入这个 缓冲然后再一次性输生到屏幕。Width和height指明屏幕大小,用来初始化buffer的大小, 绘制图像时也需要通过这些数据由屏幕上的二维坐标转换 到buffer中的一维线性位置。Length是蛇长度,依据长度可决定绘制蛇的时候循环的 次数。Direction是方向变量,存储用户当前按下的方向键的键 值。Getfood是获得的分数,也可称作吃到食物的次数,最终 得分是该数与一百的乘积。waitEat是游戏区域内已有食物总数,只是0或者1. Head、tail。Seq分别是指向蛇的头、尾和遍历变量的指针G

9、ameStart口、GameOver分别是指向开始与结束画面字符的指针数组。图3-2 3.2关键代码实现 Control类在初始化中对控制台 的设置:buffer = new charwidth*height; memset(buffer, , width*height*sizeof(char); /开辟内存地址存放缓冲,并将缓 冲内容全部置为空格 HMODULE hKernel32 = GetModuleHandle(L “kernel32 ");SetConsoleFont = (PROCSETCONSOLEFONT)GetProcAddress(hKernel32,“ SetC

10、onsoleFont 从)kernel 句柄处获得 SetConsolFont 函数 的入口地址 SetConsoleOutputCP(437); 设置控制台文字页 为 437 std二ostringstream sst; std:string str =" “ ; sst y*width +head->x=char(186) return true; 碰到左右边界,将死亡 else if(bufferhead->y*width + head->x=char(187)return true; / 碰到右上角边界, 将死亡 else if(bufferhead->

11、;y*width + head->x=char(188)return true; / 碰到右下角边界,将死 亡else if (bufferhead->y*width +head->x=char(200)return true;/ 碰到左下角边界,将死亡 else if (bufferhead->y*width + head->x=char(201)return true; / 碰到左上角边界,将死亡 else if (bufferhead->y*width + head->x=char(205)return true; / 碰到上下边界,将死亡 el

12、se if (bufferhead->y*width + head->x=char(254)returntrue; 碰到I蛇身体,将死亡 else return false; /说明遇到的是空格字符,是安全的。按键检测,由于蛇在向一个方向运动的时候是不能够再 向反方向运动的,所以必须有一定的处理:if (GetAsyncKeyState(VK_DOWN) / 按下了 工 且上一次按 下的不是T,那么就更改方向值为当前值 if (GetAsyncKeyState(VK_UP) / 按下了 T,且上一次按下的不 是那么就更改方向值为当前值 if (GetAsyncKeyState(VK

13、_LEFT) 按下了 一,且上一次按下 的不是,那么就更改方向值为当前值 if (GetAsyncKeyState(VK_RIGHT) / 按下了 f,且上一次按下 的不是一,那么就更改方向值为当前值Main函数中,在游戏结束的时候需要显示玩家的得分,这里使用对话框的形式 给由。由于使用MessageBox函数显示分数需要显示由int转换成 字符的分数,所以使用了CString类,这里需要 #include“afxwin.h。 “char sc4; / 转换的分数存放数组 _itoa_s(getFood, sc, 10); 将 int 转换为 char口 CString ff(sc); / 由

14、 char转换为 CString , 方便后面作字符拼接 MessageBox(NULL,ds+ff+so,L "游戏结 束! ",MB_OK); 显示拼接的分数字符结果 4系统调试 在 调试的时候编译阶段就由现了错误, 错误提示如图4-1所示。其原因是使用 CString类所导入的afxwin.h文件引起的。它要求必须有_AFXDLL的定义或者是运行在 MD模式下, 这里在项目设置中更改调试模式为MD即可。图4-1在没有对蛇头与蛇身体作检测的时候会由现问题,如图4-2所示,蛇能够穿过自己的身体,这与游戏规则 是不相符的。所以需要对蛇头与蛇身的重合作检测。同样的在蛇与游戏区

15、域边界没有作检测的时候,如图4-3所示,蛇的字符将会覆盖边界的字符,随着蛇离开后将会被 变成空格符,所以也许要对蛇和边界作重合检测,如果重合 后则直接判定为死亡,接着就退由游戏。图4-2图4-3 5结果分析经调试后的运行结果如图5-1、图5-2、图5-3所示。游戏开始画面如图5-1所示:图5-1游戏画面如图5-2所示:图5-2游戏结束画面如图 5-3所示 图5-3 6总结 经过几 日的开发与调试,贪吃蛇游戏最终开发完成了,这次个游戏 实现了在控制台上接受用户按键操纵蛇在游戏区域内移动, 触碰到自己或是边界的时候结束游戏,吃到食物则增加蛇的 长度和得分,直到游戏结束就显示得分。虽然成功的实现了游

16、戏的基本功能,但是由于时间的缘 故,没有实现游戏相关参数的自定义设置,比如自定义窗口 的宽与高,设定初始蛇的长度,设定最大同时由现食物的长 度等等,还没有实现得分排行榜,游戏闯关模式,穿墙功能 等等特殊的游戏特性。即使有遗憾,但是通过亲手写代码,查资料,对 C+的 使用与 Windows API的理解有了进一步的加深,收获颇丰。附件程序源码:全局变量:#include “windows.h #define _GLO_ ; #define Left 0;#define Right 1; #define Up 2; #define Down 3; typedef BOOL(WINAPI *PROC

17、SETCONSOLEFONT)(HANDLE, DWORD); PROCSETCONSOLEFONT SetConsoleFont; static char * buffer; int width; int height; int length; int direction; int getFood; int waitEat; struct SnakeSection int x; int y; SnakeSection* pre; SnakeSection* next; ; SnakeSection * head; SnakeSection * tail; SnakeSection * seq

18、; char * GameOver =" “ “ “ # HH# # GS9 XBSXGX3SA“ MX3GiriirssssssssrS “ BHB1 .:;SAh,:.G #HBX,:,5BHBB. 3HXMHr93X#MBB#BMSS9#B:. iSS1 XS .rHB88S#B:.3A:;:G9 . ;8h99S . 3#B111. 89 . ,8X39995SXs . i#B: . rhhi :hhs. 3B93X#B.8#HX519HS5AMM898BA8GG8G8888G GGG88HH88888G#A88888X#MG88888B #MG8GG88BA8GGGGGGGGG888888888G AH95iiG#,“ A51GM# # #M# #X9XGr1ssrii;rsssssssssr A8irrir1sssssssss11sG“ #M#BBBi:i1115;,GBBM3 ,M#M9H5;#B,.,:,.SMMMM#M:.89.:#MHH85.3#MB#M:. 89 . ;MA8H#5. i#B:.GBX83X

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论