关于扫雷游戏地雷的合理性设置的数学模型
更新时间:2023-10-04 14:34:01 阅读量: 综合文库 文档下载
- 扫雷游戏地雷图片推荐度:
- 相关推荐
关于扫雷游戏地雷的合理性设置的数学模型
摘要:
本文主要利用了最小二乘法和统计学知识,从合理性的角度出发,分析和解决了地雷数量最优化的问题,根据地雷数量对游戏难度进行了分级。
问题一:考虑到地雷分布以及触雷概率的合理性,人为提出了地雷分布的约束条件,即:方阵中至少有一个方块中是小于8的数字,以此为约束,得出方阵中最多可容地雷数sum=331。然后,针对结果分析,并建立了优化模型,追加提出最高触雷率pm在0.5左右的理念,并以此对方块中数字上限M加以约束,利用统计学知识得到最佳上限M。然后,根据M的值,利用最小二乘法,得出了最多可容地雷数sum=212。最后进行模型推广,将模型应用于求19阶以上的方阵最大容雷数。
问题二:衡量游戏难度的重要标准是“在能判断雷分布之前游戏猜测触雷的概率和进行必要的无雷操作次数x”。根据统计学的基本规律,分析求解出在分隔区域与整体区域猜测触雷的概率和已进行的无触雷操作的个数x之间的关系。利用这个关系解出前者概率为1时,x的取值临界。得出x关于地雷数n的函数,并将这个函数代入整体区域猜测触雷的概率与x的关系。这样就把衡量游戏难度的两个重要标准都化成了关于地雷数n的数学模型。分析这个模型,绘制出函数图像。这样就实现了地雷数量对游戏难度的控制和分级。
利用问题1、2的分析结果,模拟出符合要求的游戏程序。
一:问题重述
已知,在一个19*19的正方形中有19*19个小方块,每个方块可能是1到8的八个数字也可能是地雷,并且每个数字周围8个位置的地雷数等于这个数字。在这种条件下,我们设计了一款挖地雷的游戏,并解决了如下问题:在这个19×19的方块中最多能放多少个地雷,并对游戏的难度进行了分级。
根据题目要求,我们要注意以下几点:
1、 题目要求设计的游戏与传统的挖地雷游戏有一些不同,它要求对于任意的
一个小郑方块,它周围的几个小方块不可以全部是地雷,也不可以没有地雷。 2、 根据1的要求,可以求出出最多能放多少个地雷,这是一个最优化的问题,
其中,优化的对象就是地雷的数目。
3、 在优化的前提下结合地雷的数量对难易度进行分级,而对于难易程度分级的
问题又是一个抽象的概念,于是,可以考虑用具体的参数进行量化,便于进行难度分级。
二:问题分析:
问题一:
根据题目,可以得到以下三个约束条件: ? 扫雷游戏中,地域面积为:19*19;
? 每单位方块中只有九种填充情况:数字1-8、地雷;
? 每单位方块,假如其填充物是数字1-8,则:周围8块中地雷数总和等于该数
字。
假如只根据题目所给的约束条件来计算方阵中最多能放多少个地雷,可得出,最多地雷数为:19*19=361个,此时的触雷概率为:100%。
很明显,这种布雷方法不具备合理性。所以,为了让游戏更加合理,我们需要人为加入一些约束条件,以使得游戏能够切合玩家需要。同时,通过不同约束条件的添加,来给游戏建立不同的模型,并以此为依据对游戏的难度进行分级。
游戏运行时,计算机自动生成一个地雷分布的源代码,然后将其覆盖,游戏者在进行游戏的过程中,一步一步的打开无雷区域,在没有触雷的情况下,计算机自动为打开的区域生成一个该区域周围地雷数量的数,供游戏者以判断其他区域有雷与否的依据。不仅如此在无法判断出周围雷分布的情况下,游戏者必须进行猜测。
这个游戏设计过程,有三部份,第一就是游戏之前地雷的生成,第二就是游戏过程非雷区周围地雷数量的判断,第三就是游戏性和合理性分析。
最优化地雷的生成:
地雷的生成关系到整个游戏的游戏性,平衡性。就算在满足约束条件的情况下,可以排布的地雷数量和一定数量地雷的排布是一个很大的范围。
过多的地雷会导致游戏者要不停地进行猜测,引起的触雷概率过高会使游戏失去意义,过少的地雷则会导致游戏过于简单,也就是说在编译运行游戏之前,不仅要考虑生成的地雷是否满足约束条件,还要从合理性出发,以优化为目的建立一个数学模型求出地雷生成的最优解范围。
对于地雷的生成问题,分为两个典型的方面,一个就是对于地雷的分布方面,一个就是地雷的数量方面。
下面的分析就是基于“对于任意的一个小郑方块,它周围的几个小方块不可以全部是地雷,也不可以没有地雷。”这个单一条件下的地雷分布数量范围。
三:基本假设:
1. 此方阵中至少有一个方块中的填充物不为地雷,也不为数字8; 2. 玩家第一次挖雷时,所挖方块填充物不为地雷,也不为数字8; 3. 玩家完成第一次操作后,雷的个数和分布都已确定;
4. 玩家挖雷的过程具有逻辑性,即:连续几次的操作都在一个固定大小的区域中,
直到将此区域所有的雷挖出来为止。挖完后,再进行下一区域的挖雷工作,当玩家挖掉的雷与雷的总个数相等时,宣告胜利。
四:符号说明:
问题一:
N:方阵的阶数;
M:方阵中数字大小的上限,即假如某一方块的值为一个数字,那么,这个数字必须小于等于M;
aij:玩家第一次操作的位置,也表示aij位置对应的值; C[i,j]:组合数,即:i里面取j个;
kij:当前位置,也表示kij位置对应的值,即:kij位置周围应该有雷的个数; pkij:kij位置周围已有的非地雷的个数;
qkij:kij位置周围需要添加的雷的个数 ,即:kij-(8-pkij); sum:当前为止算出的能放的最多地雷数; sum1:以当前赋值路径得到的地雷数; 问题二:
t:隔离系数,游戏者将m*m的区域分为t份 n:整体地雷总数 m:整体区域宽度
x: 在能判断雷分布之前游戏者进行的无雷操作次数 P[k]:整体猜测概率。
c:某个3*3区域中的中间数
d:某个3*3区域中的未知单位区域的数量
P1(x):整体区域猜测触雷的概率与x的关系函数 P2(x):分隔区域猜测触雷的概率与x的关系函数 W:难度系数
五:问题求解:
5.0 单一约束下地雷数量最大值: 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 2 3 4 5 6 1 2 3 4 5 6 1 1 2 2 3 3 4 4 5 5 6 6 7 7 1 2 3 4 5 6 1 2 3 4 5 6 图2.1
如图2.1 所示,在以上6*7的表格中,设黑点表示无雷区域。
先假设开始地雷矩阵里的全部元素都是雷区,这显然不满足“对于任意的一个
小郑方块,它周围的几个小方块不可以全部是地雷,”
我们先假设对于某个区域,如果它周围8个方向的区域和自己至少有一个不是
雷区,(对于边界区域等同对待)(1)。那么就称这个区域满足条件(1),这样问题转化为要求所有区域都是满足条件(1)的区域。
然后需要必要的非雷区域来实现这一约束,那么把生成的每一个非雷区域当成
一个动态的过程,我们就会知道,这个动态过程有一个特点就是:每多一个非雷区就意味着这个区域周围8个方向的区都是满足条件(1)的区域,利用了这种位置关系的相互性原理。例如图2.1中,在区域(2,2)生成一个非雷区,那么就意味着周围除了本身的3*3小方框中的8个区域区域都已经转变为满足条件(1)的区域。
问题的关键就在于二个非雷区域的确立,
如果在区域(3,4)中生成非雷区,这样的话这个区域周围除了本身的3*3小
方框中的8个区域区域与第一次生成的非雷区域周围8个方向的区域出现了重合,这样的话在同等条件下非雷区域的利用率降低了,由于在满足单一条件下尽可能的减少非雷区域就可以增加雷数,所以在(3,4)或者其他类似区生成非雷区是不可取的。
如果在区域(2,6)中生成非雷区,那么中间就存在一些不满足条件(1)的区
域,那么之后必定要安排一个或者多个非雷区让它们让那些区域满足条件(1),这样也同样浪费了资源。
综上分析只有但第二次生成的非雷区与第一次生成的非雷区如图2.1中的第四
幅一样的关系时,所用的非雷区是最小的,由于19*19不是被三整除的数,所以最优拓展为21*21区域求非雷区最小值,得到
【非雷区最小值】= 21*21 / (3*3) = 49
则【单一条件下雷数最大值】= 19*19 - 49 = 312 同理可得雷数最小值为49
显然这个数量的地雷就算是第一次猜测,猜错的概率p=312/(19*19)=86.42%.是不符合实际的,所以要在单一条件{条件(1)}下对问题进行优化处理。 5.1 问题一模型的建立与求解:
5.1.1 初步模型的建立与求解: 步骤1:布雷—初步模型的建立:
aij
根据基本假设3:当玩家完成第一次操作后,雷区确定。不妨假设玩家第一次操作是在aij处(如图),根据假设2,可得1<=aij<=7。由aij的取值范围可知,aij周围的8块方块中至少有一块不是地雷,根据组合数方法可求得aij周围雷区分布有n= C[ 8,aij ]种。对每一种情况,再对aij 周围的8-aij 个非雷区进行同上相似的分析,(此时要注意一点:由于这8-aij 个非雷区周围可能已经存在地雷或已经被操作过的方块,对这些方块不能够再进行第二次操作,这一点与处理aij时有所不同),经过整理,可得到如下算法步骤:
step 1:根据玩家的第一次操作位置aij,将其对应kij 赋值为1-7 中的某个数,此时pkij=8,对于每一种赋值,都有qkij=kij,且都进入step 2操作;
step 2:进行C[ pkij, qkij ]次操作,每次操作中都是对pkij中选中的qkij个方块进行赋值,赋值必须满足一个条件:赋值后的kij必须大于等于(8-pkij),如果不满足,则重新赋值。对每一次满足条件的赋值都进入step 3操作;
step 3:对每个方块赋值kij后,假如操作对象没有到达方阵边界,返回step 2进行循环操作,否则,执行step 4;
step 4:计算出每一条赋值路径得到的地雷数sum1,假如大于当前最大值sum,则sum用sum1赋值,否则,不操作;
step 5:停止。
根据此算法,我们用C 语言编出了一个求最大值sum的程序。(由于版面的原因,源程序没有显示于此)
步骤二:模型的求解:
由于随着阶数的增多,程序的空间复杂度和时间复杂度呈指数型增长趋势,当阶数为题目中所要求的19时,程序便无法在限定时间内完成计算。所以,我们决定利用最小二乘法,再连结阶数在1-10是所对应的最大值sum,估计出当阶数为19 时,方阵所能放的最多地雷数,这里需要指出的是,这里同时也用到了控制变量法,即,研究阶数N变化时,数字上限M 是确定不变的。
根据程序的运行,通过改变N(阶数的值),可以得到如下N—sum的对应关系,列表如下:
根据题目,取方块数值上限M=8;
Step 1:列表:
sum=212;
步骤三:优化模型的结果分析:
由sum=212算得,触雷的最大概率为pm=212/( 19^2 )=0.587。 这样的触雷概率,既保证了一定的游戏难度,以使得分级能够有一定的空间;同时,概率又不是太大,保证了很好的难度合理性。所以,在充分保证了游戏各方面合理性的前提下,最大容雷数为212。
5.2:问题一模型的进一步思考与推广
由于此模型是利用最小二乘法,通过求低阶方阵最大容雷数来估计高阶方阵最大容雷数的。所以,此模型用于求19阶以上方阵的最大容雷数同样会得到很好的效果。
5.2 问题二模型的建立和求解——基于统计学建立数学模型控制游戏难度。
5.2.1分析合理性:
利用数学上的分析法从结果分析,设计游戏的最终目的就是让游戏有较高的可玩性。
从这个游戏的各个特点上分析,
1对于这种简单小游戏的可玩性在于其能否提高游戏者游戏时兴趣,所以在游
戏过程中游戏的设计者有对游戏的成功率进行确立和平衡,如果成功率过高会使游戏过于简单而减少了游戏性,过低则会让游戏者失去游戏的兴趣。而在难度分级上也要从游戏者本身出发进行设计,使游戏难度根据游戏者的游戏经验合理分层。
2这款游戏有涉及到猜测问题。所以在无法认为判断结果的情况下,要对游戏
的猜测概率进行合理的控制,这将对整个游戏的合理性,游戏性,可行性起到决定性的作用。
建立数学模型:
通过数学上特殊到一般的思想,假设把19*19的矩阵进行扩展成一个较大的区域,这个区域有m行m列,这样便于从统计学角度对这个复杂问题分析,在这个区域中已经在满足条件(1)的前提下随机排布了n个地雷。
第一步,引入一个自定义参数--隔离系数t,对于这个参数的由来,我们先从游戏者角度分析一个问题。
如果游戏者在游戏过程中每一次猜雷都是在m*m的矩阵中随机选择,那么每次猜测中猜错的概率为p=n/(m*m-x);这样的话随着x(游戏者猜测次数)的增大猜错的概率会越来越大。
显然任何一个游戏者都不会这么做,有经验的人在游戏过程中不仅能利用打开区域中的数字来推断其他区域的地雷情况,还会把整个区域分成诺干个小部分,对每个部分分别进行求解,那么我们假设他将m*m的区域分为t份,这个参数t定义为隔离系数。
这样的话游戏者就会对其中的每一块区域分别求解,假设此时游戏者进行的是第k+1次m*m/t这样的区域求解,(其中k取0--t-1)。在对这个第k+1个m*m/t的小区域求解中,游戏者已经进行了x次无雷操作,(之前的操作不算在内)也就是说此时m*m的矩阵(方阵)中已经有x个区域可以确定没有地雷了。
k=0,已解 1 2 1 1 2 1 1 2 1 2 1 2 3 ? ? ? ? ? ? ? ? 1 1 1 ? ? ? ? k=1.已解 2 1 2 2 2 2 2 2 2 2 2 2 1 1 1 1 。。。。。。 。。。。。。
第二步,整体概率分析,假设游戏者在无法对地雷分布进行严格判断,他就必须对这个小区域的某个未知区域猜测,这个区域每次猜测触雷的概率值都不同,将这些值平均起来就得到这些值的一个统计结果,设为P[k],所有雷的数量是n,
如果k=0,P[k]的分子就是n,因为共有n个雷,,分母就是m*m-x,就有
P[k]=(n-n*k/t)/(m*m-x-m*m/t*k)
但如果之前游戏者完全解出来了k个 m*m/t个区域,那么这k个区域有雷 n*k/t 个,单位区域m*m/t*k个。对于整体,还有 n-n*k/t个地雷,剩余的所有单位区域有m*m-m*m/t*k 如图3,那么有
P[k]=(n-n*k/t)/(m*m-x-m*m/t*k) 【1】
第三步,由于每个非雷区所代表的数字都是周围单位区域雷的数量,所以对于非雷区所代表的数字与周围雷数关系的分析就要以3*3区域这一个特殊单位为分析对象。m*m这个区域中有3*3区域的个数是m*m/(3*3)块。由于n个地雷是随机分布与m*m区域的,从统计学的角度上看,每一个3*3的区域分到地雷的数量是相等的,这个数量值就是
n/( m*m/(3*3))
如果某个3*3方阵中中间有数,那么这个数就是3*3区域雷的数量,也就是n/( m*m/(3*3)),这个数本身应该不大于这个3*3区中未知单位区域(不知道有没有雷的单位区域)数量的,但是当这个数[n/( m*m/(3*3))]等于未知单位区域数量时我们就可以判断出这些区域肯定是雷!但是在此之前,(这个数仅比未知单位区域数量少一),我们如果去猜测的话,触雷概率是最大值的,(因为只有一块单位区域不是雷)这样,的话这个相等条件就是一个临界值。这个3*3区域中间数c= n/( m*m/(3*3))是一个基于统计学的平均取值。
c= n/( m*m/(3*3)) 【2】
第四步,求这个3*3区域中未知单位区域的数量。在除了中间数c的8个单位区域中如果知道已知非雷单位区域的数量,那么有
d=【未知单位区域的数量】=8-【非雷单位区域的数量】
就可以求得这个3*3区域中未知单位区域的数量。
根据已知假设,在游戏者完全解出来了k个 m*m/t个区域的条件下,在这第k+1个m*m/t区域里共有的非雷单位区域数量为x,基于统计学这m*m/t区域有m*m/(3*3)/t个这样的3*3区域,也就有m*m/(3*3)/t个中间数c值,那么可能分布于非中间区域的非雷单位区域数量为x-m*m/(3*3)/t个。不仅如此这些数量的可能分布于非中间区域的非雷单位区域还平均分布到m*m/(3*3)/t个的3*3区域中,那么每个区域所分配到的可
能分布于非中间区域的非雷单位区域数量为(x-m*m/(3*3)/t)/(m*m/(3*3)/t),这也就是这个区域除了中间数c的8个单位区域中已知非雷单位区域的数量。由【未知单位
区域的数量】=8-【非雷单位
区域的数量】得到
d=【未知单位区域的数量】=8-{(x-m*m/(3*3)/t)/(m*m/(3*3)/t)}
d=9-x/(m*m/(3*3)/t)
d=9-t*x/(m*m/(3*3)) 【3】
第五步,根据第三步的叙述某个3*3方阵中中间有数c就是这个3*3区域雷的数量,也就是n/( m*m/(3*3)),这个数本身应该不大于这个3*3区中未知单位区域数量的,但是当这个数[n/( m*m/(3*3))]等于未知单位区域数量时我们就可以判断出这些区域肯定是雷!但是在此之前,(这个数仅比未知单位区域数量少一)我们如果去猜测的话,由于只有一块单位区域不是雷,触雷概率是最大的,这样的话这个相等条件就是一个临界值。即c=d;联立【2】【3】
【3*3区域中间数】=【未知单位区域数量】 c= n/( m*m/(3*3)) d=9-x/(m*m/(3*3)/t)
n/( m*m/(3*3))= 9-x/(m*m/(3*3)/t)
解x得
x=(m*m-n)/t 【4】
第六步,将代表3*3区域中间数c等于未知单位区域数量d这一临界条件下的x带入【1】式得
P[k]=(n-n*k/t)/(m*m-x-m*m/t*k)
P[k]=(n-n*k/t)/(m*m-m*m/t*k-(m*m-n)/t) P[k]=(n*t-n*k)/(m*m*t-m*m*k-m*m+n) 【5】
此式就代表在分割的m*m/t区域内,在无法完全判断出雷的未知前,猜测触雷的概率最大值和游戏设定的雷的数量n、隔离系数t、区域序号k的数学模型函数关系,这也是基于统计学的基本规律上分析的数学模型。
第七步,对于P[k]的取值,由于k不随x的变化而变化,所以假定k为一个常数,那么P[k]的取值是一个关于x的函数,式【5】只是取一个x的最大值临界,从中求得的P[k]的最值,为了更清晰得表述P[k]与游戏者猜测次数x的关系,和P[k] 最值与x的最大值临界的关系,我们也同时用函数图像来说明这些问题。
首先建立两个函数,P1(x)和P2(x),P1(x)就是前文第二步所说的,游戏者在无法对地雷分布进行严格判断的情况下对这个小区域的某个未知单位区域猜测触雷的概率值,有
P1(x)= (n-n*k/t)/(m*m-x-m*m/t*k) 【6】
而对于P2(x),我们定义它是在m*m/t的区域中的某个3*3区域猜测触雷概率,显然这是一个分式的形式,分母就是这个3*3区域中【未知单位区域的数量】也就是第四步定义求得的d值,为9-t*x/(m*m/(3*3)),分子就是3*3区域中所有雷的数量,也就是【3*3区域中间数】,即第三步中定义求得的c值,为n/( m*m/(3*3)),则P2(x)=c/d;有
P2(x)= {n/( m*m/(3*3))}/ {9-x/(m*m/(3*3)/t)} 【7】
其中保证P1(x)和P2(x)均小于一,并且第六步所说的那个临界点就是P2(x)这个函数值为1的x的取值。
第八步,根据第七步的求解对其他未知常数赋予合理的数值,用制图软件绘制出
P1(x)和P2(x)关于x的函数图像,如图
触雷概率
分析图像可以得到以下结果:
1,不论是P1(x)还是P2(x)他们是关于x的递增函数,说明如果游戏过程中总是进
行猜测的话,触雷的概率会越来越大。所以鼓励游戏者尽量通过已知条件推断判断未知单位区域的有无雷的情况。
2,在建立模型过程中,我们也不能忽略游戏者进行的必要猜测,那么我们可以对
猜测触雷概率的最大值P[K]用其他参数进行约束,从而达到控制游戏难度的实现。
第九步,概率分析法实现对游戏难度的控制。
基于第一步到第八步的从统计学角度对游戏进行的分析。我们从游戏角度上看,在保持游戏合理性的前提下,游戏猜测触雷的概率和能判断雷分布情况之前进行必要的无雷操作次数是衡量游戏难度的重要标准,也就是在保持游戏合理性的地雷范围内,过多的地雷会使游戏者进行比较少的操作就能判断出周围剩余的未知区域全是雷,过少的地雷则会是游戏者触雷概率减低,先求出难度最大值,对游戏难度的减低从减少地雷数量上下手。
上文提到衡量游戏难度的重要标准是“游戏猜测触雷的概率”和“能判断雷分布情况之前进行必要的无雷操作次数”根据前几步的分析,结合这两个标准,我们对影响游戏难度的模型进行猜想:
设难度系数W,由式【5】得:
【游戏猜测触雷的概率】= P[k]=(n*t-n*k)/(m*m*t-m*m*k-m*m+n)
令式【7】中的P2(x)=1;得到x的最大值也就是“能判断雷分布情况之前进行必要的无雷操作次数”这个值就是式【4】,即
x=(m*m-n)/t
将这两个代表决定难度因素的函数乘起来,得到计算难度系数的数学模型。 因此难度系数W有关系:
W=x* P[k]= {(n*t-n*k)/(m*m*t-m*m*k-m*m+n)}*{(m*m-n)/t} W=(n*t-n*k)(m*m-n)/{(m*m*t-m*m*k-m*m+n)*t} 【8】
对m、t、k取一个合适值(m=19、t=10、k=0)画出W关于n的函数图像。分析
得出,当n分布于180附近是游戏的难度是最大的,对函数进一步求解并由此得出
地雷数n 86 90 94 98 103 107 难度系数W 7.1 7.3 7.5 7.7 7.9 8.1 最大触雷概率P[k]% 25.86 27.03 28.19 29.36 30.81 31.97 地雷数n 112 118 124 131 139 150 难度系数W 8.3 8.5 8.7 8.9 9.1 9.3 最大触雷概率P[k] 33.41 35.14 36.86 38.86 41.14 44.25
第十步,结合上文叙述的地雷数量在最优化模型下的最大值和相关优化结果,我们从上表中得到以下难度分组,并自定义难度,得到结果: 新手 简单 中等 专业 大师 难度W 地雷数n 7.9 103 8.3 112 8.7 124 9.1 139 9.47 180
5.2.3 结果分析:
以上结果都是游戏开始的第一个m*m/t的区域下分析的结果。随着游戏进度的扩展,各种概率是不断变化的,由于地雷数量对于游戏难度的取值是在游戏开始的时候就已经确立的,所以我们就不考虑因为游戏进度而导致的变化。 模型分析:
六.c程序下固定地雷数量的结构化程序设计:
算法分析:
结构1,形成雷区,首先运行程序让地雷排布按固定数量形成。把地雷的分布模型假设成一个19*19的矩阵,其中每个元素只用1或0表示,其中1表示雷区,0表示非雷区。
那么地雷的分布方案就假设为一个二维数组(如f[19][19]).
假设在未知地雷数量的前提下,并且暂且不考虑对于任意的一个小郑方块,它周围的几个小方块不可以全部是地雷,也不可以没有地雷这一约束条件。那么19*19方阵中,每一个方阵单元存在的有两种可能,那么所有的可能的地雷分布方案有2的361(19*19)次方种,这个数有很大的数量级,不论是人为还是计算机都无法对其进行分析计算。
但是在地雷数量已知和约束条件(1)的前提下,可以排除掉很多种情况。我们可以写出一个算法让计算机把所有满足条件的地雷排布方案都算出来,然后从中随机取出
一个方案,形成地雷排布。
由于计算机程序只要在所有可能的地雷分布中随机输出其中一种代表地雷分布的情况,所以也不需要写出一个算法让计算机把所有的可能都计算并储存。我们就直接让计算机首先按照给定地雷数量随机生成一个地雷分布方案,然后检验这个方案是否是满足约束条件(1)的方案。如果不是,再次随机生成另一个方案,再检验。如果是就直接去这个方案为此次游戏的地雷排布方案,并结束循环。
如何随机的生成一个给定地雷数量的地雷方案呢?在代表地雷排布的二维数组(f[19][19])里,我们用到c程序里的随机数语句(rand()a+b)。先把这个二维数组初始化为0,表示每一个单位都没有地雷标记。然后将二维数组(f[19][19])里的行数和列数分别随机取出,(行数列数范围均为1--19)这样就实现在二维数组中随机取出一个单位。把这个随机取出的单位赋值为1,代表在这个单位上标记地雷,之后设计一个循环,重复这样的操作,知道把里面的n(已知地雷数)个原来是0的单位标记成表示有地雷的数字1.这样就做到了让计算计比较简单的随机输出一个满足条件的地雷排布方案。
基于我们假设的地雷矩阵模型和之前的算法分析,地雷的分布可以看成一个由计算机随机生成的问题。
结构2,执行游戏,
当雷区已经有一个二维数组(f[20][20])确立,并已经由结构1的程序随机生成,并且也是满足条件(1):“对于任意的一个小郑方块,它周围的几个小方块不可以全部是地雷,也不可以没有地雷”的分布。而作为输出方,程序本身要把这个“答案”存起来,并且要将其隐藏。在执行游戏的程序模块中,我们再定义一个二维的字符数组(g[19][19])把这个数组作为输出数组,初始化均为元素‘ * ’代表所有单位为未知的,供游戏者进行这个解密游戏。
开始游戏时输出19*19个符号‘ * ’,然后游戏者依次输入行数x和列数y。程序利用这个行数x和列数y带回表示雷区的二维数组(f[20][20])进行判断,如果f[x][y]为1代表游戏者已经触雷,如果f[x][y]为0代表游戏者没有触雷,程序就对那么这个非区域周围的地雷数量在二维数组(f[20][20])中进行加和,得到一个表示这个非雷区域周围地雷总数的值。
f[x-1][y-1]+f[x-1][y]+f[x-1][y+1]+f[x][y-1]+f[x][y+1]+f[x+1][y-1]+f[x+1][y]+f[x+1][y+1]
之后,把表示这个非雷区域周围地雷总数的值以字符的形式替换掉相应的g[x][y]中的‘ * ’,并再次输出二维数组g[19][19]里的所有符号。然后游戏者就可以在输出中看到这个原来是‘ * ’的这个单位变成了表示这个非雷区域周围地雷总数的值,游戏者再次输入行数和列数,重复上述过程。知道所有非雷区域都被游戏者翻开。
这里要注意的是,对于边界问题的解决,由于代表地雷分布的二维数组(f[20][20])初始值为0.有f[0][i] f[i][0] f[20][i] f[i][20](i为0—20的数)这些分布与边界的缓冲区域。由于这些数都是0,且有意义,所以在边界区域周围雷数的计算过程不会收到影响。保证了程序运行的准确性。
? (游戏代码见附录H)
七,参考文献
[1] 《 数学模型 》,姜启源,高等教育出版社,2003年版;
八: 附录:
A:
n=1:1:10;
sum=[0 3 7 13 21 29 41 55 72 88 ];
plot( n,sum,’:’ ), gtext('sum=f(n)'), gtext('n'), gtext('sum') B:
n=1:1:10;
sum=[0 3 7 13 21 29 41 55 72 88 ]; coef=polyfit(n,sum,2) C:
n=1:0.01:10;n1=1:1:10;
>> sum=0.9621*n.^2-0.8439*n+0.50000;
>> sum1=[ 0 3 7 13 21 29 41 55 72 88 ]; >> plot( n, sum,n1,sum1 ) D:
m1=1:0.01:8;m=1:1:7;
pm1=[ 0.25 0.5 0.75 1 1 1 1 ];
pm2=[ 0.11 0.22 0.33 0.44 0.55 0.66 0.77 ]; pm3=[ 0.25 0.375 0.5 0.625 1 1 1 ];
pm4=[ 0.16 0.32 0.48 1 1 1 0 ];pm5=0.5;
plot( m,pm1,'.',m,pm2,'^' ,m,pm3,'*',m,pm4,'+' ,m1,pm5),pm5=0.5;gtext('N=2');gtext('N=3');gtext('N=4');gtext('N=5'); E:
n=1:1:10;
sum=[ 0 3 3 8 12 16 23 33 39 52 ];
plot( n, sum,':' ), gtext('sum=f(n)'), gtext('n'), gtext('sum') F:
n=1:1:10;
sum=[0 3 3 8 12 16 23 33 39 52 ]; coef=polyfit(n,sum,2) G:
n=1:0.01:10;n1=1:1:10;
sum=0.5871*n.^2-0.8886*n+1.1833;
sum1=[0 3 3 8 12 16 23 33 39 52 ]; plot( n, sum,n1,sum1 ) H:
游戏代码:
#include
scanf(\ /* N是地雷数 */ memset(f,0,sizeof(f)); memset(g,'*',sizeof(g)); for(i=1;i<=N;) { sign=0;
m=rand() +1; n=rand() +1; if(f[m][n] == 0 &&m != 0 && n !=0 && m !=20 && n != 20) /* 保证这个地方本身还没有放地雷并是在1到19这个区域内 */ { p=f[m-1][n-1]+f[m-1][n]+f[m-1][n+1]+f[m][n-1]+f[m][n+1]+f[m+1][n-1]+f[m+1][n]+f[m+1][n+1]; /* 周围几个格子中数的和,包括下标为0的和20的,再分开考虑 */ if(p==0) sign=1; if((m==1&&n==1||m==19&&n==19||m==1&&n==19||m==19&&n==1)&&p==3) sign=1; else if(m!=1&&n!=1&&m!=19&&n!=19&&p==8) sign=1; else { if(p==5) sign=1; } sign=0; if(sign==0) { f[m][n]=1; i++; } }
} for(i=1;i<=19;i++) {
for(j=1;j<=19;j++)
printf(\ printf(\ }
scanf(\ k:if(f[x][y]==1) printf(\ else {
g[x][y]=f[x-1][y-1]+f[x-1][y]+f[x-1][y+1]+f[x][y-1]+f[x][y+1]+f[x+1][y-1]+f[x+1][y]+f[x+1][y+1]+48;
for(i=1;i<=19;i++) { for(j=1;j<=19;j++)
printf(\ printf(\ }
scanf(\ goto k; }
system(\ return 0; }
正在阅读:
关于扫雷游戏地雷的合理性设置的数学模型10-04
广东省金融突发事件应急预案06-10
非营利组织财务管理的探讨论文04-13
2018-2019年韶关市小升初数学模拟试卷(共10套)附详细答案附答05-07
5-基于Proengineer直齿锥齿轮参数化设计及其二次开发模型库的建立06-10
放风筝作文100字06-18
2018年广东工业大学计算机院831数据结构与C语言之C程序设计考研强化五套模拟题05-23
九《上》杠杆--计算专题(1)04-15
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 扫雷
- 地雷
- 合理性
- 模型
- 设置
- 数学
- 关于
- 游戏
- 《千里走单骑》读后感!
- 关于请求拨款购买消防车辆装备和消防器材的请示
- deimlxi网络 - 经济与企业管理简答题汇总
- 2014年五年级睿达杯100题电子版(含答案)
- 2017年社区七类人员培训题库(康复医学3)
- HK成功案例
- 文献检索综合检索实习报告
- 北邮 编译原理 自底向上语法分析实验报告
- 广元市利州区人民政府副区长杨振宇在大石荣山片区开发建设管理工作大会上的讲话
- 平顶山市城市规划委员会 全体会议纪要 - 图文
- 关于街头广告效果的调查报告
- 高等教育自学考试护理学导论试题
- 电源设备应知应会
- 我国城市流动人口管理
- 初中语文知识点《文学常识及鉴赏》《古代应用公文类(含奏议、赠序、铭文、祭文等)》同步精选含答 - 图文
- 煤矿职工安全应知应会教育培训基本教材
- 4变位齿轮
- 会议筹备情况报告
- 骑座式管板水平固定焊
- 报关技能大赛基础题