武汉理工大学数据结构与算法综合实验连连看

合集下载

一种改进的层次聚类算法

一种改进的层次聚类算法

基金项 目: 省教育科学 “ 湖北 十一五” 规划科研 基金 资助项 目(00 09 ; 21B3 )湖北省人文社科基金 资助项 目(009 ) 2104
84 8
武汉理工大学学报 ・ 信息与管理工程版
21 0 1 1年 2月
应 的社 区 i 和 , 标记合 并 后社 区的标 号 为 , 新 更
文章编号 :0 7—14 2 1 ) 6— 83—0 10 4 X(0 10 0 8 4
文献标志码 : A

种 改进 的层 次 聚 类算 法
靳延安 , 刘行军
( 湖北 经济学 院 信息管理学院 , 湖北 武汉 4 0 0 ) 3 2 5

要: 针对凝聚式的层次聚类算法在聚类过程 中层次化 的迭代运算使误 差不断 累积 , 导致 聚类结果 较差 的
聚类是把各不相同的个体分割为有更多相似 性的簇的工作。由聚类所组成 的簇是一组数据对 象的集合 , 这些对象与同一簇 中的对象彼此类似 , 与其他簇 中的对 象相异… , 目前 , 已有 大量 的聚
类算法。根据数据的类型、 目的和应用场景 , 主要 的聚类 算 法 通 常 分 为 划 分 方 法 J 层 次 方 、 法 J基 于 密 度 的 方 法 - 9、 于 网 格 的 方 、 8 基 IJ 法 和基于模型的方法 。其 中层次聚类算 卜 J 法由于其简单 , 得到 了广泛的应用 。但该方法经
0 = e ; =0 l , + 0 () 4
当模块性增量矩阵 中最大的元素都小于零 以后 , 模块性的值就只可能一直下降。因此 , 只要模块 性增量矩阵 中最大的元素 由正变到负 以后 , 就可 以停止合并 , 并认为此 时的社区结构就是 网络的
社 区结 构 。

武汉理工大学学生实验报告书2

武汉理工大学学生实验报告书2
⒉掌握时域仿真的方法和主要的仿真指令;
⒊学习用编程器编程、程序调试、程序保存和运行程序进行仿真。
二、实验内容
1、第1项:系统阶跃响应
编写一个简单的M文件,计算二阶动态系统的阶跃响应,ζ值从0.1到1,且绘制出一簇阶跃响应曲线。二阶动态系统的数学模型如下:
分别设固有频率为1、2。
实验报告要求:
⑴按自己的设想编制程序,给出每句程序的注释;
实验课程名称:计算机仿真
实验项目名称
动态系统的时域仿真
实验成绩
实验者
专业班级
组别
同组者
实验日期
14年11月23日
一部分:实验预习报告(包括实验目的、意义,实验基本原理与方法,主要仪器设备及耗材,实验方案与技术路线等)
一、实验要求
⒈建立动态系统的数学模型,掌握数学模型的MATLAB语言表示和模型转换;
%在图形坐标的(5,0.8)处添加文本标注“输出 ”
text(17,0.8,’\leftarrow输出’)
教师签字__________
第三部分结果与讨论(可加页)
一、实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)
二、小结、建议及体会
三、思考题
1、第1项:系统阶跃响应
(1)仿真结果
den=[1,2*zeta*w,w*w];%分母参数
t=[0:0.1:19.9];%采样时间
y(:,i)=step(num,den,t);%每一个参数下的单位阶跃响应的函数
i=i+1;
end%循环结束
mesh(fliplr(y),[120 30])%绘制立体网络图
zlabel('Y')
ylabel('t')

数据结构(本科)武汉理工大学-在线作业

数据结构(本科)武汉理工大学-在线作业

数据结构(本科)武汉理工大学在线作业一、判断(共计40分,每题2.5分)1、快速排序是排序算法中平均性能最好的一种排序。

()A. 正确B. 错误答案:【A】2、调用一次深度优先遍历可以访问到图中的所有顶点。

()A. 正确B. 错误答案:【B】3、对连通图进行深度优先遍历可以访问到该图中的所有顶点。

()A. 正确B. 错误答案:【A】4、线性表中的所有元素都有一个前驱元素和后继元素。

