连连看C语言毕业课程设计报告.docx
- 文档编号:1939449
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:20
- 大小:23.69KB
连连看C语言毕业课程设计报告.docx
《连连看C语言毕业课程设计报告.docx》由会员分享,可在线阅读,更多相关《连连看C语言毕业课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
连连看C语言毕业课程设计报告
目录
问题描述
连连看是一款简单有趣的小游戏,曾经风靡一时,玩家要将相同的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手,游戏速度节奏快,画面清晰可爱,适合细心的玩家。
游戏胜利条件的判定:
将棋盘上面的格子全部消除掉;失败的判定:
规定的时间内格子没有消除。
问题分析
连连看需要解决的问题包括:
•
(1)整个游戏界面和各种图案的图形显示;
•
(2)如何判断鼠标所点的两个图像能否相消;
•(3)如何判断是否消除完全;
•(4)如何判断游戏的结束及如何终止游戏;
•(5)游戏难度的设计和得分规则
游戏总的流程可以描述如下:
首先出现游戏界面,一幅由10*6的小图片的构成的画面,玩家需要点击2个相同图案的对子,其连接线不多于3根直线,也就是说连接相同图案时,直线只能有两个折点,就可以成功将对子消除。
此外,需要重点考虑的是游戏面板和各种形状的方块的数据结构表示。
格子面板可以用一个二维数组来表示。
1、开发工具的介绍
【VS2008】
VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。
使用VisualStudio2008可以高效开发Windows应用程序。
设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。
同时VisualStudio2008支持项目模板、调试器和部署程序。
VisualStudio2008可以高效开发Web应用,集成了AJAX1.0,包含AJAX项目模板,它还可以高效开发Office应用和Mobile应用。
VS的开发界面分为两个版本:
整合模式和孤立模式,分别对基于语言的开发和基于特别工具的开发作了优化。
【EasyX】
EasyX是针对C++的图形库,可以帮助C语言初学者快速上手图形和游戏编程。
许多学编程的都是从C语言开始入门的,而目前的现状是:
1.有些学校以TurboC为环境讲C语言,只是TurboC的环境实在太老了,复制粘贴都很不方便。
2.有些学校直接拿VC来讲C语言,因为VC的编辑和调试环境都很优秀,并且VC有适合教学的免费版本。
可惜在VC下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
初学编程想要绘图就得用TC,很是无奈。
3.还有计算机图形学,这门课程的重点是绘图算法,而不是Windows编程。
所以,许多老师不得不用TC教学,因为Windows绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
所以,于是就有了EasyX库方便的开发平台和TC简单的绘图功能。
2、设计
【程序总体结构】:
【界面设计】:
界面的设计通过插入背景图片beijing.bmp,在对每一个格子的赋图片,通过getimage()从board.bmp中截下所需要的图,再利用putimage()放置每一个小图。
具体算法:
loadimage(&beijing,"D:
\\llk\\beijing.bmp");//载入背景图
putimage(0,0,&beijing);//放置背景图
for(inti=0;i for(intj=0;j { idy=i*54+board_Y,idx=j*48+board_X; putimage(idx,idy,&image[board[i+1][j+1]]);//根据赋的值放置每一个格子图 } beijing.bmp board.bmp 【重要数据的数据结构设计】: structBOARD//点击的格子信息 { inttx,ty;//格子坐标 intxx,yy;//屏幕坐标 intdata;//图片类型 }; 定义BOARD型的结构体,里面包含的是鼠标点击以后,所读取的点击点在屏幕里的坐标(xx,yy) 在二维数组里的坐标board[tx][ty],以及在给每一个二维数组元素赋的值data(用来判断两个格子是否相等,相等以后赋值为0,以便判断是否存在格子,为之后的寻找路径铺垫) intboard[ROW+2][COL+2]; 二维数组,用来记录格子的信息,其值是判定是否有方块的标志。 MOUSEMSGmouse; 鼠标的记录类型structMOUSEMSG { UINTuMsg;//当前鼠标消息 boolmkCtrl;//Ctrl键是否按下 boolmkShift;//Shift键是否按下 boolmkLButton;//鼠标左键是否按下 boolmkMButton;//鼠标中键是否按下 boolmkRButton;//鼠标右键是否按下 intx;//当前鼠标x坐标(物理坐标) inty;//当前鼠标y坐标(物理坐标) intwheel;//鼠标滚轮滚动值 }; #defineboard_X140//格子区距左边框距离 #defineboard_Y140//格子呢区距上边框距离 #defineCOL10//格子区列数 #defineROW6//格子区行数 #defineboard_number15//游戏图片数目 【函数设计】: 函数的功能列表: voidInit();//初始化界面 voidload_picture();//加载图片 voiddel(BOARD&rec);//每个格子赋值为 voidleftbottondown(MOUSEMSGmouse);//实现鼠标左击效果 voidframe(intleftx,intlefty);//画边框 booljudge_mouse(intleftx,intlefty);//判断鼠标是否在游戏区 voidselect(intleftx,intlefty);//显示选中效果 voidaccurate(int&leftx,int&lefty);//使格子的坐标都在边缘 voidcover(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);//覆盖直线 voidline(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);//用直线连接 voidexchange(BOARD&pre,BOARD&cur);//交换格子信息 boolclick(intmousex,intmousey);//判断单击是否有效 voidrecord(intleftx,intlefty,BOARD&rec);//记录选中的格子 voidmouse_to_board(intmousex,intmousey,int*idx,int*idy);//鼠标的坐标转为格子的数组下标 intfindpath(BOARD&pre,BOARD&cur);//寻找路径,判断是否相等 voidprogressbar();//画进度条 voidupdateprogressbar(longt);//更新进度条 因为有许多的函数是执行图像处理以及坐标转化的简单操作,这里画出包含关键算法的主要函数的流程图,其他的函数只做文字的描述介绍。 findpath(BOARD&pre,BOARD&cur)函数 cover(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4)函数 Init()函数 load_picture()函数: 这是一个类似于初始图片的函数,利用loadimage,SetWorkingImage,对含有格子图片信息的图进行分割读取,并存入image[]的IMAGE类型的数组里,同时还读入了填充背景的图(填充线条)。 del(BOARD&rec)函数: 删除函数,将之前记录的鼠标信息全部赋值为0; leftbottondown(MOUSEMSGmouse)函数: 记录鼠标的信息,如果鼠标是第一次点击的话,将其信息存入pre里,如果鼠标是第二次点击的话,将其存入cur里,通过findpath()函数来相消与否,如果能相消,则将鼠标点的两块区域覆盖,同时调用del函数,来清除信息,在此过程中,根据统计剩余格子对数的变量counter,来给出分数(用s[]数组来存储分数信息,并在相应位置输出)。 frame(intleftx,intlefty)函数: 根据导入的参数画一个格子边框。 judge_mouse(intleftx,intlefty)函数: 判断鼠标的点击区域是否在规定的范围里。 select(intleftx,intlefty)函数: 在鼠标点击选择以后,显示frame的效果,并记录数据。 accurate(int&leftx,int&lefty)函数: 规范坐标的函数,鼠标点击的区域是在一个范围内的,此函数能把属于一个区域的坐标归整为统一的坐标。 line(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4)函数: 连线函数,通过导入的点的坐标来调用moveto,lineto函数画线。 exchange(BOARD&pre,BOARD&cur)函数: 交换格子信息的函数,在点击2次后,发现两个格子并不能相消后,将pre取第二次点击的格子信息。 click(intmousex,intmousey)函数: 判断点击的地方是不是有效,即已经被消去的格子,点击时,没有像有格子的地方一样会出现线框的情况。 record(intleftx,intlefty,BOARD&rec)函数: 将鼠标的屏幕坐标转化并记录在BOARD类型的变量里。 mouse_to_board(intmousex,intmousey,int*idx,int*idy)函数: 将鼠标的坐标转化为格子信息。 progressbar()函数: 画进度条,作矩形,并填充相应颜色。 updateprogressbar(longt)函数: 进度条的更新函数,读取当前系统时间与游戏开始时系统时间的差,来画图覆盖进度条,从而达到进度条运动的效果。 【程序运行整体视图】 3、源程序 #include #include #include #include #include #include #pragmacomment(lib,"WINMM.LIB")//播放音乐用的库 #defineture1 #defineflase0 #defineboard_X140//格子区距左边框距离 #defineboard_Y140//格子呢区距上边框距离 #defineCOL10//格子区列数 #defineROW6//格子区行数 #defineboard_number15//游戏图片数目 #defineW48//格子的长 #defineH54//格
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 连连 语言 毕业 课程设计 报告