贪吃蛇游戏开发文档最终.docx
- 文档编号:27539625
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:28
- 大小:68.37KB
贪吃蛇游戏开发文档最终.docx
《贪吃蛇游戏开发文档最终.docx》由会员分享,可在线阅读,更多相关《贪吃蛇游戏开发文档最终.docx(28页珍藏版)》请在冰豆网上搜索。
贪吃蛇游戏开发文档最终
贪吃蛇游戏开发文档
本文档为稻草人于暑假开发C语言版本之链表学习的贪吃蛇游戏文档!
一:
游戏分为两个大模块:
一:
界面开发(UI):
1:
菜单界面;
2:
游戏界面;
3:
积分板块;
二:
游戏开发:
1:
界面的控制;
2:
成长的规则;(1300升中级,2500升高级)
3:
碰撞检测
//本游戏采用全局使用键盘控制,以与使用了多线程,所以使用了WINDOWSAPI函数,
//运行系统:
Windos/7/8/10/XP
二:
本项目所用到的头文件:
1:
库头文件:
#include
#include
#include
#include
2:
自写头文件:
#include"tools.h"
#include"Snake.h"
三:
头文件介绍:
Snake.h头文件为:
游戏的核心文件,里面包含了游戏界面的绘制函数,游戏的成长机制,游戏的碰撞检测等。
Snake.h;
typedefstructSnaked{
intx;
inty;
//蛇身体的坐标
charContent[3];
Snaked*pNext;//指向下一个结构体
Snaked*pHead;//指向上一个结构体
}Snakedd;//定义蛇身体的结构体
voidGameWord(void);//绘制游戏界面
voidConsoleControl(void);//控制台显示格式控制
voidMenuControl(void);//菜单控制中心
Snakedd*ProduceSnake(intiCnt);//产生蛇的身体,iCnt代表的是蛇的身体有几节。
voidPrintList(Snakedd*pHead);//打印出链表(蛇身)
voidDeleteList(Snakedd*pHead);//销毁链表
voidRandomCoordinate();//产生一个随机坐标,并且打印出食物
//多线程函数:
DWORDWINAPIMobileSnake(LPVOIDlpChandle);//移动蛇(未实现)
DWORDWINAPIKeyboardControl(LPVOIDlpChandle);//键盘控制。
DWORDWINAPILostGameTime(LPVOIDlpChandle);//已经用去的时间
//后续函数占位:
Tools.h头文件为:
辅助头文件,它里面包含了对控制台的一些控制
Tools.h:
voidHideCursor(boolSwitch);//光标显示与隐藏函数;true;显示光标;false:
隐藏光标
voidgotoxy(intx,inty);
voidBlock(intx,inty,intWide,intHight);//绘制方框函数x,y代表方框起始的左上角坐标;Wide:
输出方框的长;Hight:
输出方框的高
intMenu(char*MenuTxt[],intLenght,intWide,intHight,intx,inty);//菜单选项绘制;MenuTxt:
代表要绘制出的菜单选项;Lenght:
代表选项的总项目数;x,y代表方框起始的左上角坐标;Wide:
输出方框的长;Hight:
输出方框的高;返回值;-1代表左键;其他值代表右键
四:
函数的实现:
Tools.h头文件:
**********************第一次完成函数:
***************************
***********************voidHideCursor(boolSwitch);*************
voidHideCursor(boolSwitch)
{
intiCnt=0;
if(Switch==true)
iCnt=1;
else
iCnt=0;
CONSOLE_CURSOR_INFOcursor_info={1,iCnt};
SetConsoleCursorInfo(
GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
*********************************END******************************
***********************voidgotoxy(intx,inty)*******************
voidgotoxy(intx,inty)
{
COORDxy;//光标的位置
HANDLEhHand;//句柄变量
hHand=GetStdHandle(STD_OUTPUT_HANDLE);//获取输出的句柄
xy.X=x;
xy.Y=y;
SetConsoleCursorPosition(hHand,xy);//设置控制台光标的位置
}
*********************************END******************************
**********voidBlock(intx,inty,intWide,intHight)**************
voidBlock(intx,inty,intWide,intHight){
inti=0;//上边框
gotoxy(x,y);
printf("┏");
for(i=0;i { printf("━"); } printf("┓"); //下边框 gotoxy(x,y+Hight-1); printf("┗"); for(i=0;i { printf("━"); } printf("┛"); //左边框,右边框 for(i=0;i { gotoxy(x,y+i+1); printf("┃"); gotoxy(x+2*Wide,y+i+1); printf("┃"); } } *********************************END****************************** ********************************START***************************** intMenu(char*MenuTxt[],intLenght,intWide,intHight,intx,inty)**************START******************************************** intMenu(char*MenuTxt[],intLenght,intWide,intHight,intx,inty) { inti=0; intiCnt=0; intiRow=0; intiColoum=0; intiResult=0; //绘制出菜单的边框 Block(x,y,Wide,Hight); //打印出菜单容 for(i=0;i { gotoxy(x+3,y+3+i*2); printf("%d: %s\n",i+1,MenuTxt[i]); } //初始化箭头位置 gotoxy(x+3,y+3); printf("-->"); //箭头动态设置 iRow=x+3; iColoum=y+3; i=0; while (1) { fflush(stdin);//清除缓存 iCnt=getch(); if(iCnt==13) break; iCnt=getch(); switch(iCnt) { case72: i=-2;iResult--; if(iResult<0) iResult=Lenght-1; break; case80: i=2;iResult++; if(iResult>=Lenght) iResult=0; break; case75: i=-1;break; case77: i=1;break; } if(i==2||i==-2) { printf("\b\b\b"); iColoum=iColoum+i; if(iColoum iColoum=y+3+2*Lenght-2; if(iColoum>y+3+2*Lenght-2) iColoum=y+3; gotoxy(iRow,iColoum); printf("-->"); } if(i==-1) return-1; if(i==1) break; } returniResult; } *********************************END****************************** ********************Tools.h函数END******************************** Snake.h: //////////////////////////////////////////////////////////////// //全局变量,用于控制蛇的方向 intColoum;//Y坐标的变量 //方向控制: intRow_x=2; intColoum_y=0; //食物位置: intiFood_x; intiFood_y; boolSpace=true;//空格用于暂停 boolThread=true; intiIntegral=0;//积分 intiGrade=0;//难度等级 //全局变量,用于控制蛇的方向 charName[20]="";//最高纪录的名字 intiMark=0;//记录的成绩 Snakedd*pSnake=NULL;//存储蛇的头节点地址 Snakedd*pFooted=NULL;//消失的蛇身的节点 intiFooted_x=0; intiFooted_y=0;//新增蛇体的位置 CRITICAL_SECTIONhade;//用于线程锁 ///////////////////////////////////////////////////////////////// **********************第一次完成函数: *************************** *************************voidGameWord(void)********************* voidGameWord(void) { intx=5; inty=3; inti=0; system("cls"); Block(0,0,25,30); Block(52,0,10,30); gotoxy(10,12); //游戏区域绘制 //printf("游戏开始! "); Snakedd*pResult=ProduceSnake(7); PrintList(pResult); DeleteList(pResult); RandomCoordinate(); //积分板信息控制 //用户信息 gotoxy(52+x,y); printf("用户名: "); gotoxy(52+x,y+1); printf("轻松"); //游戏最高分 gotoxy(52+x,y+5); printf("游戏最高分: "); gotoxy(52+x,y+6); printf("88888"); //当前游戏难度 gotoxy(52+x,y+10); printf("游戏难度: "); gotoxy(52+x,y+11); printf("高"); //当前得分 gotoxy(52+x,y+15); printf("当前游戏得分: "); gotoxy(52+x,y+16); printf("7777"); //当前时间 gotoxy(52+x,y+20); printf("已玩游戏时间: "); CreateThread(NULL,0,LostGameTime,NULL,0,NULL); //提示 gotoxy(0,30); printf("\t温馨提示: ↑↓←→控制方向,空格暂停游戏和继续游戏! "); } *********************************END****************************** *************************voidMenuControl(void)***************** voidMenuControl(void) { inti=0; char*s[4]={"开始游戏","游戏难度","更多游戏","退出游戏"}; l1: i=Menu(s,4,10,12,25,10); gotoxy(0,0); if(i==-1) printf("你选择的是返回上一层"); if(i==0) GameWord(); if(i==1) { system("cls"); Block(25,10,15,12); gotoxy(28,13); printf("该功能尚未开发! "); } if(i==2) { system("start.pqsloveg.net"); system("cls"); gotol1; } if(i==3) exit(0); } *********************************END****************************** ***********************voidConsoleControl(void)**************** voidConsoleControl(void) { system("modeconcols=75lines=32"); HideCursor(false); system("title贪吃蛇-----稻草人"); system("colorA"); } *********************************END****************************** *******************Snakedd*ProduceSnake(intiCnt)**************** Snakedd*ProduceSnake(intiCnt) { inti=0;//用于循环变量 Snakedd*pResult=NULL;//头节点,同时作为函数的返回值 Snakedd*pTemp=NULL; Snakedd*pFoot=NULL;//变量节点,用于存放中途产生的结构体地址 if(iCnt<=0) returnNULL; //判断生成链表的有效性 for(i=0;i { pTemp=newSnakedd(); if(pTemp==NULL) { printf("产生结构体错误! 程序停止! "); exit(0);//强制结束任务 } //结构体有效性判断 pTemp->x=10+i*2; pTemp->y=10; strcpy(pTemp->Content,"■"); pTemp->pNext=NULL; if(pResult==NULL) { pResult=pTemp; pFoot=pTemp; pTemp->pHead=NULL; continue; } //如果这是第一个结构体,把它赋值给头指针 pFoot->pNext=pTemp; pTemp->pHead=pFoot; pFoot=pTemp; //把新生的结构体接上链表 } returnpResult; } *********************************END****************************** ******************voidPrintList(Snakedd*pHead)****************** voidPrintList(Snakedd*pHead) { while(pHead) { gotoxy(pHead->x,pHead->y); printf("%s",pHead->Content); pHead=pHead->pNext; } } *********************************END****************************** ******************voidDeleteList(Snakedd*pHead)**************** voidDeleteList(Snakedd*pHead) { Snakedd*pTemp=pHead->pNext; while(pTemp) { delete(pHead); pHead=pTemp; pTemp=pTemp->pNext; } delete(pHead); } *********************************END****************************** *******************voidRandomCoordinate()************************ voidRandomCoordinate() { intx; inty; srand((unsigned)time(0));//时间种子 x=rand()%24+1; y=rand()%24+1; gotoxy(x,y); printf("★"); } *********************************END****************************** *********DWORDWINAPIKeyboardControl(LPVOIDlpChandle)********** DWORDWINAPIKeyboardControl(LPVOIDlpChandle) { intiCnt=0; while (1) { fflush(stdin);//清除缓存 iCnt=getch(); if(iCnt==33) { if(Space==true) Space=false; else Space=true; } //用于判断空格键 iCnt=getch(); switch(iCnt) { case72: //上 if(Coloum_y>0) break; Row_x=0; Coloum_y=-1; break; case80: //下 if(Coloum_y<0) break; Row_x=0; Coloum_y=1; break; case75: //左 if(Row_x>0) break; Row_x=-2; Coloum_y=0; break; case77: //右 if(Row_x<0) break; Row_x=2; Coloum_y=0; break; } } return1; } *********************************END****************************** ***********DWORDWINAPILostGameTime(LPVOIDlpChandle)********* DWORDWINAPILostGameTime(LPVOIDlpChandle) { inti=0; while (1) { gotoxy(52+5,3+21); printf("%5d秒",i); Sleep(1000); printf("\b\b\b\b\b\b\b\b\b\b"); i++; } return1; } *********************************END****************************** ********************Snake.h函数END******************************* *************************第二次修改****************************** 只出现修改后的函数: ***************************tools.h****************************** 1: 新增函数 char*GetTime(void) { SYSTEMTIMEsys; GetLocalTime(&sys); char*pLocalTime=newchar[24]; sprintf(pLocalTime,"%d/%d/%d",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond);//将时间转化为字符串存在数组里 returnpLocalTime; } //该函数功能为获取当前系统时间,返回值为字符串格式为: YY/MM/DD *********************************END*************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 游戏 开发 文档 最终