str=sst.str();
system(str.c_str());
//设置控制台的宽与高
system("ColorF0");
//将控制台颜色更改为白底黑字
OutPut=GetStdHandle(STD_OUTPUT_HANDLE);
//获取控制台输出流句柄
CONSOLE_CURSOR_INFOcci;
cci.bVisible=0;
cci.dwSize=1;
//创建控制台光标大小为一且不可见
SetConsoleCursorInfo(OutPut,&cci);
//隐藏控制台的光标显示
SetConsoleFont(OutPut,0);
//设置控制台字体为第一个字号
死亡判定检测,采取字符比对的方式,因为游戏区域大部分是空格字符,除食物外,只有边界字符与蛇的字符,所以可以简化判定:
if(buffer[head->y*width+head->x]==char(186)){returntrue;}
//碰到左右边界,将死亡
elseif(buffer[head->y*width+head->x]==char(187)){returntrue;}
//碰到右上角边界,将死亡
elseif(buffer[head->y*width+head->x]==char(188)){returntrue;}
//碰到右下角边界,将死亡
elseif(buffer[head->y*width+head->x]==char(200)){returntrue;}
//碰到左下角边界,将死亡
elseif(buffer[head->y*width+head->x]==char(201)){returntrue;}
//碰到左上角边界,将死亡
elseif(buffer[head->y*width+head->x]==char(205)){returntrue;}
//碰到上下边界,将死亡
elseif(buffer[head->y*width+head->x]==char(254)){returntrue;}
//碰到蛇身体,将死亡
else{returnfalse;}
//说明遇到的是空格字符,是安全的。
按键检测,由于蛇在向一个方向运动的时候是不能够再向反方向运动的,所以必须有一定的处理:
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=Left;
}
//按下了←,且上一次按下的不是→,那么就更改方向值为当前值
if(GetAsyncKeyState(VK_RIGHT)&&0X8000){
if(direction!
=0)direction=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-3
5结果分析
经调试后的运行结果如图5-1、图5-2、图5-3所示。
游戏开始画面如图5-1所示:
图5-1
游戏画面如图5-2所示:
图5-2
游戏结束画面如图5-3所示
图5-3
6总结
经过几日的开发与调试,贪吃蛇游戏最终开发完成了,这次个游戏实现了在控制台上接受用户按键操纵蛇在游戏区域内移动,触碰到自己或是边界的时候结束游戏,吃到食物则增加蛇的长度和得分,直到游戏结束就显示得分。
虽然成功的实现了游戏的基本功能,但是由于时间的缘故,没有实现游戏相关参数的自定义设置,比如自定义窗口的宽与高,设定初始蛇的长度,设定最大同时出现食物的长度等等,还没有实现得分排行榜,游戏闯关模式,穿墙功能等等特殊的游戏特性。
即使有遗憾,但是通过亲手写代码,查资料,对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@@@@@@@@@#@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GS9XB&B@@@@@@@",
"@@@@@@@@@@@@@##M#@@@@@@@@@@@@@@@#@@@@@#@@@&39X#@@@@@@@@@@@@@@@@@@@@#@@@@#@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#XXh581SSM@@@@@@",
"@@@@@@@@@@@#HGSG@@@@@@@@#@@#@@@@@@##@@@@AS91SH@@@@@@@@@@@#BMBB@#@#@#@@@@@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&;SXGX3SA@@@@@@@",
"@@@@@@@@@@@@MX3G&G#@@@@@@@@@@@@@@@@@@@@@@#&3838XM@@@@@@@#@@#GX8XXA@@@@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@@@@@@@@B&A55X5sH@@@@@@@",
"@@@@@@@@@@@@@M&&&&B@@@@@@@#&HMB#@@@@#@@@@@BG8ABH#@@@@@@@@@@@8sr5@@@#@@@M&H@H&S##B#@@@@@@@@@@@@@B&BBBM@@@@@@@@@M##&M@@@@@@@@",
"@@@@@@@@@@@@@@H&@##@@@@@@@BG&BGG&HMHH@@@@@#HM@@@@@@@@@@@@@@#A3SG#@@@@@@@@#XBX391XBGM@@@@@@@@@@H&A93&AGXA@@@@@@@@@@@@@@@@@@@@@",
"@@@@@@@@@@@@@@@#@@@@@@Gss1shss1s9X1;ir&@@@@@@@@M1s1ssss1sX@@@@##@@Mhs111sA@MH33GH##hs111sA@@Gsiirsrii;iirssssssssrS@@@@@@@@@@",
"@@@@@@@@@@@@@@@@@@@BHB1.:
:
:
:
:
;SAh,:
.G@@@@@#HBX,:
5BHB@@@@@B.3HXMH&A&&XX@@5:
:
:
:
:
:
:
,,,,,.1@@@@@@@@@@",
"@@@@@@@@@@#@@@@@@@@1.s@@@@@@#@@@@@@@@@@@A..A@@r.h@@@@@B:
......3@@A........&@@S...i#@M&&@@###@@@@@@M&AHB#@@",
"@@@@@##MMM#@@@@#9SS;r93X@@@@#MBB@#BM@@@&5S1,S39#@@X39r;SS9#@B:
.....iSS1......X@@S...r@@@H&B&&@@@@@@@@@@BX39XH@@",
"@@@@@#MHA&B#@@@#,.9@@@@@@MA8SS5X8G#@@3.;@@B88S&@@3.;#@B:
...............&@@S...i##B95GXSA####@@@@@BHA&M@@@",
"@@@@@@BG989H@@@#;...3@@@@@A......:
;:
G@@9...;@@8h99S&@3...i#@B:
...........&@@S.....,,....,,.S@@@@@@@@#@@@@",
"@@@@@@MHXXAB#@@#;...3@@@#@B111..8@@9...,8X39995SXs...i#@B:
...rhhi:
hhs.....&@@S...,11hh1111111s8@@@@@@@@@@@@@",
"@@@@@@@@M#@#@@@#:
.3@@@A99XMA:
...8@@9.........i#@B:
...X@@9s@@B,...&@@S...r@@AA@@@@@@@@@@@@@@@@@@@@@@",
"@@@@@@@@@@@@@@@@A&Ai:
r;3B93X&H:
...8@@9...:
X&&&&&&&A1...i#@B:
...G@@B&&H@@H,...&@@S...r@MS1H#@@@@@@@@@@@@MH@@@@@@",
"@@@@@@@@@@@@@@@@@@@Sir,rX3GAGG:
...8@@9...:
#@@@@@@@@3...i#@B:
...8@#@@@@@@H....&@@S...iG89835&A&&&&&AAB@@#M@M#@@@",
"@@@@@@@@@@@@@@@@@@@@@@59@@3,M@######@5;#@B.8@#####@@HX@@519HS5A@@M@@@",
"@@@@@@@@@M898B@@@@@@@@A8GG8G8888GGGG88H@@H88888G#########A88888X#@MG88888B@@@##@@@MG8GG88B@@A8GGGGGGGGG888888888GAH95iiG#@@@@",
"@@@@@@@@@A51GM@@@@@#@@@@@@@@@@@@@@@@@@@##@@@@@@@#########@@@@@@@###@@@@@@@#M#@@@@@@@@@@@@@@@@@###@@@@#@@@@@@@@@X9XG&BHHGB@@@@",
"@@@@@@@@M855GXM@@@@@@@#BBMH&B@@@@@@@################################@@#ABB&AHM@@@@@@@@@@@@@@@AGG&S&BA&@@@@@@@MAXh8XA@@@@@@@",
"@@@@@@@@@&S1SB@@@@@@@A899GXXM####@@@@####@@@@@@@#########@@@@@@@##@HAX&&X888XX#@@@@@@@@@@@@@#XG&88BBBBA@@@@@@@@@@@@#XX#@@@@@@",
"@@@@@@@@@@MGG&M@@@@3s18GHAHH31r5SS1B@@@#@Xs111shM@#####@@8s111sS#@M1i;r1ssrii;rsssssssssrA@@8irrir1sssssssss11sG@@@@@@@@@@@@@",
"@@@@@@@@@@@@#M#@BBBi:
i1115;,,,GBBM@@3,M@##@@M9H5;#@B,.,,,:
,,,,,,,,,.&@@5,,,,,,,,,1MBM@@@@@@@@@@",
"@@@@@@@@@@@@@@@#;...S@MMMM##@M:
...8@@9...:
#@@MHH85&S...i#@B:
...8@#@@##@@@######@@@S...i#@#@@##@@1...s@@@@@@@@@@",
"@@@@@@#@@@@@@@@#:
..3@@@@@@@@#:
.8@@9...:
##BHH&9X#S...i#@B:
...G@@#M@@HH@@@@@@@@@@S...r@@@@#@@@@1..s@@@@@@@@@@",
"@@@@@@@@@@@@@@@#;...3@@#MB#@@M:
...8@@9...;MA8H#####5...i#@B:
...GBX83XH&AB#M#@#@@@@S...i@@@&GB@#@1...s@@@@@@@@@@",
"@@@@@@@@@@@@@@@#;...3@@#BAB#BM:
...8@@3...;;iM@@5,:
..;#@B:
.....,,,,,;:
:
;;;H@@@@@S...r@@@&XB1,;.r@@@M@@@@@@",
"@@@@@@@@@@@@@@@#;...3@@@&3GBH&:
...8@@X1hr..3XG;.:
h1S#@B:
...i11111s11sss1B@@@@@S...;GG8595:
ihh1113@@#X8XHM@@",
"@@@@@@@@@@@@@@