c++课程设计贪吃蛇1文档格式.docx

上传人:b****5 文档编号:16265746 上传时间:2022-11-22 格式:DOCX 页数:7 大小:20.16KB
下载 相关 举报
c++课程设计贪吃蛇1文档格式.docx_第1页
第1页 / 共7页
c++课程设计贪吃蛇1文档格式.docx_第2页
第2页 / 共7页
c++课程设计贪吃蛇1文档格式.docx_第3页
第3页 / 共7页
c++课程设计贪吃蛇1文档格式.docx_第4页
第4页 / 共7页
c++课程设计贪吃蛇1文档格式.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

c++课程设计贪吃蛇1文档格式.docx

《c++课程设计贪吃蛇1文档格式.docx》由会员分享,可在线阅读,更多相关《c++课程设计贪吃蛇1文档格式.docx(7页珍藏版)》请在冰豆网上搜索。

c++课程设计贪吃蛇1文档格式.docx

吃食判定:

是对随机在游戏区域内产生的食物与蛇头重合否的判断。

如果蛇头位置与食物位置重合,则判断蛇吃到食物,其身体增长一格,继而食物消失并产生新的食物,如果没有吃掉当前已经存在的食物将不会有新的食物产生。

死亡判定:

即游戏失败判定。

按照一般规则,当蛇头碰到游戏区域的边界或是自身身体那么就判定游戏失败,整个游戏将结束。

2总体设计2.1逻辑设计控制台设置:

由于客户机在默认情况下的设置是不符合程序的一些假设的,所以需要进行一些必要的设置。

为使界面显示正常,应该将控制台的编码页更换为437,这样才能使用ASCII码的扩展字符。

同时应该设置显示的字符字号,减小字号有利于显示效果。

在屏幕的频繁刷新中控制台显示会出现闪烁的情况,应该使用缓冲,一次性输出以避免闪烁的出现。

游戏界面:

由于使用控制台输出界面,则界面必然只能使用字符来模拟位图的显示。

游戏的初始界面与结束界面均使用字符拼成,游戏运行时的画面则通过使用扩展ASCII码表中的扩展字符来实现。

蛇体结构:

使用一个自定义的结构体,其包含X,Y两个坐标位置,两个这个结构体的指针,分别指向前一节点与后一节点。

通过链表来实现蛇体的存储。

并在全局变量中存储蛇体的开始与结尾。

绘制时依次遍历并按坐标绘制即可。

2.2系统流程游戏的流程如图2-1所示,有以下几个步骤。

初始化:

将全局变量初始化,初始化蛇体链表,初始化控制台。

等待开始:

进入循环,等待用户按下开始键,如果用户没有按下开始建,那么就绘制游戏初始界面,提示用户需按下开始键才能游戏。

如果用户按下了开始键,就绘制游戏区域边界并跳出当前的循环。

游戏循环:

等待用户按下方向控制键,如果用户并没有按下方向控制键,那么当前的蛇体按照预设的方向前进一格。

否者就按照用户按下的方向前进,同时将全局变量中的方向指示变量的值由原来的值更改为用户选定的方向的值;

接着判断蛇头的坐标是否与边界或者是自己的身体坐标重合,如果重合则说明游戏失败,将跳出当前循环。

如果没有重合则接着判断是否与食物坐标重合,如果重合代表吃到食物,计分加一,蛇长加一,否则为没有吃到食物,不进行任何操作。

接着就应该将蛇画在界面上,然后进行下一次游戏循环。

游戏结束:

如果上面死亡判定通过将会进入这一个步骤,先绘制游戏结束画面,然后显示游戏得分。

游戏变结束了。

图2-1除了正常的游戏结束外,还能够通过按下ESC键退出游戏,流程如图2-2所示。

游戏退出:

在游戏循环中如果用户按下了ESC键,那么游戏将直接从游戏中退出,不会显示游戏结束画面也不会显示得分。

游戏重置:

用户以除按ESC退出游戏的方式外的正常结束将经过重置后重新进入等待开始步骤。

图2-23详细设计3.1类设计整个游戏有三个主要的类与几个全局变量分别如图3-1,图3-2所示。

Control类:

主要实现初始化控制台设置,构建缓冲,按键监听,死亡检测,吃食检测,生成食物,输出缓冲到屏幕,获取控制状态,清空屏幕,重置等等功能。

UI类:

主要实现界面的绘制,包括游戏初始界面,游戏结束界面和边界的绘制使用DrawStart()、DrawEnd()、DrawBorder()三个函数实现。

这里的绘制并不是直接向屏幕绘制,而是向缓冲绘制。

Snake类:

主要实现蛇的运动,自身的初始化,重置的功能。

图3-1全局变量文件:

如图3-2所示,它有定义的一个文件包含标志_GLO_,因为每个类文件都有一些变量在全局文件中被定义,但是多重引用会导致重定义,使用包含标志符可以确保文件只会被引用一次,从而避免重定义的冲突出现。

SetConsolFont是一个未在源文件中公开的WinAPI函数,使用它之前需要提前定义,之后再在使用的时候直接从系统dll中获取入口点。