()A. 正确B. 错误答案:【B】5、设一棵二叉树的先序序列和后序序列,则能够唯一确定出该二叉树的形状。

()A. 正确B. 错误答案:【B】6、先序遍历一棵二叉排序树得到的结点序列不一定是有序的序列。

()A. 正确B. 错误答案:【A】7、不论线性表采用顺序存储结构还是链式存储结构,删除值为X的结点的时间复杂度均为O(n)。

()A. 正确B. 错误答案:【A】8、满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

()B. 错误答案:【A】9、子串“ABC”在主串“AABCABCD”中的位置为2。

( )A. 正确B. 错误答案:【A】10、非空的双向循环链表中任何结点的前驱指针均不为空。

()A. 正确B. 错误答案:【A】11、分块查找的平均查找长度不仅与索引表的长度有关,而且与块的长度有关。

()A. 正确B. 错误答案:【A】12、线性表的顺序存储结构比链式存储结构更好。

()A. 正确B. 错误答案:【B】13、向二叉排序树中插入一个结点需要比较的次数可能大于该二叉树的高度。

()A. 正确B. 错误答案:【B】14、层次遍历初始堆可以得到一个有序的序列。

()A. 正确B. 错误答案:【B】15、冒泡排序在初始关键字序列为逆序的情况下执行的交换次数最多。

()A. 正确B. 错误答案:【A】16、设初始记录关键字基本有序,则快速排序算法的时间复杂度为O(nlog2n)。

()A. 正确B. 错误二、单选(共计60分,每题2.5分)17、在二叉排序树中插入一个关键字值的平均时间复杂度为()。

数据结构实验指导书(新版)

数据结构实验指导书(新版)

《数据结构和算法》实验指导书实验及学时数分配序号实验名称学时数(小时)1 实验一线性表 42 实验二树和二叉树 23 实验三图 24 实验四查找 25 实验五内部排序 2合计12几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。

二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。

上机时签到;下机时验收签字。

三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。

实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。

【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。

(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。

若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。

若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。

【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。

1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。

《算法综合实验》实验报告

《算法综合实验》实验报告

实验5、《算法综合实验》一、实验目的1. 理解和复习所学各种算法的概念2. 掌握和复习所学各种算法的基本要素3. 掌握各种算法的优点和区别4. 通过应用范例掌握选择最佳算法的设计技巧与策略二、实验内容1. 使用贪心算法、回溯法、分支限界法解决0-1背包问题;2. 通过上机实验进行算法实现;3. 保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。

三、算法思想分析1.贪心算法理论上只能解决满足贪心选择性质的问题,而0-1背包并不满足该性质,所以并不能保证能够找到最优解法,只能找到最接近的解,当然如果运气好,也是可以找到最优解的。

利用按重量从小到大、按价值从大到小、按价值/重量从大到小三种方式通过贪心算法求得每种方式的最终结果,并比较三种方式的最大价值取最大的那个,即为贪心算法获得的最优解。

2.回溯法解决0-1背包问题的解空间为子集树,利用回溯法的基本代码模版即可,其中左子树为约束条件,即背包能否装下该物品,右子树为限界条件,即当前物品不放入背包,剩余物品是否有可能创造比当前最大价值更大的价值,如果可以则进入右子树,反之,则直接剪去右子树。

3.0-1背包的解空间为子集树,分支界限法是采用广度优先搜索,每次选取队列的最前面的结点为活结点。

1)算法从根结点A即标记结点开始,初始时活结点队列为空,A入队列。

2)A为活结点,A的儿子结点B、C为可行结点。

将B、C加入队列,舍弃A。

此时队列元素为C-B;3)B为活结点,B的儿子结点D、E,而D为不可行结点。

将E入队列,舍弃B。

此时队列元素为E-C;4)循环以上步骤按照以上方式扩展到叶节点。

四、实验过程分析1.贪心算法的思路很简单即为一直循环下去,直至不满足指定条件。

用于解决0-1背包问题时需要考虑多种放入方式,因为不管哪种方式都不能百分百会得到最优解,只能取多种放入方式中的最优解作为问题的最优解。

