




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-作者xxxx-日期xxxx贪吃蛇游戏开发文档(最终)【精品文档】贪吃蛇游戏开发文档本文档为稻草人于暑假开发C语言版本之链表学习的贪吃蛇游戏文档!一:游戏分为两个大模块:一:界面开发(UI):1:菜单界面;2:游戏界面;3:积分板块;二:游戏开发:1:界面的控制;2 : 成长的规则;(1300升中级,2500升高级)3:碰撞检测/本游戏采用全局使用键盘控制,以及使用了多线程,所以使用了WINDOWS API函数,/运行系统:Windos/7/8/10/XP二:本项目所用到的头文件:1:库头文件:#include<>#include<>#include<>#i
2、nclude<>2:自写头文件:#"#"三:头文件介绍:头文件为:游戏的核心文件,里面包含了游戏界面的绘制函数,游戏的成长机制,游戏的碰撞检测等。Snake.h;typedef struct Snakedint x;int y;/蛇身体的坐标char Content3;Snaked *pNext;/指向下一个结构体Snaked *pHead;/指向上一个结构体Snakedd;/定义蛇身体的结构体void GameWord(void);/绘制游戏界面void ConsoleControl(void);/控制台显示格式控制void MenuControl(void)
3、;/菜单控制中心Snakedd *ProduceSnake(int iCnt); /产生蛇的身体,iCnt代表的是蛇的身体有几节。void PrintList(Snakedd *pHead);/打印出链表(蛇身)void DeleteList(Snakedd *pHead);/销毁链表void RandomCoordinate();/产生一个随机坐标,并且打印出食物/多线程函数:DWORD WINAPI MobileSnake(LPVOID lpChandle); /移动蛇(未实现)DWORD WINAPI KeyboardControl(LPVOID lpChandle);/键盘控制。DWO
4、RD WINAPI LostGameTime(LPVOID lpChandle);/已经用去的时间/后续函数占位:头文件为:辅助头文件,它里面包含了对控制台的一些控制:void HideCursor(bool Switch);/光标显示与隐藏函数;true;显示光标;false:隐藏光标void gotoxy(int x,int y);void Block(int x,int y,int Wide,int Hight);/绘制方框函数 x,y代表方框起始的左上角坐标;Wide:输出方框的长; Hight:输出方框的高int Menu(char* MenuTxt,int Lenght,int W
5、ide,int Hight,int x,int y);/菜单选项绘制; MenuTxt:代表要绘制出的菜单选项; Lenght:代表选项的总项目数;x,y代表方框起始的左上角坐标;Wide:输出方框的长; Hight:输出方框的高;返回值;-1 代表左键 ;其他值代表右键四:函数的实现:Tools.h头文件:*第一次完成函数:*void HideCursor(bool Switch);*void HideCursor(bool Switch) int iCnt=0;if(Switch=true)iCnt=1;elseiCnt=0;CONSOLE_CURSOR_INFO cursor_info
6、= 1, iCnt; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);*END*void gotoxy(int x,int y)*void gotoxy(int x,int y)COORD xy;/光标的位置HANDLE hHand;/句柄变量hHand=GetStdHandle(STD_OUTPUT_HANDLE);/获取输出的句柄=x;=y;SetConsoleCursorPosition(hHand,xy);/设置控制台光标的位置*END*void Block(int x,int y,int
7、Wide,int Hight)*void Block(int x,int y,int Wide,int Hight) int i=0;/上边框gotoxy(x,y);printf("");for(i=0;i<Wide-1;i+)printf("");printf("");/下边框gotoxy(x,y+Hight-1);printf("");for(i=0;i<Wide-1;i+)printf("");printf("");/左边框,右边框for(i=0;i<
8、Hight-2;i+)gotoxy(x,y+i+1);printf("");gotoxy(x+2*Wide,y+i+1);printf("");*END*START*int Menu(char* MenuTxt,int Lenght,int Wide,int Hight,int x,int y) *START*int Menu(char* MenuTxt,int Lenght,int Wide,int Hight,int x,int y)int i=0;int iCnt=0;int iRow=0;int iColoum=0;int iResult=0;/
9、绘制出菜单的边框Block(x,y,Wide,Hight);/打印出菜单内容for(i=0;i<Lenght;i+)gotoxy(x+3,y+3+i*2);printf(" %d:%sn",i+1,MenuTxti);/初始化箭头位置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)case 72:i=-2;i
10、Result-;if(iResult<0)iResult=Lenght-1;break;case 80:i= 2;iResult+;if(iResult>=Lenght)iResult=0;break;case 75:i=-1;break;case 77:i= 1;break;if(i=2 | i=-2)printf("bbb ");iColoum=iColoum+i;if(iColoum<y+3)iColoum=y+3+2*Lenght-2;if(iColoum>y+3+2*Lenght-2)iColoum=y+3;gotoxy(iRow,iCol
11、oum);printf("->");if(i=-1)return -1;if(i=1)break;return iResult;*END*函数END*Snake.h:/全局变量,用于控制蛇的方向int Coloum;/Y坐标的变量/方向控制:int Row_x=2;int Coloum_y=0;/食物位置:int iFood_x;int iFood_y;bool Space=true;/空格用于暂停bool Thread = true;int iIntegral = 0;/积分int iGrade = 0;/难度等级/全局变量,用于控制蛇的方向char Name20=
12、""/最高纪录的名字int iMark=0; /记录的成绩Snakedd *pSnake=NULL;/存储蛇的头节点地址Snakedd *pFooted = NULL;/消失的蛇身的节点int iFooted_x=0;int iFooted_y=0;/新增蛇体的位置CRITICAL_SECTION hade;/用于线程锁 /*第一次完成函数:*void GameWord(void)*void GameWord(void) int x=5; int y=3; int i=0; system("cls"); Block(0,0,25,30); Block(5
13、2,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("游戏最
14、高分:"); 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("已玩游戏时间:&qu
15、ot;); CreateThread(NULL,0,LostGameTime,NULL,0,NULL); /提示 gotoxy(0,30); printf(" t温馨提示:控制方向,空格暂停游戏和继续游戏!");*END*void MenuControl(void)*void MenuControl(void)int i=0;char *s4="开始游戏","游戏难度","更多游戏","退出游戏"l1:i=Menu(s,4,10,12,25,10);gotoxy(0,0);if(i=-1)pri
16、ntf("你选择的是返回上一层");if(i=0)GameWord();if(i=1)system("cls");Block(25,10,15,12);gotoxy(28,13);printf("该功能尚未开发!");if(i=2)system("start ");system("cls");goto l1;if(i=3)exit(0);*END*void ConsoleControl(void)*void ConsoleControl(void)system("mode con co
17、ls=75 lines=32");HideCursor(false);system("title 贪吃蛇-稻草人");system("color A");*END*Snakedd *ProduceSnake(int iCnt)*Snakedd *ProduceSnake(int iCnt)int i = 0;/用于循环变量Snakedd *pResult = NULL;/头节点,同时作为函数的返回值Snakedd *pTemp = NULL;Snakedd *pFoot = NULL;/变量节点,用于存放中途产生的结构体地址if (iCnt &
18、lt;= 0)return NULL;/判断生成链表的有效性for (i = 0; i < iCnt; i+)pTemp = new Snakedd();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 =
19、 pTemp;pTemp->pHead = NULL;continue;/如果这是第一个结构体,把它赋值给头指针pFoot->pNext = pTemp;pTemp->pHead = pFoot;pFoot = pTemp;/把新生的结构体接上链表return pResult;*END*void PrintList(Snakedd *pHead)*void PrintList(Snakedd *pHead)while (pHead)gotoxy(pHead->x,pHead->y);printf("%s",pHead->Content);
20、pHead = pHead->pNext;*END*void DeleteList(Snakedd *pHead)*void DeleteList(Snakedd *pHead)Snakedd *pTemp = pHead->pNext;while (pTemp)delete(pHead);pHead = pTemp;pTemp = pTemp->pNext;delete(pHead);*END*void RandomCoordinate()*void RandomCoordinate()int x;int y;srand(unsigned)time(0);/时间种子x =
21、rand() % 24 + 1;y = rand() % 24 + 1;gotoxy(x,y);printf("");*END* DWORD WINAPI KeyboardControl(LPVOID lpChandle)*DWORD WINAPI KeyboardControl(LPVOID lpChandle)int iCnt = 0;while (1)fflush(stdin);/清除缓存iCnt = getch();if (iCnt = 33)if (Space = true)Space = false;elseSpace = true;/用于判断空格键iCnt =
22、 getch();switch (iCnt)case 72:/上if(Coloum_y>0)break;Row_x = 0;Coloum_y = -1;break;case 80:/下if (Coloum_y<0)break;Row_x = 0;Coloum_y = 1;break;case 75:/左if (Row_x>0)break;Row_x = -2;Coloum_y = 0;break;case 77:/右if (Row_x<0)break;Row_x = 2;Coloum_y = 0;break;return 1;*END* DWORD WINAPI Los
23、tGameTime(LPVOID lpChandle)*DWORD WINAPI LostGameTime(LPVOID lpChandle)int i=0;while(1)gotoxy(52+5,3+21);printf("%5d秒",i);Sleep(1000);printf("bbbbb bbbbb");i+;return 1;*END*函数END*第二次修改*只出现修改后的函数:*tools.h*1:新增函数char* GetTime(void)SYSTEMTIME sys;GetLocalTime(&sys);char *pLocalT
24、ime=new char24;sprintf(pLocalTime, "%d/%d/%d", , , , , , );/将时间转化为字符串存在数组里return pLocalTime;/该函数功能为获取当前系统时间,返回值为字符串格式为:YY/MM/DD*END*Snake.h*1:移除函数:DWORD WINAPI LostGameTime(LPVOID lpChandle);/已经用去的时间理由:因为该函数可能导致系统线程混乱,至游戏界面乱码,由于技术有限,所以选择移除该函数,用里面的GetTime代替。2:修改函数:(1):void GameWord(void);此函
25、数功能用于初始化游戏界面. 修改部分代码:void GameWord(void) int x=5; int y=3; int i=0; system("cls"); Block(0,0,25,30); Block(52,0,10,30); gotoxy(10,12); /游戏区域绘制 ReadInformation(); /积分板信息控制/用户信息 gotoxy(52+x,y); printf("最高纪录者:"); gotoxy(52+x,y+1); printf("%9s",Name);/游戏最高分 gotoxy(52+x,y+5)
26、; printf("游戏最高分:"); gotoxy(52+x,y+6); printf("%6d",iMark);/当前游戏难度 gotoxy(52+x,y+10); printf("游戏难度:"); gotoxy(52+x,y+11); if (iGrade=0) printf(" 低"); if (iGrade = 1) printf(" 中"); if (iGrade = 2) printf(" 高");/当前得分 gotoxy(52+x,y+15); printf(
27、"当前日期:"); gotoxy(52+x,y+16); char *pTime = GetTime(); printf("%s",pTime); delete(pTime);/当前时间 gotoxy(52+x,y+20); printf("当前游戏得分:"); gotoxy(52+x,y+21); printf("%6d",iIntegral); /提示 gotoxy(0,30); printf(" t温馨提示:控制方向,空格暂停游戏和继续游戏!"); Sleep(500);/防止线程交换打印
28、出错(2):修改了食物的算法:原版因为算法的缘故导致游戏不流畅经常卡顿,现在改进算法不再卡顿,但是有可能奔溃一直算不出来食物,我以后会尽量修复该BUGvoid RandomCoordinate(void)int iCnt = 0;Snakedd *pTemp = pSnake;srand(unsigned)time(0);/时间种子R_1:iFood_x = rand() % 24 + 1;iFood_y = rand() % 24 + 1;/食物不能出现在蛇身:iCnt = 0;while (pTemp)if (iFood_x % 2 != 0 && iFood_x != 0
29、)iFood_x = (iFood_x+1)%24;if (pTemp->x - iFood_x <= 2 && pTemp->y = iFood_y | pTemp->x - iFood_x >= -2 && pTemp->y = iFood_y)iCnt+;iFood_x = (iFood_x + 2) % 22 + 2;iFood_y = (iFood_y + 1) % 23 + 1;pTemp = pSnake;if (iCnt = 20)goto R_1;continue;pTemp = pTemp->pNex
30、t;gotoxy(iFood_x, iFood_y);printf("");gotoxy(57, 6);2:新增两个功能:读取和存档功能:读取:游戏开始时会自动去读取本机游戏的最高分,并且显示出来存档:游戏结束时会自动用你的分和最高分进行比较如果高于最高分会要求你输入名字,并且存入文件。void WriteInformation()/存档功能if (iIntegral > iMark)gotoxy(36, 15);printf("恭喜你!新纪录!");gotoxy(36, 16);printf("请输入你的名字:");gotoxy(38, 17);HideCursor(true);scanf("%s&quo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 区块链数据备份光盘驱动器租赁与远程监控服务协议
- 智慧农业无人机精准喷洒系统租赁服务合同
- 高校与知名企业联合培养实习生就业保障协议
- 管理者任职资格答辩
- 《情感调控》课件
- 《聚酰亚胺》课件:一种耐高温高分子材料的深度解析
- 《聚合物X射线研究》课件
- 防火放电安全教育
- 《慢性肾衰竭》课件
- 《咖啡文化基础知识》课件
- 租地合同补充协议格式
- 果戈里介绍课件
- 四川省泸州市2025届高三第三次教学质量诊断性考试地理试题(含答案)
- 小学音乐(聆听)小小少年教案设计
- 2025届陕西省高考适应性检测(三)数学试题+答案
- 超市商品补货管理制度
- 2025年阳江海上风电项目可行性研究报告
- 2025新版静疗规范
- 水价与水市场机制联动机制-全面剖析
- 4.1公民基本义务-教案 2024-2025学年统编版道德与法治八年级下册
- 《卫星遥感技术》课件
评论
0/150
提交评论