扫雷课程设计报告.docx
《扫雷课程设计报告.docx》由会员分享,可在线阅读,更多相关《扫雷课程设计报告.docx(57页珍藏版)》请在冰豆网上搜索。
扫雷课程设计报告
计算机学院计算机科学与技术专业
《程序设计综合课程设计》报告
(20010/2011学年第一学期)
学生姓名:
学生班级:
学生学号:
指导教师:
2011年 1月 8 日
第一章课程设计目的和要求
1.1程序设计目的
1.通过本课程设计,可以培养独立思考,综合运用所学知识的能力,能更好的巩固课程所学的内容,掌握工程软件设计的基本方法,强化上机编辑能力,闯过理论与实践结合的难关,更加了解c语言的好处和其可能性。
2.通过课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力,为后续各门计算机课程的学习和毕业设计打下基础。
3.上机实验目的,绝不仅是为了验证教材和讲课的内容,或者验证自己所编的程序正确与否。
学习程序设计,上机实验的目的是:
(1)加深对讲授内容的理解,尤其是一些语法和规定,光靠课堂讲授,既枯燥无味又难以记住,但他们是很重要的,初学者的程序出错往往错在语法上。
通过多次上机,就能自然的,熟悉的掌握。
通过上机来掌握语法规则是行之有效地方法。
(2)熟悉所用的计算机系统的操作方法,也就是了解和熟悉c++程序开发的环境。
一个程序必须在一定的外部环境下才能运行,所谓“环境”就是指所用的计算机系统的硬件和软件条件,或者说是工作平台。
使用者应该了解运行一个c++程序需要哪些必要的外部条件(例如硬件配置,软件配置),可以利用哪些系统的功能来帮助自己开发程序。
每一种计算机系统的功能和操作方法都是不完全相同的,但只要熟练掌握一两种计算机系统的使用,再遇到其它系统时便会触类旁通,很快的学会。
(3)学会上机调试。
也就是善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确的运行。
经验丰富的人,在编译连接过程中出现“出错信息”时,一般能很快的判断出出错的原因所在,并改正之。
而缺乏经验的人即使在明确知道“出错提示”下也很难找出错误。
调试程序的能力是每个程序设计者应该掌握的一项基本功能。
1.2程序设计要求
1.查阅相关资料,自学具体课程中涉及到的新知识。
例如查阅谭浩强的C程序设计题解来编译代码
2.采用结构化,模块化程序设计方法设计,功能要完善,界面完美。
此部分的实现在如鹏论坛网上进行了查阅。
3.扫雷游戏分为初级、中级和高级三个级别,扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。
单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。
4.选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。
5.用户要揭开某个方块,可单击它。
6.如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
7.扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。
1.3.软件系统概述
1.3.1开发的软件系统的题目:
扫雷游戏。
1.3.2运行环境:
WIN-TC.此运行环境里超级工具集自身就带点阵字模工具。
1.3.3功能:
我们的游戏可以玩扫雷。
1.3.4特点:
此游戏具有登录系统,可输入密码确保安全性,界面美观具有标题栏,菜单,难度选择,排行榜,游戏成功和失败都有不同的音乐和动画。
第二章程序设计任务内容
程序设计任务
1.程用户可以自定义级别并且可以任意输入雷数;
2.具有计时功能,即显示用户完成移动盘子所花费的时间;
3.用户可以选择是否有音效;
4.自动保存扫雷英雄榜;
基础上设计出符合自己所学要求范围内的程序。
2.2程序设计内容
(1)扫雷游戏首先是动画和音乐,音乐为真心英雄,接下来是进入登陆界面,首先是输入密码,密码是abc(可以改成任意9个字符),有三次输入机会,输入正确时继续输入姓名,输入错误密码时退出该系统,
(2)进入游戏界面,开始功能选择,有“菜单”“难度选择”和“排行榜”,菜单可以进行“开始”和“退出”功能选择,难度选择中有“易”“中”“难”三个选择。
(3)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。
(4)用户要揭开某个方块,可单击它。
若所揭方块下有泪,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。
(5)如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。
用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。
(6)扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。
(7)用户可以选择标记疑问的方块,用可以勾选游戏菜单下的标记(或者用快捷键alt+G然后M)即可,此时双击右键并可出现“?
”标记。
另有颜色选项,当用户勾选此项时,游戏将以最低图像像素来显示。
(8)如果用户需要即使提示声,并可选中声音选项,此时将听到计时的卡塔声。
当用户点中雷时,将有爆炸声产生,胜利时,将有凯旋的旋律播放,此时企鹅出现欢悦表情。
第三章详细设计说明
3.1模块描述
(1)首先是动画和音乐,音乐为真心英雄,接下来是进入登陆界面,首先是输入密码,密码是abc(可以改成任意9个字符),有三次输入机会,输入正确时继续输入姓名,输入错误密码时退出该系统,
(2)进入游戏界面,开始功能选择,有“菜单”“难度选择”和“排行榜”,菜单可以进行“开始”和“退出”功能选择,难度选择中有“易”“中”“难”三个选择。
(3)unionREGSinregs,outregs,regs2;//执行intr_num号中断,用户定义的寄存器值存于结构inregs,执行完后将返回的寄存器值存于结构outregs中。
扫雷棋盘的布局设计
系统的整体布局为:
采用了菜单、按钮、面板…等组件,菜单主要包括开始,选择级别,标记,扫雷英雄榜,退出,按钮的功能是重新开始新的游戏。
雷区的设计
1.根据参数提供的数据设置雷区的宽度、高度、雷的数目以及雷区的级别。
2.当用鼠标左键单击方块上的按钮后,若该方块下有雷,将使用户输掉本局,若该方块下无雷,将显示标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。
3.inquireWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让对话框可见。
所谓扫雷成功是指不仅找到了全部的雷而且用时最少。
音效的设计
music是通过构造音效声音方法,在主类中,通过监视是否已开始游戏,来决定播放计时声,之后又通过监视是否踩到雷和是否完成来决定,播放相应的音乐。
排行榜设计
,当用户选择查看“英雄榜”菜单项时,提供了查看扫雷的最好成绩的界面。
3.2性能
1.第一部分主要是游戏动画和音乐,愉悦玩者的心情。
2.第二部分吧是密码登录系统。
使游戏具有安全性。
3.然后进入正式的游戏,
4.等级选择是,单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。
5.扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。
3.3输入项
本程序的输入项有
voiddeng_lu()//此函数为登陆界面函数,在开始音乐动画结束后出现,输入密码为abc
,有三次输入机会,输入正确时继续输入姓名,输入错误密码时退出该系统
3.4输出项
seviewport(0,0,619,429,0);//为图形输出设置当前窗口
Setviewport(0,0,619,429,0);/*为图形输出设置当前视口*/
Settextstyle(0,0,3,);/*为图形输出设置当前当前的文本属性横向和竖向,0为横向排列,1为竖向排列。
Size为字体大小:
可用interger做参数*/
outtextxy(118,178,welcometoplay”)//输出welcometoplay
。
3.5流程逻辑
1.主函数
2.游戏使用流程图
3.游戏使用流程图
4.音效设计流程图
排行榜设计流程图
3.6接口
while(!
bioskey
(1))//直接使用BIOS服务的键盘接口
int86(0x33,&inregs,&outregs);//调用鼠标中断,通用8086软终端接口,
3.7数据文件存储说明
intre[10][6]//储存鼠标经过前的像素颜色
tx2=regs2.x.cx;//cx寄存器中存的是横坐标
ty2=regs2.x.dx;//dx寄存器中存的是列坐标
for(j=0;j<10;j++)//储存鼠标一定范围内的像素颜色
3.8注释设计
详见程序清单。
3.9限制条件
goto语句中遇到错误
3.10测试计划
如果游戏参赛者没有按照提示输入密码,系统会默认为是错误信息,会提示用户重新输入。
第四章程序使用说明
程序使用说明如下:
游戏开始伴随着音乐进入动画界面如下:
动画结束后进入登陆界面:
密码登陆成功后进入游戏界面如下:
开始
最后进入菜单界
游戏胜利
扫雷英雄排行榜效果图
第五章程序设计心得与体会
课题的设计工作完成后,基本上符合了实验要求。
具有登陆界面,可以用密码来保证安全,还有标题栏,选择菜单,菜单中有开始与退出,难度选择和排行榜。
游戏失败后会有失败的音乐动画,成功后会有胜利的音乐与动画,打破记录是可以把分数与姓名存入磁盘。
但缺点是登陆后没有对话框,不能在图形模式下输入姓名。
这个扫雷游戏是完全模拟微软系统自带的扫雷游戏,所以难度是比较大了,必然在编程过程中也遇到很多问题,有些问题比较简单但就不知道错在哪里,有些大问题之道在哪就是不知道怎么办才好,后来经过自己的不断调试,这个扫雷游戏终于大功告成。
首先,通过这次课程设计使我感觉到知道的知识太少,课本上学的只是基础,要想成为一个编程人员,就得自己不断的积累积累在积累,把可以利用的资源都用上,如图书馆,上网查资料。
尽量多学,不白过大学的每一天。
经过编写这个扫雷游戏,我认识到应该注意细节问题,虽然是很小的问题,但可以提高自己编程的能力,而且还可以培养自己编程的严谨性,同时还可以为以后的编程积累经验。
编写完这个扫雷游戏,我发现自己有很多的不足,我想如果让我来单独来编写这个游戏,我感觉很吃力,因为这个游戏涉及到好多算法。
感触最深的就是我们真的要扎扎实实的打基础!
并且我感觉到只要我们自己肯下功夫学习,我们也可以做出很好的东西,不需要每次都抄袭别人的,只有自己的才是最珍贵的!
附录1参考文献:
1)谭浩强,C程序设计题解与上机指导(第二版),北京,清华大学出版社,2000年9月。
2)如鹏论坛网。
附录2程序清单
#include
#include
#include
#include
#include
#include
structpeople
{
charname[20];
floattime;
}peo[3]={{"noname",999},{"noname",999},{"noname",999}};
intm_poly[8]={0,0,5,7,0,9,0,0};/*鼠标,根据参数产生一个多项式*/
intm_now_poly[8]={0,0,5,7,0,9,0,0};
intre[10][6];/*储存鼠标经过前的像素颜色*/
intm_s[93-40+1][52-2+1];/*全局的变量*/
intn1=-1,n2=-1;
inthard=1;/*0:
易1:
中2:
难*/
intcount=40;/*地雷数量*/
intmx=16,my=16;/*地图宽度*/
charmap[16][30];/*0位存放在是否有地雷,1有0无,1位存放是否打开,1打开0没有打开,2位表示是否插旗,1有0无*/
intha_x=320-120,ha_y=240-100;/*游戏栏*/
intdead=0;/*1:
死亡2:
生*/
intscore=0;
intnn=1;
charp[20];
time_tfirst,second;
FILE*fp;
voidmenu_window();
voidinterrupt(*hanlder)();
voidinterruptmusic();
intfr1[]={262,262,262,262,294,330,440,392,330,392,392,392,
523,523,523,523,523,523,330,330,392,523,523,523,523,523,
392,392.392,330,330,294,262,294,294,294,294,294,294,294,330,294,262,294,
262,262,262,262,294,330,440,392,330,392,392,523,523,523,523,523,
523,330,440,3892,392,523,523,523,523,523,440,392,392,440,330,
330,294,262,262,294,294,294,330,330,392,294,330,262,262};
inttim1[]={8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,4,4,8,8,8,4,4,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8};
intfr2[]={392,392,392,392,330,349,392,494,440,440,440,440,349,440,392,392,392,392,392,392,494,440,349,349,0,
349,349,349,349,330,294,262,262,0,523,523,523,523,392,440,523,523,659,578,578,578,578,523,494,440,440,
494,494,494,494,494,523,587,392,0,494,494,523,587,523,494,523,523};
inttim2[]={4,4,4,4,4,4,8,8,4,4,4,4,4,4,8,8,4,4,4,4,4,4,8,8,4,
4,4,4,4,4,2,8,8,4,4,4,4,4,4,4,8,4,8,4,4,4,4,2,4,8,8,
4,4,4,4,4,4,8,8,4,4,4,4,4,4,4,8,8};
charsao16k[]={
/*以下是‘扫’的16点阵楷体_GB2312字模,32byte*/
0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,
0x0C,0x3C,0x79,0xC4,0x08,0x04,0x0C,
0x19,0xC8,0x28,0x08,0xC8,0x08,0x08,0x78,
0x1B,0x80,0x80,0x00,0x00,0x00,0x00,0x00,
};
charlei16K[]={
/*以下是‘雷’的16点阵楷体字模,32byte*/
0x01,0xC0,0x0E,0x00,0x03,0xF8,0x3E,0x0C,
0x22,0x50,0x4A,0x00,0x02,0x40,0x0A,0x00,
0x01,0xE0,0x1E,0x20,0x13,0xA0,0x16,0x20,
0x0b,0xA0,0x0E,0x60,0x00,0x00,0x00,0x00,
};
charyou12S[]={
/*以下是‘游’的12点阵宋体字模,24byte*/
0x91,0x00,0x49,0xE0,0x3E,0x00,0x93,0xE0,
0x5C,0x40,0x54,0x80,0x55,0xE0,0x94,0x80,
0x94,0x80,0xA4,0x80,0x4D,0x80,0x00,0x00,
};
charxi12S[]={
/*以下是‘戏’的12点阵宋体字模,24byte*/
0x02,0x80,0xF2,0x40,0x12,0x40,0x13,0xE0,
0x9E,0x00,0x52,0x40,0x22,0x80,0x31,0x00,
0x49,0x20,0x42,0xA0,0x8C,0x60,0x00,0x00,
};
charkai12S[]={
/*以下是‘开’的12点阵宋体字模,24byte*/
0x00,0x40,0x7A,0xE0,0x1,0x00,0x1,0x00,
0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,
0x11,0x00,0x21,0x00,0xC1,0x0,0x00,0x00,
};
charju2S[]={
/*以下是‘局’的12点阵宋体字模,24byte*/
0x3F,0xC0,0x20,0x40,0x3F,0xc0,0x20,0x00,
0x3F,0xE0,0x20,0x20,0x2F,0x20,0x29,0x20,
0x4F,0x20,0x49,0x20,0x80,0xC0,0x00,0x00,
};
chartui12S[]={
/*以下是‘退’的12点阵宋体字模,24byte*/
0x8F,0xC0,0x48,0x40,0x4F,0xC0,0x08,0x40,
0xCF,0xC0,0x48,0x00,0x4b,0x40,0x48,0x80,
0x4E,0x40,0xB0,0x00,0x8F,0xE0,0x00,0x00,
};
charchu12S[]={
/*以下是‘出’的12点阵宋体字模,24byte*/
0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,
0x7F,0xC0,0x04,0x00,0x44,0x40,0x44,0x40,
0x44,0x40,0x44,0x40,0x7F,0xC0,0x00,0x00,
};
charnan12S[]={
/*以下是‘难’的12点阵宋体字模,24byte*/
0x02,0x80,0x02,0x80,0xF7,0xE0,0x14,0x80,
0x9F,0xE0,0x54,0x80,0x24,0x80,0x27,0xE0,
0x54,0x80,0x94,0x80,0x07,0xE0,0x00,0x00,
};
chardu12S[]={
/*一下是‘度’的12点阵宋体字模,24byte*/
0x02,0x00,0x7F,0xE0,0x48,0x80,0x7F,0xE0,
0x48,0x80,0x4F,0x80,0x40,0x00,0x5F,0x80,
0x45,0x00,0x87,0x00,0xB8,0xE0,0x00,0x00,
};
charyi12S[]={
/*以下是‘易’的12点阵宋体字模,24byte*/
0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,
0x3F,0x80,0x10,0x00,0x3F,0xC0,0xC9,0x40,
0x12,0x40,0x64,0x40,0x19,0x80,0x00,0x00,
};
charzhong12S[]={
/*以下是‘中’的12点阵宋体字模,24byte*/
0x04,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,
0x44,0x40,0x44,0x40,0x7F,0xC0,0x04,0x00,
0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,
};
charpai12S[]={
/*以下是‘排’的12点阵宋体字模,24byte*/
0x22,0x80,0x22,0x80,0xFE,0xE0,0x22,0x80,
0x32,0x80,0x6E,0xE0,0xA2,0x80,0x3E,0xE0,
0x22,0x80,0x22,0x80,0xE2,0x80,0x00,0x00,
};
charhang12S[]={
/*以下是‘行’的12点阵宋体字模,24byte*/
0x2F,0xC0,0x20,0x00,0x40,0x00,0x9F,0xE0,
0x20,0x80,0x60,0x80,0xA0,0x80,0x20,0x80,
0x20,0x80,0x20,0x80,0x27,0x80,0x00,0x00,
};
chardash16S[]={
/*以下是‘_’的16点阵宋体字模,32byte*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
charzhi16K[]={
/*以下是‘制‘的16点阵楷体字模,32byte*/
0x00,0x40,0x08,0x40,0x08,0x08,0x08,0x9C,
0x11,0xE0,0x31,0x40,0x52,0x40,0x94,0x78,
0x10,0x40,0x10,0x40,0x10,0x78,0x10,0x40,
0x10,0x40,0x00,0x40,0x00,0x40,0x00,0x00,
};
charcheng16K[]={
/*以下是‘成’的16点阵楷体字模,32byte*/
0x02,0x00,0x02,0x20,0x02,0x10,0x01,0x00,
0x10,0xE0,0x1F,0x00,0x11,0x10,0x10,0x90,
0x1E,0xA0,0x12,0x40,0x22,0x40,0x2A,0xA2,
0x45,0x12,0x80,0x0A,0x00,0x06,0x00,0x00,
};
charyuan16K[]={
0x03,0xC0,0x0C,0x40,0x09,0xC0,0x0E,0x00,/*以下是‘员’的16点阵楷体字模,32byte*/
0x00,0xE0,0x0F,0x20,0x08,0x20,0x09,0x20,
0x09,0x20,0x09,0x20,0x09,0x20,0x02,0x80,
0x04,0x40,0x08,0x30,0x70,0x10,0x00,0x00
};
charmao16S[]={
/*以下是‘:
’的16点阵宋体字模,32byte*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,
0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,
};
voidinterruptmusic()
{staticintflag=0,note=0,fre,dur;
if(flag>=(int)(d