这道题目的收获在于贪心算法对于不能保证获得最优解的情况下,如何获得最接近的解,比如0-1背包问题则是采用多种放入方式再进行比较取最优解。

武汉理工大学算法分析实验报告

武汉理工大学算法分析实验报告

学生实验报告书实验课程名称算法设计与分析开课学院计算机科学与技术学院指导教师姓名李晓红学生姓名学生专业班级软件工程zy1302班2015-- 2016学年第一学期实验课程名称:算法设计与分析同组者实验日期2015年10月20日第一部分:实验分析与设计一.实验内容描述(问题域描述)1、利用分治法,写一个快速排序的递归算法,并利用任何一种语言,在计算机上实现,同时进行时间复杂性分析;2、要求用递归的方法实现。

二.实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)本次的解法使用的是“三向切分的快速排序”,它是快速排序的一种优化版本。

不仅利用了分治法和递归实现,而且对于存在大量重复元素的数组,它的效率比快速排序基本版高得多。

它从左到右遍历数组一次,维护一个指针lt使得a[lo..lt-1]中的元素都小于v,一个指针gt 使得a[gt+1..hi]中的元素都大于v,一个指针i使得a[lt..i-1]中的元素都等于v,a[i..gt]中的元素都还未确定,如下图所示:public class Quick3way{public static void sort(Comparable[] a, int lo, int hi){if (lo >= hi)return;int lt = lo, i = lo + 1, gt = hi;Comparable pivot = a[lo];第二部分:实验调试与结果分析一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)1、调试方法描述:对程序入口进行断点,随着程序的运行,一步一步的调试,得到运行轨迹;2、实验数据:"R", "B", "W", "W", "R", "W", "B", "R", "R", "W", "B", "R";3、实验现象:4、实验过程中发现的问题:(1)边界问题:在设计快速排序的代码时要非常小心,因为其中包含非常关键的边界问题,例如:什么时候跳出while循环,递归什么时候结束,是对指针的左半部分还是右半部分排序等等;(2)程序的调试跳转:在调试过程中要时刻记住程序是对那一部分进行排序,当完成了这部分的排序后,会跳到哪里又去对另外的那一部分进行排序,这些都是要了然于心的,这样才能准确的定位程序。

《算法设计综合实验》教案(5篇)

《算法设计综合实验》教案(5篇)

《算法设计综合实验》教案(5篇)第一篇:《算法设计综合实验》教案《算法设计综合实验》教案统计与应用数学学院2012年5月11日制实验一数据类型、运算符和表达式实验目的:1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法;2、掌握不同的数据类型之间赋值的规律;3、学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加和自减运算符的使用;4、学会使用赋值运算符及复合赋值运算符;5、进一步熟悉C程序的编辑、编译、连接和运行的过程。

实验环境:Windows操作系统、Visual C++6.0实验学时:2学时;实验内容:1、整型变量实型变量、字符型变量的定义与输出,赋整型常量值时的情形,以及给整型变量赋字符常量值时的情形;2、各类数值型数据间的混合运算;3、要将“China”译成密码,密码规律是:用原来的字母后面第4各字母代替原来的字母。

例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。

因此,“China”应译成“Glmre”。

请编一程序,用赋初值的方法使c1、c2、c3、c4、c5这5个变量的值分别为’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。

实验二顺序结构程序设计实验目的:1、掌握C语言中赋值语句的使用方法;2、掌握各种类型数据的输入输出方法,能正确使用各种格式转换符;3、学习调试程序。

实验环境: Windows操作系统、Visual C++6.0 实验学时:2学时;实验内容:1、掌握各种格式转换符的正确使用方法;2、设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。

用scanf输入数据,输出计算结果。

输出时要有文字说明,取小数点后两位数字。

3、编程序:用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和printf函数输出这两个字符。

算法与数据结构实验报告

算法与数据结构实验报告

2015-2016学年第二学期《算法与数据结构》课程实验报告专业软件工程学生姓名成晓伟班级软件141学号1410075094实验学时16实验教师徐秀芳信息工程学院实验一单链表的基本操作一、实验目的1.熟悉C语言上机环境,进一步掌握C语言的基本结构及特点。

2.掌握线性表的各种物理存储表示和C语言实现。

3.掌握单链表的各种主要操作的C语言实现。

4.通过实验理解线性表中的单链表存储表示与实现。

二、主要仪器及耗材普通计算机三、实验内容与要求1、用C语言编写一个单链表基本操作测试程序。

(1)初始化单链表(2)创建单链表(3)求单链表长度(4)输出单链表中每一个结点元素(5)指定位置插入某个元素(6)查找第i个结点元素的值(7)查找值为e 的结点,并返回该结点指针(8)删除第i个结点(9)销毁单链表2、实验要求(1)程序中用户可以选择上述基本操作。

程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。

(2)要求用线性表的顺序存储结构,带头结点的单链表存储结构分别实现。

(3)主函数实现对基本操作功能的调用。

3、主要代码(1)初始化单链表LinkList *InitList(){ //创建一个空链表,初始化线性表LinkList *L;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;return L;}(2)创建单链表//头插法void CreateListF(LinkList *L){LinkList *s;int i=1,a=0;while(1){printf("输入第%d个元素(0表示终止)",i++);scanf("%d",&a);if(a==0)break;s=(LinkList *)malloc(sizeof(LinkList));s->data=a;s->next=L->next;L->next=s;}}(3)求链表长度int ListLength(LinkList *L){ //求链表长度int n=0;LinkList *p=L;while(p->next!=NULL){p=p->next;n++;}return(n);}(4)在指定位置插入元素int InsertList(LinkList *L,int i,ElemType e){LinkList *p=L,*s;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找出要插入的位置的前一个位置if(p==NULL){return 0;}else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}(5)输出链表void DispList(LinkList *L){ //输出链表LinkList *p=L->next;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}(6)查找链表中指定元素int GetElem(LinkList *L,int i){ //查找链表中指定元素LinkList *p=L;int j=0;while(j<i&&p!=NULL){j++;p=p->next;}if(p==NULL){return 0;}else{return p->data;}}(7)查找值是e的结点并返回该指针LinkList *LocateElem(LinkList *L,ElemType e){ //查找值是e的结点并返回该指针int i=1;LinkList *p=L;while(p!=NULL)if(p->data==e) return p;}if(p==NULL){return NULL;}}(8)删除元素int ListDelete(LinkList *L,int i,ElemType *e){ //删除元素LinkList *p=L,*q;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找到要删除元素地址的前一个地址if(p==NULL){ return 0;} //不能删除else{q=p->next;*e=q->data;p->next=q->next;free(q); //删除成功return 1;}}(9)销毁链表void DestroyList(LinkList *L){//销毁链表LinkList *pre=L,*p=L->next;while(p!=NULL){free(pre);pre=p;p=pre->next;}free(pre);}main函数:int main(){LinkList *L;ElemType e;int i;L=InitList();CreateListF(L);DispList(L);printf("输入要查找的元素位置:\n");scanf("%d",&i);e=GetElem(L,i);printf("%d\n",e);printf("单链表长度为:%d\n",ListLength(L));printf("输入要删除元素的位置:");scanf("%d",&i);if (i>ListLength(L)){printf("超出范围重新输入");scanf("%d",&i);}if(ListDelete(L,i,&e)==0){printf("未找到元素\n");}else DispList(L);printf("输入插入元素的位置和值:");scanf("%d%d",&i,&e);InsertList(L,i,e);DispList(L);return 0;}4、测试数据及测试结果输入:23 56 12 28 45输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

武汉理工大学数据结构与算法综合实验连连看学生学号Xxx实验课成绩学生实验报告书实验课程名称数据结构与算法综合实验开课学院计算机科学与技术学院指导教师姓名xx学生姓名xx学生专业班级xxxx2015-- 2016学年第 2 学期实验课程名称:数据结构与算法综合实验int count = 0;for (int i = 0; i<nPicNums; i++){for (int j = 0; j <nRepeatNum; j++){m_Map[count / nCols][count%nCols] = i;count++;}}4)由于生成的地图是规则的,因此,需要将地图中的花色打乱。

实现思路是:随机选择两个元素,将其值对调,重复若干次。

●消子判断的流程1)获得选中的两张图片的行号和列号。

