课程设计贪吃蛇

上传人:hs****ma 文档编号:498755773 上传时间:2023-03-30 格式:DOC 页数:27 大小:686.51KB
返回 下载 相关 举报
课程设计贪吃蛇_第1页
第1页 / 共27页
课程设计贪吃蛇_第2页
第2页 / 共27页
课程设计贪吃蛇_第3页
第3页 / 共27页
课程设计贪吃蛇_第4页
第4页 / 共27页
课程设计贪吃蛇_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《课程设计贪吃蛇》由会员分享,可在线阅读,更多相关《课程设计贪吃蛇(27页珍藏版)》请在金锄头文库上搜索。

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

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

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

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

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

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

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

8、冲然后再一次性输出到屏幕。Width和height指明屏幕大小,用来初始化buffer的大小,绘制图像时也需要通过这些数据由屏幕上的二维坐标转换到buffer中的一维线性位置。Length是蛇长度,依据长度可决定绘制蛇的时候循环的次数。Direction是方向变量,存储用户当前按下的方向键的键值。Getfood是获得的分数,也可称作吃到食物的次数,最终得分是该数与一百的乘积。waitEat是游戏区域内已有食物总数,只是0或者1.Head、tail。Seq分别是指向蛇的头、尾和遍历变量的指针。GameStart、GameOver分别是指向开始与结束画面字符的指针数组。图 3-23.2关键代码实现

9、Control类在初始化中对控制台的设置:buffer = new charwidth*height;memset(buffer, , width*height*sizeof(char);/开辟内存地址存放缓冲,并将缓冲内容全部置为空格HMODULE hKernel32 = GetModuleHandle(Lkernel32);SetConsoleFont = (PROCSETCONSOLEFONT)GetProcAddress(hKernel32, SetConsoleFont);/从kernel句柄处获得SetConsolFont函数的入口地址SetConsoleOutputCP(437)

10、;/设置控制台文字页为437std:ostringstream sst;std:string str = ;sst mode con cols= width lines= y*width + head-x=char(186) return true;/碰到左右边界,将死亡else if(bufferhead-y*width + head-x=char(187)return true;/碰到右上角边界,将死亡else if(bufferhead-y*width + head-x=char(188)return true;/碰到右下角边界,将死亡else if (bufferhead-y*widt

11、h + 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;/碰到上下边界,将死亡else if (bufferhead-y*width + head-x=char(254)return true;/碰到蛇身体,将死亡else return false;/说明遇到的是空格字符,是安全的。按键检测,由于蛇在向一个方向

12、运动的时候是不能够再向反方向运动的,所以必须有一定的处理:if (GetAsyncKeyState(VK_DOWN) & 0X8000)if (direction != 2)direction = Down;/按下了,且上一次按下的不是,那么就更改方向值为当前值if (GetAsyncKeyState(VK_UP) & 0X8000)if (direction != 3)direction = Up;/按下了,且上一次按下的不是,那么就更改方向值为当前值if (GetAsyncKeyState(VK_LEFT) & 0X8000)if (direction != 1)direction = L

13、eft;/按下了,且上一次按下的不是,那么就更改方向值为当前值if (GetAsyncKeyState(VK_RIGHT) & 0X8000)if (direction != 0)direction = Right;/按下了,且上一次按下的不是,那么就更改方向值为当前值Main函数中,在游戏结束的时候需要显示玩家的得分,这里使用对话框的形式给出。由于使用MessageBox函数显示分数需要显示由int转换成字符的分数,所以使用了CString类,这里需要#include afxwin.h。 char sc4;/转换的分数存放数组_itoa_s(getFood, sc, 10);/将int转换为charCString ff(sc);/由char转换为CString,方便后面作字符拼接MessageBox(NULL,ds+ff+so,L游戏结束!, MB_OK);/显示拼接的分

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号