四个方向的定义,分别是上下左右四个键值,用于响应用户按下键盘上的光标键后的赋值与比较。

Buffer是一个屏幕缓冲指针,它将指向一个和游戏显示区域大小一致的内存区域,所有对屏幕的写操作将先写入这个缓冲然后再一次性输出到屏幕。

Width和height指明屏幕大小,用来初始化buffer的大小,绘制图像时也需要通过这些数据由屏幕上的二维坐标转换到buffer中的一维线性位置。

Length是蛇长度,依据长度可决定绘制蛇的时候循环的次数。

Direction是方向变量,存储用户当前按下的方向键的键值。

Getfood是获得的分数,也可称作吃到食物的次数,最终得分是该数与一百的乘积。

waitEat是游戏区域内已有食物总数,只是0或者1.Head、tail。

Seq分别是指向蛇的头、尾和遍历变量的指针。

GameStart[]、GameOver[]分别是指向开始与结束画面字符的指针数组。

图3-23.2关键代码实现Control类在初始化中对控制台的设置:

buffer=newchar[width*height];

memset(buffer,,width*height*sizeof(char));

//开辟内存地址存放缓冲,并将缓冲内容全部置为空格HMODULEhKernel32=GetModuleHandle(L“kernel32“);

SetConsoleFont=(PROCSETCONSOLEFONT)GetProcAddress(hKernel32,“SetConsoleFont“);

//从kernel句柄处获得SetConsolFont函数的入口地址SetConsoleOutputCP(437);

//设置控制台文字页为437std:

:

ostringstreamsst;

std:

stringstr=““;

ssty*width+head->

x]==char(186)){returntrue;

}//碰到左右边界,将死亡elseif(buffer[head->

y*width+head->

x]==char(187)){returntrue;

}//碰到右上角边界,将死亡elseif(buffer[head->

x]==char(188)){returntrue;

}//碰到右下角边界,将死亡elseif(buffer[head->

x]==char(200)){returntrue;

}//碰到左下角边界,将死亡elseif(buffer[head->

x]==char(201)){returntrue;

}//碰到左上角边界,将死亡elseif(buffer[head->

x]==char(205)){returntrue;

}//碰到上下边界,将死亡elseif(buffer[head->

x]==char(254)){returntrue;

}//碰到蛇身体,将死亡else{returnfalse;

}//说明遇到的是空格字符,是安全的。

按键检测,由于蛇在向一个方向运动的时候是不能够再向反方向运动的,所以必须有一定的处理:

if(GetAsyncKeyState(VK_DOWN)}//按下了↓,且上一次按下的不是↑,那么就更改方向值为当前值if(GetAsyncKeyState(VK_UP)}//按下了↑,且上一次按下的不是↓,那么就更改方向值为当前值if(GetAsyncKeyState(VK_LEFT)}//按下了←,且上一次按下的不是→,那么就更改方向值为当前值if(GetAsyncKeyState(VK_RIGHT)}//按下了→,且上一次按下的不是←,那么就更改方向值为当前值Main函数中,在游戏结束的时候需要显示玩家的得分,这里使用对话框的形式给出。

由于使用MessageBox函数显示分数需要显示由int转换成字符的分数,所以使用了CString类,这里需要#include“afxwin.h“。

charsc[4];

//转换的分数存放数组_itoa_s(getFood,sc,10);

//将int转换为char[]CStringff(sc);

//由char[]转换为CString,方便后面作字符拼接MessageBox(NULL,ds+ff+so,L“游戏结束!

“,MB_OK);

//显示拼接的分数字符结果4系统调试在调试的时候编译阶段就出现了错误,错误提示如图4-1所示。

其原因是使用CString类所导入的afxwin.h文件引起的。

它要求必须有_AFXDLL的定义或者是运行在MD模式下,这里在项目设置中更改调试模式为MD即可。

图4-1在没有对蛇头与蛇身体作检测的时候会出现问题,如图4-2所示,蛇能够穿过自己的身体,这与游戏规则是不相符的。

所以需要对蛇头与蛇身的重合作检测。

同样的在蛇与游戏区域边界没有作检测的时候,如图4-3所示,蛇的字符将会覆盖边界的字符,随着蛇离开后将会被变成空格符,所以也许要对蛇和边界作重合检测,如果重合后则直接判定为死亡,接着就退出游戏。

图4-2图4-35结果分析经调试后的运行结果如图5-1、图5-2、图5-3所示。

游戏开始画面如图5-1所示:

图5-1游戏画面如图5-2所示:

图5-2游戏结束画面如图5-3所示图5-36总结经过几日的开发与调试,贪吃蛇游戏最终开发完成了,这次个游戏实现了在控制台上接受用户按键操纵蛇在游戏区域内移动,触碰到自己或是边界的时候结束游戏,吃到食物则增加蛇的长度和得分,直到游戏结束就显示得分。