2)判断选中的图片是否同色,不同色,则不能相消。

判断选中的图片是否为同一个图片,如果为不为同一个图片,则不能相消。

3)判断连通性,如以下三种情况均不满足,则结束。

①首先判断能否一条直线连通。

②如果不能一条直线连通,则判断能否两条直线连通。

③如果不能两条直线连通,则判断能否三条直线连通。

4)获得连通路径,绘制连线。

5)消除图片●一条直线消子算法①判断两个顶点,行是否相同,若相同,则判断两个顶点在X方向是否连通。

在CGameLogic类定义RowLink()函数事项X方向的连通判断。

依次判断在X方向两个顶点间每一个顶点,是否都为空,全为空表示可以连通,否则不能连通。

实现代码如下:bool CGameLogic::RowLink(int m_Map[10][15],Vertex v1,Vertex v2){//将两个点的列进行调整,使nCol1的值小于nCol2的值int row=v1.row;int col1=v1.col;int col2=v2.col;if(col1>col2){int temp=col1;col1=col2;col2=temp;}//判断两个顶点间是否有不为空的图片for(int i=col1+1;i<=col2;i++){if(i==col2){return true;}if(m_Map[row][i]!=BLANK){break;}}return false;②判断两个顶点,列是否相同,若相同,则判断两个顶点在Y方向是否连通。

在CGameLogic类定义ColLink()函数事项Y方向的连通判断。

依次判断在Y方向两个顶点间每一个顶点,是否都为空,全为空表示可以连通,否则不能连通。

实现代码如下:bool CGameLogic::ColLink(int m_Map[10][15],Vertex v1,Vertex v2){int row1=v1.row;int row2=v2.row;int col=v1.col;if(row1>row2){int temp=row1;row1=row2;row2=temp;}for(int i=row1+1;i<=row2;i++){if(i==row2){return true;}if(m_Map[i][col]!=BLANK){break;}}return false;}两条直线消子算法若一条直线无法连通,则判断两条直线的情况。

在CGameLogic类中定义OneCornerLink()函数判断两点是否能两条直线连通。

先判断两个顶点的X和Y方向的直线相交的两个顶点,是否为空。

若能构成两条指向连通,那么相交的顶点必须为空才行。

若顶点有一个为空,则判断该顶点与两个顶点,横向与纵向一条直线是否连通,若都连通,则表示两条直线消子成功,否则不能相消。

实现代码如下:bool CGameLogic::OneCornerLink(int m_Map[10][15],Vertex v1,Vertex v2) {int row1=v1.row;int col1=v1.col;int row2=v2.row;int col2=v2.col;//判断相交的顶点是否为空if(m_Map[row1][col2]==BLANK){//判断两个同行的顶点是否一条直线连通if(LineY(m_Map,row1,row2,col2)&&LineX(m_Map,row1,col1,col2)){Vertex V={row1,col2,BLANK};AddVertex(V);return true;}}if(m_Map[row2][col1]==BLANK){//判断两个同列顶点是否一条直线连通if(LineY(m_Map,row1,row2,col1)&&LineX(m_Map,row2,col1,col2)){Vertex V={row2,col1,BLANK};AddVertex(V);return true;}}return false;}三条直线消子算法若两条直线无法连通,则判断三条直线的情况。

在CGameLogic类中定义TwoCornerLink()函数判断两点能否三条直线连通。

三条直线消子时,假设选择的两张图片的位置为(nRow1,nCol1)和(nRow2,nCol2),则先寻找与Y轴平行的连通线段。

如果Y轴没有找到可以连通的三条直线,则寻找以X轴平行的连通线段。

1)搜索关键路径假设玩家选择的两个顶点为V0(row0,col0),V3(row3,col3),步骤如下:第一步:从地图的第一行开始扫描,当前扫描到nRow行。

第二步:设置拐点:V1(nRow,col0),V2(nRow,col3)。

第三步:判断V1和V2是否水平方向向上连通,如果连通,则V1到V2的连线即为关键路径。

如果不连通则接着扫描下一行,重复第二~四步。

2)判断三条直线连通采用枚举法判断三条直线连通,假设玩家选择两个顶点为V0和V3,判断三条直线连通的具体实现的具体步骤如下:①找到其中一条关键路径V1,V2。

