版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
湖南人文科技学院·课程设计湖南人文科技学院数据结构课程设计课程名称:数据结构课程设计题目:校园导游咨询系统年级/专业/班:14级信工系网工二班组长姓名(学号):成员姓名(学号):《数据结构》课程设计--校园导游咨询系统设计一、引言 随着现代社会生活节奏的加快,人们外出旅行以寻求放松的时间越来越多。考虑到游客不可能对所有景点都有所了解,因此可能无法找到游玩景点最省时,最高效的路径,而人工导游成本又过高,故使用C++,基于《数据结构》中图的相关算法与HGE引擎的窗口界面开发了“湖南人文科技学院导游咨询系统”。开发本系统目的在于为来访我校的游客提供一条最短游览路径,本系统从实际出发,通过对校园平面图的分析,将其转化为数据并保存在系统中,因此系统提供的路径具有较大的可信性。而且本系统使用引擎创建窗口,更加方便,更加美观,更加易懂。本系统界面友好,提示信息充分,在实际使用过程中运行良好。二、设计目的与任务1、设计目的:通过本课程设计教学所要求达到的目的是:巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解;能熟练掌握几种基本数据结构的基本操作;能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。能简单的运用HGE引擎创建窗口,更好地实现校园导游咨询功能。2、设计任务:校园导游程序:用窗口界面实现以下功能: (1)景点信息的查询和简介;(2)两景点间路径的查询;(3)增加、删除、更新有关景点和道路的信息。三、设计方案与实施(小三号、黑体、加粗)(一级标题)1、总体设计//写总体的设计思想根据题目要求,程序需要实现校园景点的信息查询和修改。首先使用HGE引擎创建基本的窗口界面,定义一个二维数组(40X40)来表示地图的属性,,然后从文件中加载一张图片并用纹理句柄保存,再创建一个精灵,并绑定一张纹理图片等来将图片设置进窗口界面。再建立更新函数和渲染函数来进行逻辑处理(获取鼠标位置,获取图片的矩形区域,判断一个点是否在矩形中,判断鼠标是否在增加删除选项框内,判断鼠标是否在增加删除选项框内)和显示(背景,颜色,景点名字,景点坐标,景点简介等)在窗口查询中,全是用鼠标来实现景点简介、景点间路径、景点和道路的增加、删除、更新等操作,方便易懂又美观。景点简介的查询是:将鼠标放在景点上就会实现;景点间路径的查询是:用鼠标在已有道路上点出起点和终点,就会自动计算出最短路径并且显示在右边的路径框上;景点和道路的增加、删除、更新:用鼠标点击已有的两个编辑按钮来实现对地图上的修改。2、详细设计(1)HGE的应用HGE*hge=0;//定义一个全局变量:hge引擎指针hgeFont*pFont;hgeSprite*sprite=NULL;//精灵指针:(指向一张图片)HTEXTUREtex=NULL;//纹理句柄(对应一张图片)hgeSprite*sprite_1=NULL;//精灵指针:(指向一张图片)HTEXTUREtex_1=NULL;//纹理句柄(对应一张图片)hgeSprite*sprite_2=NULL;//精灵指针:(指向一张图片)HTEXTUREtex_2=NULL;//纹理句柄(对应一张图片)hgeSprite*sprite_menu=NULL;//精灵指针:开始按钮HTEXTUREtex_menu=NULL;//纹理句柄(开始)hgeSprite*sprite_3=NULL;HTEXTUREtex_3=NULL;hgeSprite*sprite_4=NULL;HTEXTUREtex_4=NULL;hgeSprite*sprite_5=NULL;HTEXTUREtex_5=NULL;hgeSprite*sprite_6=NULL;HTEXTUREtex_6=NULL;GfxFont*g_pGfxFont0=NULL;//中文显示GfxFont*g_pGfxFont1=NULL;//中文显示GfxFont*p_Font=NULL;//创建一个字体指针GfxFont*p_Font_1=NULL;GfxFont*p_Font_2=NULL;floatscaling_1=1.0f;//设置按钮缩放比列floatscaling_2=1.0f;floatscaling_3=1.0f;(2)更新函数(逻辑处理):boolFrameFunc(){ hge->Effect_PlayEx(heffect,20);//播放音效: if(hge->Input_KeyDown(HGEK_ESCAPE))//返回值为true,程序结束:按下ESC键 returntrue; switch(gamestate) { caseStart: if(hge->Input_KeyDown(HGEK_LBUTTON)) { hge->Input_GetMousePos(&mouse_x,&mouse_y);//获取鼠标的位置 sprite_menu->GetBoundingBox(300,100,&rect_menu);//获取图片的矩形区域 if(rect_menu.TestPoint(mouse_x,mouse_y))//判断一个点是否在矩形中 gamestate=Play; } b_state=false; break; casePlay: if(hge->Input_KeyDown(HGEK_LBUTTON)) { if(changestate==Add) { hge->Input_GetMousePos(&mouse_x,&mouse_y); x_1=(int)(mouse_y-100)/16;//16表示图片的高 y_1=(int)(mouse_x-100)/16;//16表示图片的宽 n[x_1][y_1]=1; n1[x_1][y_1]=1; } elseif(changestate==Del) { hge->Input_GetMousePos(&mouse_x,&mouse_y); x_1=(int)(mouse_y-100)/16;//16表示图片的高 y_1=(int)(mouse_x-100)/16;//16表示图片的宽 n[x_1][y_1]=0; n1[x_1][y_1]=0; } hge->Input_GetMousePos(&mouse_x,&mouse_y);//获取鼠标的位置 sprite_5->GetBoundingBox(750,500,&rect_5);//获取图片的矩形区域 sprite_6->GetBoundingBox(750,550,&rect_6); if(rect_5.TestPoint(mouse_x,mouse_y))//判断鼠标是否在增加删除选项框内 { scaling_1=1.2f;; changestate=Add; } elseif(rect_6.TestPoint(mouse_x,mouse_y)) { scaling_2=1.2f; changestate=Del; } } if(hge->Input_KeyUp(HGEK_LBUTTON)) { hge->Input_GetMousePos(&mouse_x,&mouse_y);//获取鼠标的位置 sprite_5->GetBoundingBox(750,500,&rect_5);//获取图片的矩形区域 sprite_6->GetBoundingBox(750,550,&rect_6); if(rect_5.TestPoint(mouse_x,mouse_y))//判断鼠标是否在增加删除选项框内 scaling_1=1.0f; elseif(rect_6.TestPoint(mouse_x,mouse_y)) scaling_2=1.0f; } hge->Input_GetMousePos(&mouse_x,&mouse_y); if(mouse_x>510&&mouse_x<540&&mouse_y>410&&mouse_y<440) IsShow=true; else IsShow=false; if(mouse_x>510&&mouse_x<550&&mouse_y>300&&mouse_y<340) IsShow_1=true; else IsShow_1=false; if(mouse_x>410&&mouse_x<450&&mouse_y>310&&mouse_y<350) IsShow_2=true; else IsShow_2=false; if(mouse_x>225&&mouse_x<265&&mouse_y>130&&mouse_y<170) IsShow_3=true; else IsShow_3=false; if(mouse_x>310&&mouse_x<350&&mouse_y>540&&mouse_y<580) IsShow_4=true; else IsShow_4=false; if(mouse_x>400&&mouse_x<440&&mouse_y>610&&mouse_y<650) IsShow_5=true; else IsShow_5=false; if(mouse_x>315&&mouse_x<355&&mouse_y>430&&mouse_y<470) IsShow_6=true; else IsShow_6=false; if(mouse_x>200&&mouse_x<240&&mouse_y>430&&mouse_y<470) IsShow_7=true; else IsShow_7=false; if(mouse_x>400&&mouse_x<440&&mouse_y>405&&mouse_y<445) IsShow_8=true; else IsShow_8=false; if(mouse_x>645&&mouse_x<685&&mouse_y>380&&mouse_y<420) IsShow_9=true; else IsShow_9=false; if(hge->Input_GetKeyState(HGEK_RBUTTON)&&b_state==false)//判断鼠标左键是否按下,按下开始导游 { b_state=TRUE; hge->Input_GetMousePos(&mouse_x,&mouse_y); end_x=(int)(mouse_y-100)/16;//16表示图片的高 end_y=(int)(mouse_x-100)/16;//16表示图片的宽 } if(hge->Input_GetKeyState(HGEK_SPACE)) { step=0; memcpy(n,n1,sizeof(n)); x=end_x; y=end_y; point*start=(point*)malloc(sizeof(point));//起点 start->x=x; start->y=y; n[x][y]=3; if(x!=1&&y!=1) n[1][1]=0; q.push(start); } if(b_state) { while(!q.empty()){ point*front=q.front(); q.pop();//弹出队头 if(front->x==end_x&&front->y==end_y) { flag=1; //cout<<"成功找到出路."<<"最少需要"<<n[front->x][front->y]-2<<"步。如下所示:"<<endl; n[front->x][front->y]=-6; //cout<<"倒退回去:"<<(front)->x<<","<<(front)->y; point*lastPoint=front; front=front->last; while((front->x!=x)||(front->y!=y)){ //cout<<"->"<<front->x<<","<<front->y; if(lastPoint->x-front->x==1){ n[front->x][front->y]=-1; } elseif(lastPoint->x-front->x==-1){ n[front->x][front->y]=-2; } elseif(lastPoint->y-front->y==1){ n[front->x][front->y]=-3; } else{ n[front->x][front->y]=-4; } lastPoint=front; front=front->last; } //cout<<"->"<<start->x<<","<<start->y<<endl; n[x][y]=-5; break; } else{ for(inti=0;i<4;++i){ point*temp=newpoint; temp->x=front->x+aspect[i][0]; temp->y=front->y+aspect[i][1]; if(temp->x>=0&&temp->x<40&&temp->y>=0&&temp->y<40&&n[temp->x][temp->y]==0){ temp->last=front; q.push(temp); n[temp->x][temp->y]=n[front->x][front->y]+1; } } } } if(!flag); //cout<<"无路可走!"<<endl; else{ b_state=false; for(inti=0;i<40;++i) { for(intj=0;j<40;++j) { if(n[i][j]<0) { n[i][j]=3; step++; } } } } } break; } returnfalse;//返回值是false程序继续}(3)渲染函数(显示)boolRenderFunc(){ hge->Gfx_BeginScene();//通知系统开始绘制 hge->Gfx_Clear(0xFFFFFFFF);//清屏(屏幕的背景颜色,每两位:红、绿、蓝) switch(gamestate)//自己的绘制: { caseStart: sprite_4->Render(0,0); sprite_menu->RenderEx(300,100,0.0f,1.0f,1.0f); break; casePlay: sprite_3->Render(0,0);//绘制背景 sprite_5->RenderEx(795,515,0.0f,scaling_1,scaling_1);//绘制按钮 sprite_6->RenderEx(795,565,0.0f,scaling_2,scaling_2);//绘制按钮 for(inti=0;i<40;++i)//遍历数组的元素并根据其值绘制图形 { for(intj=0;j<40;++j) { switch(n[i][j]) { case0://sprite_1->Render(j*16,i*16); break; case1://第一个参数表示x坐标,第二参数y坐标 sprite->Render(100+j*16,100+i*16); break; case2://第一个参数表示x坐标,第二参数y坐标 sprite_1->Render(100+j*16,100+i*16); break; case3://第一个参数表示x坐标,第二参数y坐标 sprite_2->Render(100+j*16,100+i*16); break; } } } p_Font_2->Render(750,400,L"距离米"); p_Font_2->Print(790,400,"%d",step*10); p_Font_1->Render(200,50,L"湖南人文科技学院导游图"); p_Font->Render(248,150,L"阳\n光\n公\n寓");//设置字体的位置 p_Font->Render(220,450,L"体\n育\n馆");//设置字体的位置 p_Font->Render(335,450,L"田\n径\n场");//设置字体的位置 p_Font->Render(525,425,L"海园广场");//设置字体的位置 p_Font->Render(530,320,L"致远楼");//设置字体的位置 p_Font->Render(430,330,L"图\n书\n馆");//设置字体的位置 p_Font->Render(420,425,L"生活\n服务\n大楼");//设置字体的位置 p_Font->Render(420,630,L"逸\n夫\n楼");//设置字体的位置 p_Font->Render(330,560,L"惠风\n篮球场");//设置字体的位置 p_Font->Render(670,360,L"毓\n师\n园");//设置字体的位置 if(IsShow) { p_Font_2->Render(mouse_x,mouse_y,L"休闲散步的最佳场所"); } if(IsShow_1) { p_Font_2->Render(mouse_x,mouse_y,L"全校最大的一栋综合教学楼,\n各系上课得主要场所"); } if(IsShow_2) { p_Font_2->Render(mouse_x,mouse_y,L"学校的心脏,藏有图书上百万册,\n三楼为咖啡书吧,环境优雅"); } if(IsShow_3) { p_Font_2->Render(mouse_x,mouse_y,L"全校最豪华的学生公寓,共有六栋,\n有标准四人寝和豪华两人寝"); } if(IsShow_4) { p_Font_2->Render(mouse_x,mouse_y,L"全校最大篮球场,挥洒汗水的赛场"); } if(IsShow_5) { p_Font_2->Render(mouse_x,mouse_y,L"学校最具艺术色彩的一栋大楼"); } if(IsShow_6) { p_Font_2->Render(mouse_x,mouse_y,L"现在化塑胶标准报道,人造草坪,\n适宜锻炼身体的场所"); } if(IsShow_7) { p_Font_2->Render(mouse_x,mouse_y,L"举办各种大型比赛和开展大型活动的场所,\n能容纳五千多人"); } if(IsShow_8) { p_Font_2->Render(mouse_x,mouse_y,L"为学生和老师提供生活服务的地方"); } if(IsShow_9) { p_Font_2->Render(mouse_x,mouse_y,L"绿树成荫,幽静小道,适宜读书和休息"); } break; } hge->Gfx_EndScene();//通知系统结束绘制 returnfalse;}(4)主函数(入口函数)intWINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int){ hge=hgeCreate(HGE_VERSION);//hge指针赋值。 hge->System_SetState(HGE_FRAMEFUNC,FrameFunc);//设置自己的更新函数//第二个参数是函数的名字 hge->System_SetState(HGE_RENDERFUNC,RenderFunc);//设置自己的渲染函数.第二个参数是函数的名字 hge->System_SetState(HGE_TITLE,"校园导游系统");//设置窗口标题.第二个参数标题名 hge->System_SetState(HGE_WINDOWED,true);//设置窗口模式,true为窗口模式,false全屏 hge->System_SetState(HGE_SCREENWIDTH,900);//设置窗口宽和高 hge->System_SetState(HGE_SCREENHEIGHT,800); hge->System_SetState(HGE_FPS,60);//设置窗口的刷新率(每一秒钟渲染的次数) hge->System_SetState(HGE_HIDEMOUSE,false);//是否隐藏鼠标 hge->System_SetState(HGE_USESOUND,true);//设置是否开启声音 //系统初始化 if(hge->System_Initiate()) { p_Font=newGfxFont("宋体",20);//20表示字体大小 p_Font->SetColor(0xff000000);//设置颜色 p_Font_1=newGfxFont("华文行楷",40); p_Font_1->SetColor(0xff000000); p_Font_2=newGfxFont("楷体",20); p_Font_2->SetColor(0xffff0000); //自己的初始化: //从文件中加载一张图片并用纹理句柄保存 tex_3=hge->Texture_Load("wall.jpg"); sprite_3=newhgeSprite(tex_3,0,0,900,800); tex=hge->Texture_Load("blue.png"); sprite=newhgeSprite(tex,0,0,16,16);//创建一个精灵,并绑定一张纹理图片,蓝色 tex_1=hge->Texture_Load("yellow.png");//从文件中加载一张图片并用纹理句柄保存 sprite_1=newhgeSprite(tex_1,0,0,16,16);//创建一个精灵,并绑定一张纹理图片 tex_5=hge->Texture_Load("delete.jpg"); sprite_5=newhgeSprite(tex_5,0,0,90,30); sprite_5->SetHotSpot(45,15); tex_6=hge->Texture_Load("add.jpg"); sprite_6=newhgeSprite(tex_6,0,0,90,30); sprite_6->SetHotSpot(45,15); tex_4=hge->Texture_Load("school.jpg");//从文件中加载一张图片并用纹理句柄保存 sprite_4=newhgeSprite(tex_4,0,0,900,800);//创建一个精灵,并绑定一张纹理图片 tex_2=hge->Texture_Load("red.png");//从文件中加载一张图片并用纹理句柄保存 sprite_2=newhgeSprite(tex_2,0,0,16,16);//创建一个精灵,并绑定一张纹理图片 tex_menu=hge->Texture_Load("start.jpg");//从文件中加载一张图片并用纹理句柄保存 sprite_menu=newhgeSprite(tex_menu,0,0,260,80);//创建一个精灵,并绑定一张纹理图片 heffect_1=hge->Effect_Load("button.mp3"); memcpy(n1,n,sizeof(n)); point*start=(point*)malloc(sizeof(point));//起点 start->x=x; start->y=y; n[x][y]=3; q.push(start); //启动系统: hge->System_Start(); } else { MessageBoxA(NULL,hge->System_GetErrorMessage(),"Error",MB_OK|MB_ICONERROR|MB_APPLMODAL); } //程序结束时,资源的释放: //系统关闭和hge指针的释放 hge->System_Shutdown(); hge->Release(); return0;}3、程序调试与体会//对整个程序在高度过程中的一些体会(二级标题程序经过调试完成了对景点简介信息,景点之间的路径的查询以及对景点信息的增加,删除和更新。本次程序设计是对全学期数据结构课程学习的一次实践,通过亲自编写编译调试程序,逐步掌握了编程方法。也说明了一个深刻道理,知识只有在实践中才能充分理解并运用。从传统的被动接受变为主动探索,起初不是很适应,什么也不懂,茫然无措。渐渐地开始自己编写时候,发现了其中之乐趣。我相信,这样的学习坚持到底,必将有所成就。设计过程需要查找各种资料,在百度等搜索工具与指导老师的帮助下,在自己理解的基础上参照方法写出属于自己的程序。虽然过程中出现多次程序报错,在同学的指导和老师的帮助下顺利完成,值得为之欣喜。其中编程过程中显露出来的问题也必须引起高度重视,在今后的学习中必当万分注意绝不再犯。比如细心问题,有次的一个小小的“取地址符”没有添加,导致整个程序无法运行,检查了好久才发现。所以说,编程是个细活,只有严谨的态度,细心的思路以及良好的学习习惯,最终才能收获成功的喜悦。最后感谢在编程过程中给予充分帮助的老师和同学们,这又使我认识到团队力量的强大作用。加强团队协作也是今后程序设计道路上的必备能力。4、运行结果四、结论经过这次课程设计,我对程序中算法的概念理解的更加透彻。算法是程序中必不可少的部分,它是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。同时,在选择算法时必须考虑算法的时间复杂度和空间复杂度,这样才能让程序正常高效的运行。在这次的课程设计中,我们认识到了我们的不足和知识的广阔。使我们对我们课本的知识有了新的理解,让我们对C语言,C++和数据结构的理解更深,把我们学到的知识串通起来。对于校园导游咨询系统,让我们把平时古板的知识用在了现实的社会实践中,对我们学习新的知识有了巨大的帮助,提高了我们的积极性。对我们把学到的知识用在生活中起到了作用,打到学以致用。通过这次课程设计,我们学到了很多,有专业的知识,有分析的方法;有新的认识(HGE引擎),有学习的方向;有知识的充实,有心灵的升华。实践是检验真理的唯一方法。。五、参考文献[1]《数据结构》(C语言版)严蔚敏清华大学出版社[2]《数据结构课程设计》舒仕华机械工业出版社六、附录(源代码)#include"hge.h"#include<hgesprite.h>#include<queue>#include<list>#include<iostream>#include<string.h>#include"gfxFont.h"#include<hgefont.h>usingnamespacestd;boolIsShow=false;boolIsShow_1=false;//判断是否显示boolIsShow_2=false;boolIsShow_3=false;boolIsShow_4=false;boolIsShow_5=false;boolIsShow_6=false;boolIsShow_7=false;boolIsShow_8=false;boolIsShow_9=false;enumChangeState{Del,Add,Usl};ChangeStatechangestate=Usl;HGE*hge=0;//定义一个全局变量:hge引擎指针hgeFont*pFont;hgeSprite*sprite=NULL;//精灵指针:(指向一张图片)HTEXTUREtex=NULL;//纹理句柄(对应一张图片)hgeSprite*sprite_1=NULL;//精灵指针:(指向一张图片)HTEXTUREtex_1=NULL;//纹理句柄(对应一张图片)hgeSprite*sprite_2=NULL;//精灵指针:(指向一张图片)HTEXTUREtex_2=NULL;//纹理句柄(对应一张图片)hgeSprite*sprite_menu=NULL;//精灵指针:开始按钮HTEXTUREtex_menu=NULL;//纹理句柄(开始)hgeSprite*sprite_3=NULL;HTEXTUREtex_3=NULL;hgeSprite*sprite_4=NULL;HTEXTUREtex_4=NULL;hgeSprite*sprite_5=NULL;HTEXTUREtex_5=NULL;hgeSprite*sprite_6=NULL;HTEXTUREtex_6=NULL;GfxFont*g_pGfxFont0=NULL;//中文显示GfxFont*g_pGfxFont1=NULL;//中文显示GfxFont*p_Font=NULL;//创建一个字体指针GfxFont*p_Font_1=NULL;GfxFont*p_Font_2=NULL;floatscaling_1=1.0f;//设置按钮缩放比列floatscaling_2=1.0f;floatscaling_3=1.0f;//定义一个二维数组:表示地图的属性intn1[40][40]={0};intn[40][40]={ {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,2,2,2,2,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,0,2,2,2,2,2,2,0,1,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,2,2,2,0,1,0,2,2,2,2,2,2,0,1,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,2,2,2,0,1,0,2,2,2,2,2,2,0,1,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,2,2,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,2,2,2,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,2,2,2,2,1,1,1,0,2,2,2,1,1}, {1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,2,2,2,2,2,2,1,1,0,2,2,2,1,1}, {1,1,1,1,1,0,2,2,2,2,0,1,1,0,2,2,2,1,0,1,2,2,2,0,1,1,2,2,2,2,2,2,0,0,0,2,2,2,1,1}, {1,1,1,1,1,0,2,2,2,2,0,1,1,0,2,2,2,1,0,1,2,2,2,0,1,1,2,2,2,2,2,2,1,1,0,2,2,2,1,1}, {1,1,1,1,1,0,2,2,2,2,0,1,1,0,2,2,2,1,0,1,2,2,2,0,1,1,2,2,2,2,2,2,1,1,0,1,1,1,1,1}, {1,1,1,1,1,0,2,2,2,2,0,1,1,0,2,2,2,1,0,1,2,2,2,0,1,1,1,2,2,2,2,1,1,1,0,1,1,1,1,1}, {1,1,1,1,1,0,2,2,2,2,0,1,1,0,2,2,2,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1}, {1,1,1,1,1,0,2,2,2,2,0,1,1,0,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1}, {1,1,1,1,1,0,2,2,2,2,0,1,1,0,2,2,2,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},};//表示玩家位置(对应的数组下标)intx=5,y=18;//表示起始位置intend_x=3,end_y=4;//结束的位置。intx_1=0,y_1=0;//表示开始的状态:boolb_state=false;structpoint{ intx; inty; point*last;//上一步的坐标};//空队列queue<point*>q;HEFFECTheffect;//音效的句柄.HEFFECTheffect_1;//音效的句柄.boolb_Find=false;//判断是否已经找到路径.boolb_dontFind=false;intaspect[4][2]={{0,-1},{0,1},{-1,0},{1,0}};//转向:上下左右intflag=0;//是否有路可走的标志floatmouse_x,mouse_y;//鼠标的位置enumGameState{Start,Play};GameStategamestate=Start;hgeRectrect_menu;hgeRectrect_5;hgeRectrect_6;intstep=0;//更新函数(逻辑处理):boolFrameFunc(){ hge->Effect_PlayEx(heffect,20);//播放音效: if(hge->Input_KeyDown(HGEK_ESCAPE))//返回值为true,程序结束:按下ESC键 returntrue; switch(gamestate) { caseStart: if(hge->Input_KeyDown(HGEK_LBUTTON)) { hge->Input_GetMousePos(&mouse_x,&mouse_y);//获取鼠标的位置 sprite_menu->GetBoundingBox(300,100,&rect_menu);//获取图片的矩形区域 if(rect_menu.TestPoint(mouse_x,mouse_y))//判断一个点是否在矩形中 gamestate=Play; } b_state=false; break; casePlay: if(hge->Input_KeyDown(HGEK_LBUTTON)) { if(changestate==Add) { hge->Input_GetMousePos(&mouse_x,&mouse_y); x_1=(int)(mouse_y-100)/16;//16表示图片的高 y_1=(int)(mouse_x-100)/16;//16表示图片的宽 n[x_1][y_1]=1; n1[x_1][y_1]=1; } elseif(changestate==Del) { hge->Input_GetMousePos(&mouse_x,&mouse_y); x_1=(int)(mouse_y-100)/16;//16表示图片的高 y_1=(int)(mouse_x-100)/16;//16表示图片的宽 n[x_1][y_1]=0; n1[x_1][y_1]=0; } hge->Input_GetMousePos(&mouse_x,&mouse_y);//获取鼠标的位置 sprite_5->GetBoundingBox(750,500,&rect_5);//获取图片的矩形区域 sprite_6->GetBoundingBox(750,550,&rect_6); if(rect_5.TestPoint(mouse_x,mouse_y))//判断鼠标是否在增加删除选项框内 { scaling_1=1.2f;; changestate=Add; } elseif(rect_6.TestPoint(mouse_x,mouse_y)) { scaling_2=1.2f; changestate=Del; } } if(hge->Input_KeyUp(HGEK_LBUTTON)) { hge->Input_GetMousePos(&mouse_x,&mouse_y);//获取鼠标的位置 sprite_5->GetBoundingBox(750,500,&rect_5);//获取图片的矩形区域 sprite_6->GetBoundingBox(750,550,&rect_6); if(rect_5.TestPoint(mouse_x,mouse_y))//判断鼠标是否在增加删除选项框内 scaling_1=1.0f; elseif(rect_6.TestPoint(mouse_x,mouse_y)) scaling_2=1.0f; } hge->Input_GetMousePos(&mouse_x,&mouse_y); if(mouse_x>510&&mouse_x<540&&mouse_y>410&&mouse_y<440) IsShow=true; else IsShow=false; if(mouse_x>510&&mouse_x<550&&mouse_y>300&&mouse_y<340) IsShow_1=true; else IsShow_1=false; if(mouse_x>410&&mouse_x<450&&mouse_y>310&&mouse_y<350) IsShow_2=true; else IsShow_2=false; if(mouse_x>225&&mouse_x<265&&mouse_y>130&&mouse_y<170) IsShow_3=true; else IsShow_3=false; if(mouse_x>310&&mouse_x<350&&mouse_y>540&&mouse_y<580) IsShow_4=true; else IsShow_4=false; if(mouse_x>400&&mouse_x<440&&mouse_y>610&&mouse_y<650) IsShow_5=true; else IsShow_5=false; if(mouse_x>315&&mouse_x<355&&mouse_y>430&&mouse_y<470) IsShow_6=true; else IsShow_6=false; if(mouse_x>200&&mouse_x<240&&mouse_y>430&&mouse_y<470) IsShow_7=true; else IsShow_7=false; if(mouse_x>400&&mouse_x<440&&mouse_y>405&&mouse_y<445) IsShow_8=true; else IsShow_8=false; if(mouse_x>645&&mouse_x<685&&mouse_y>380&&mouse_y<420) IsShow_9=true; else IsShow_9=false; if(hge->Input_GetKeyState(HGEK_RBUTTON)&&b_state==false)//判断鼠标左键是否按下,按下开始导游 { b_state=TRUE; hge->Input_GetMousePos(&mouse_x,&mouse_y); end_x=(int)(mouse_y-100)/16;//16表示图片的高 end_y=(int)(mouse_x-100)/16;//16表示图片的宽 } if(hge->Input_GetKeyState(HGEK_SPACE)) { step=0; memcpy(n,n1,sizeof(n)); x=end_x; y=end_y; point*start=(point*)malloc(sizeof(point));//起点 start->x=x; start->y=y; n[x][y]=3; if(x!=1&&y!=1) n[1][1]=0; q.push(start); } if(b_state) { while(!q.empty()){ point*front=q.front(); q.pop();//弹出队头 if(front->x==end_x&&front->y==end_y) { flag=1; //cout<<"成功找到出路."<<"最少需要"<<n[front->x][front->y]-2<<"步。如下所示:"<<endl; n[front->x][front->y]=-6; //cout<<"倒退回去:"<<(front)->x<<","<<(front)->y; point*lastPoint=front; front=front->last; while((front->x!=x)||(front->y!=y)){ //cout<<"->"<<front->x<<","<<front->y; if(lastPoint->x-front->x==1){ n[front->x][front->y]=-1; } elseif(lastPoint->x-front->x==-1){ n[front->x][front->y]=-2; } elseif(lastPoint->y-front->y==1){ n[front->x][front->y]=-3; } else{ n[front->x][front->y]=-4; } lastPoint=front; front=front->last; } //cout<<"->"<<start->x<<","<<start->y<<endl; n[x][y]=-5; break; } else{ for(inti=0;i<4;++i){ point*temp=newpoint; temp->x=front->x+aspect[i][0]; temp->y=front->y+aspect[i][1]; if(temp->x>=0&&temp->x<40&&temp->y>=0&&temp->y<40&&n[temp->x][temp->y]==0){ temp->last=front; q.push(temp); n[temp->x][temp->y]=n[front->x][front->y]+1; } } } } if(!flag); //cout<<"无路可走!"<<endl; else{ b_state=false; for(inti=0;i<40;++i) { for(intj=0;j<40;++j) { if(n[i][j]<0) { n[i][j]=3; step++; } } } } } break; } returnfalse;//返回值是false程序继续}//渲染函数(显示)boolRenderFunc(){ hge->Gfx_BeginScene();//通知系统开始绘制 hge->Gfx_Clear(0xFFFFFFFF);//清屏(屏幕的背景颜色,每两位:红、绿、蓝) switch(gamestate)//自己的绘制: { caseStart: sprite_4->Render(0,0); sprite_menu->RenderEx(300,100,0.0f,1.0f,1.0f); break; casePlay: sprite_3->Render(0,0);//绘制背景 sprite_5->RenderEx(795,515,0.0f,scaling_1,scaling_1);//绘制按钮 sprite_6->RenderEx(795,565,0.0f,scaling_2,scaling_2);//绘制按钮 for(inti=0;i<40;++i)//遍历数组的元素并根据其值绘制图形 { for(intj=0;j<40;++j) { switch(n[i][j]) { case0://sprite_1->Render(j*16,i*16); break; case1://第一个参数表示x坐标,第二参数y坐标 sprite->Render(100+j*16,100+i*16); break; case2://第一个参数表示x坐标,第二参数y坐标 sprite_1->Render(100+j*16,100+i*16); break; case3://第一个参数表示x坐标,第二参数y坐标 sprite_2->Render(100+j*16,100+i*16); break; } } } p_Font_2->Render(750,400,L"距离米"); p_Font_2->Print(790,400,"%d",step*10); p_Font_1->Render(200,50,L"湖南人文科技学院导游图"); p_Font->Render(248,150,L"阳\n光\n公\n寓");//设置字体的位置 p_Font->Render(220,450,L"体\n育\n馆");//设置字体的位置 p_Font->Render(335,450,L"田\n径\n场");//设置字体的位置 p_Font->Render(525,425,L"海园广场");//设置字体的位置 p_Font->Render(530,320,L"致远楼");//设置字体的位置 p_Font->Render(430,330,L"图\n书\n馆");//设置字体的位置 p_Font->Render(420,425,L"生活\n服务\n大楼");//设置字体的位置 p_Font->Render(420,630,L"逸\n夫\n楼");//设置字体的位置 p_Font->Render(330,560,L"惠风\n篮球场");//设置字体的位置 p_Font->Render(665,400,L"毓\n师\n园");//设置字体的位置 if(IsShow) { p_Font_2->Render(mouse_x,mouse_y,L"休闲散步的最佳场所"); } if(IsShow_1) { p_Font_2->Render(mouse_x,mouse_y,L"全校最大的一栋综合教学楼,\n各系上课得主要场所"); } if(IsShow_2) { p_Font_2->Render(mouse_x,mouse_y,L"学校的心脏,藏有图书上百万册,\n三楼为咖啡书吧,环境优雅"); } if(IsShow_3) { p_Font_2->Render(mouse_x,mouse_y,L"全校最豪华的学生公寓,共有六栋,\n有标准四人寝和豪华两人寝"); } if(IsShow_4) { p_Font_2->Render(mouse_x,mouse_y,L"全校最大篮球场,挥洒汗水的赛场"); } if(IsShow_5) { p_Font_2->Render(mouse_x,mouse_y,L"学校最具艺术色彩的一栋大楼"); } if(IsShow_6) { p_Font_2->Render(mouse_x,mouse_y,L"现在化塑胶标准报道,人造草坪,\n适宜锻炼身体的场所"); } if(IsShow_7) { p_Font_2->Render(mouse_x,mouse_y,L"举办各种大型比赛和开展大型活动的场所,\n能容纳五千多人"); } if(IsShow_8) { p_Font_2->Render(mouse_x,mouse_y,L"为学生和老师提供生活服务的地方"); } if(IsShow_9) { p_Font_2->Render(mouse_x,mouse_y,L"绿树成荫,幽静小道,适宜读书和休息"); } break; } hge->Gfx_EndScene();//通知系统结束绘制 returnfalse;}//主函数(入口函数)intWINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int){ hge=hgeCreate(HGE_VERSION);//hge指针赋值。 hge->System_SetState(HGE_FRAMEFUNC,FrameFunc);//设置自己的更新函数//第二个参数是函数的名字 hge->System_SetState(HGE_RENDERFUNC,RenderFunc);//设置自己的渲染函数.第二个参数是函数的名字 hge->System_SetState(HGE_TITLE,"校园导游系统");//设置窗口标题.第二个参数标题名 hge->System_SetState(HGE_WINDOWED,true);//设置窗口模式,true为窗口模式,false全屏 hge->System_SetState(HGE_SCREENWIDTH,900);//设置窗口宽和高 hge->System_SetState(HGE_SCREENHEIGHT,800); hge->System_SetState(HGE_FPS,60);//设置窗口的刷新率(每一秒钟渲染的次数) hge->System_SetState(HGE_HIDEMOUSE,false);//是否隐藏鼠标 hge->System_SetSta
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中考物理复习主题单元8第19课时合理利用机械能小粒子与大宇宙课件
- 主播 课件教学课件
- 小学数学新人教版一年级下册20以内口算练习题大全
- 《两只小象》教学设计教学设计 教案
- 智能家居电气设施安装合同
- 幼儿园智能照明系统招投标攻略
- 展会设备租赁合同
- 幼儿园园长聘用合同范本
- 建筑公司员工意见箱管理准则
- 石油提炼班组安全作业规范
- 《认识平行四边形 》(教案)-2024-2025学年四年级上册数学人教版
- 广东省2024-2025学年高三上学期9月份联考英语试卷
- 研究生学术表达能力培养智慧树知到答案2024年西安建筑科技大学、清华大学、同济大学、山东大学、河北工程大学、《环境工程》英文版和《环境工程》编辑部
- 湖北省2023-2024学年七年级上学期语文期中考试试卷(含答案)
- 第六单元测试卷(单元卷)-2024-2025学年六年级上册统编版语文
- 人教版(2024)2024-2025学年七年级数学上册期中质量评价(含答案)
- 单元统整视域下的小学英语课内外融合教学探析
- 合伙协议书四人范本
- 2024年新人教版七年级上册数学全册大单元整体设计教案
- 2024-2025学年七年级英语上册第一学期 期中综合模拟考试卷(沪教版)
- 高中数学大单元教学设计案例研究
评论
0/150
提交评论