虽然成功的实现了游戏的基本功能,但是由于时间的缘故,没有实现游戏相关参数的自定义设置,比如自定义窗口的宽与高,设定初始蛇的长度,设定最大同时出现食物的长度等等,还没有实现得分排行榜,游戏闯关模式,穿墙功能等等特殊的游戏特性。

即使有遗憾,但是通过亲手写代码,查资料,对C++的使用与WindowsAPI的理解有了进一步的加深,收获颇丰。

附件程序源码:

全局变量:

#include“windows.h“#define_GLO_;

#defineLeft0;

#defineRight1;

#defineUp2;

#defineDown3;

typedefBOOL(WINAPI*PROCSETCONSOLEFONT)(HANDLE,DWORD);

PROCSETCONSOLEFONTSetConsoleFont;

staticchar*buffer;

intwidth;

intheight;

intlength;

intdirection;

intgetFood;

intwaitEat;

structSnakeSection{intx;

inty;

SnakeSection*pre;

SnakeSection*next;

};

SnakeSection*head;

SnakeSection*tail;

SnakeSection*seq;

char*GameOver[]={“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@

@@@@@@@@@@@@@@@@@HH@@@@@@@@

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GS9XBSXGX3SA@@@@@@@“,“@@@@@@@@@@@@MX3GiriirssssssssrS@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@BHB1.:

;

SAh,:

.G@@@@@#HBX,:

5BHB@@@@@B.3HXMHr93X@@@@#MBB@#BM@@@SS9#@B:

.iSS1X@@S.r@@@H@@B88S#@B:

..3@@@@@A:

G@@9.;

@@8h99S.3@@

B111..8@@9.,8X39995SXs.i#@B:

.rhhi:

hhs.3B93X#@B.8@#####@@HX@@519HS5A@@M@@@“,“@@@@@@@@@M898B@@@@@@@@A8GG8G8888GGGG88H@@H88888G#########A88888X#@MG88888B@@@##@@@MG8GG88B@@A8GGGGGGGGG888888888GAH95iiG#@@@@“,“@@@@@@@@@A51GM@@@@

@@@@@@@@@@@@@@@@@@##@@@@@@@#########@@@@@@@###@@@@@@@#M#@@@@@@@@@@@@@@@@@###@@@

@@@@@@@@X9XGr1ssrii;

rsssssssssrA@@8irrir1sssssssss11sG@@@@@@@@@@@@@“,“@@@@@@@@@@@@#M#@BBBi:

i1115;

,,GBBM@@3,M@##@@M9H5;

#@B,.,,,:

,,,,,,,,,..S@MMMM##@M:

.8@@9.:

#@@MHH85.3@@#MB#@@M:

.8@@9.;

MA8H#####5.i#@B:

.GBX83XH.3@@#BAB#BM:

.8@@3.;

iM@@5,:

;

#@B:

.,,,,,;

:

H@@@@@S.r@@@.r@@@M@@@@@@“,“@@@@@@@@@@@@@@@#;

.3@@@.:

h1S#@B:

.i11111s11sss1B@@@@@S.;

GG8595:

ihh1113@@#X8XHM@@“,“@@@@@@@@@@@@@@@#;

.3@@XSS38AX:

.8@@@@@ri8@@@@

#M@@@@“,“@@@@@@@@@@@MM#@#1ii,5i;

X@@BAAM@@Mrii.;

i;

G@@@@@@@@B:

.3X8SG@@@@@@;

r@3hS#@@@@@“,“@@@@@H5@@@@@S8MArA:

iGG58B8GGM9SXXisH,.GXGH@s5s.hchar*GameStart[]={“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@MHAAHM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GSH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@Xs;

irri;

iX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@Hi1i@@@@;

9@@@@@G,X@@#:

SA@@@@@S:

hssss1h3@@M11sss1hhH@@13@@@@@@s8@@@@#;

H@9S@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@5,X@@@@@@G;

@@@@;

.i1h1irM@@@#h.:

shhsi8@@@@9,ihhr1;

8@@@@@@X,#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@#AG998XH#@@@@@BH#@@@@@@@@HG99GA#@@@@@@MG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BB@B:

rA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AS1S911srhhs9M@@@@@@@@@@@@@@@@@@@@@@@@@@MBM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B8X19ASs:

S@@5,9M@@@@@@@@@@@@@#BAAH#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8SB@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@@@8s1hsiS19H3:

,sXXhrii5H@@@@@@@@@Gr:

iiii;

S@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;

X@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@#8i,s5ri:

,;

rs1i,:

iihh,:

X@@@@@@@S;

B@@@@BA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@iX@@@@@@@@@@@@@@@@@@@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@#G5riri:

,:

i1i:

h#@@@@@@1i#@@@@@@@@@@9hHGhr;

r9#@@@@@X5siiiSB@@@@@iX@@@X15H@@@#9siir5A@@@@@“,“@@@@@@@@@@@@@@@@@@@@@@@@@@Xr;

,,,,,,,,;

rrirri:

.:

iG@@@@@@@#5,i3A@@@@@@@;

:

SXHXri#@@@#h9ABB9.B@@@@i&

@H

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1