②判断V1和V0是否连通。

③判断V2和V3是否连通。

④如果同时满足V1和V0连通,V2和V3连通,则V0和V3满足三条直线连通。

否则,在此关键路径下V0和V3不连通,找到下一条关键路径,重复2~4,直到判断出V0和V3是否连通。

3)保存连通路径使用栈来保存连通路径中的关键点:起始点V0,拐点V1,拐点V2和终点V3。

保存连通路径的步骤如下:①保存其实点V0。

②判断是否存在能够满足三条直线消子的关键路径V1、V2。

③如果存在,保存顶点V1、V2、V3,如果不存在,在删除起始点V0。

实现代码如下:bool CGameLogic::TwoCornerLink(int m_Map[10][16],Vertex v1,Vertex v2) {int row1=v1.row;int col1=v1.col;int row2=v2.row;int col2=v2.col;for(int col=0;col<16;col++){if(m_Map[row1][col]==BLANK&&m_Map[row2][col]==BLANK){if(LineY(m_Map,row1,row2,col)){if(LineX(m_Map,row1,col1,col)&&LineX(m_Map,row2,col2,col)){Vertex V1={row1,col,BLANK};Vertex V2={row2,col,BLANK};AddVertex(V1);AddVertex(V2);return true;}}}}for(int row=0;row<10;row++){if(m_Map[row][col1]==BLANK&&m_Map[row][col2]==BLANK){if(LineX(m_Map,row,col1,col2)){if(LineY(m_Map,row,row1,col1)&&LineY(m_Map,row,row2,col2)){Vertex V1={row,col1,BLANK};Vertex V2={row,col2,BLANK};AddVertex(V1);AddVertex(V2);return true;}}}}return false;}4)胜负判断算法当所有元素被消掉,进行胜负判断,遍历地图中所有元素的值,当所有元素都为空时,表示获胜,游戏结束,否则继续游戏。

实现代码如下:if (m_GameProgress.GetPos() <= 0 && !cgc.IsBlank(cgc.m_Map)) { KillTimer(PLAY_TIMER_ID);int result = MessageBox(_T("很遗憾,时间到了!,是否重新开始游戏?"), _T("提示"));if (result = IDOK) {GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);}else {exit(0);}IsPlaying = false;}else if (m_GameProgress.GetPos() > 0 && cgc.IsBlank(cgc.m_Map)){KillTimer(PLAY_TIMER_ID);int result;result = MessageBox(_T("获胜!是否重新开始游戏?"), _T("提示"));if (result = IDOK) {GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);}else {exit(0);}}5)重排当进行游戏的过程中会出现无法再进行消子的情况,点击重排按钮就可以将剩下子进行随机重排以便客户能够正常进行消子操作。

首先在CGameLogic类中定义一个DisOrderMap()函数来对剩下的元素进行重排,实现代码如下:void CGameLogic::DisOrderMap(int m_Map[10][16]){int nRows = 10;int nCols = 16;srand((int)time(NULL));int nVertexNum = nRows * nCols;for (int i = 0; i<nVertexNum; i++){//随机获得两个坐标int nIndex1 = rand() % nVertexNum;int nIndex2 = rand() % nVertexNum;int nTemp = m_Map[nIndex1 / nCols][nIndex1 % nCols];m_Map[nIndex1 / nCols][nIndex1 % nCols] = m_Map[nIndex2 /nCols][nIndex2 % nCols];m_Map[nIndex2 / nCols][nIndex2 % nCols] = nTemp;}}然后在CGameControl类中定义一个DisOrder()函数来调用DisOrderMap()函数,最后再CGameDlg类的OnBnClickedButtonReset()函数中调用DisOrder()函数,实现代码如下:void CGameDlg::OnBnClickedButtonReset(){// TODO: 在此添加控件通知处理程序代码m_dcMem.BitBlt(0, 0, 800, 600, &m_dcBG, 0, 0, SRCCOPY);InvalidateRect(FALSE);m_gameControl.DisOrder();UpDateMap();}6)帮助在原有的基础上重新插入一个对话框,重新定义一个CHelpDialog类,在这个类中将写有相关游戏说明的图片加载进界面中去,加上滚动条。

相关文档
最新文档