从上面的分析可以看出,24点游戏的开发是具备技术可行性的。
(2)经济可行性
本软件开发成本低,经济上是可以接受的。而且软件维护简单,实用性强,一次性开发使用,即可长久使用,我们要做的只是把软件加载在电脑上。当软件不能满足用户的需求时,只需要更新信息,以提高特定的功能模块。
从上面的分析可以看出,24点游戏的开发在经济方面是可行的。
(3)社会可行性
本游戏的开发主要为了完成毕业设计,开发的主体是个人,不存在法律上的侵权行为,也不会为社会造成影响,软件的社会可行性将从法律方面以及用户使用可行性方面进行分析。
①法律方面
本软件是根据纸牌24点游戏实际的游戏情况而开发,并且是在独立的环境下完成此软件的开发和设计的,没有可以抄袭的软件作品。
②用户使用可行性
本软件无需用户拥有高超的技术能力,在使用前也无需进行培训。
从上面的分析可以看出,24点游戏的开发是完全具备社会可行性的。
4 24点游戏的算法介绍
4。1 24点算法
穷举法是我在开发24点游戏时用到的主要思想。穷举法就是通过详细的方法来列出4个数字(包括添加,减去,乘法和圆括号)的可能性。我们需要确定的24个数字,4个运算符和2对括号(最多2对)可以计算出4个数字的组合【4】。我们用a,b,c,d代替4个数字,这样就有7种可能:1没括号的(比如a*b*c*d);2有括号的(比如(a * b) * c * d);3有括号的(比如(a * b * c) * d);4有括号的(比如a * (b * c) * d);5有括号的(比如(a * b) * (c * d));6有括号的(比如((a * b) * c) * d);7有括号的(比如(a * (b * c)) * d)。我们使用一种没括号的和一种有括号的做为例子。
没括号的算式中运算符和数字一共有7个(3个运算符和4个数字)。我们可以定义一个用于存放运算符和数字的数组。首先我们通过循环语句可以写出所有的表达式,例如(a+b+c+d,a+b+c-d,a+b+c*d,a+b+c/d…。)。下一步是确定操作的顺序,在没有括号的时候,第一个计算*和/。我们定义一个boolean函数,然后扫描数组,当扫描到/,*,则返回true,然后就直接运算。当所有的/,*运算全部完成时,将/,*运算生成的结果放在一个变量中,然后让该变量与下一个数字进行运算,直到运算全部完成之后将运算结果放到一个变量中。我们将该运算结果和24相减,若得出的值小于1E-6,表明此算术式可以算出24点。
有括号的算法在判断运算循序的时候会与没有括号的算法有所差别。而我们可以通过添加括号来改变运算循序。在这个情况下,我们依旧可以用一个boolean函数来判别运算顺序。我们在扫描存放表达式的数组时若碰到左括号,则先运算左括号后面的算式,接着再优先计算/,*。在算式形如(a * b) * c * d的情况下,我们先运算a*b生成一个结果,将该结果存放于另一个变量中,接着按照顺序和c、d进行运算,将最终结果减去24,若得出的值小于1E-6即表明此算术式可以算出24。剩余的有括号的算法与第2种情况相似,我们在此不累述。
在这里需要说明一下,我们为何要强调将最终的结果与1E-6相减呢?因为24点游戏的中间过程是可以存在有限小数和无线循环小数的,因此只能采取模糊的判别方式,即结果减去24若小于1E-6的话,则说明算式可以算出24点。
4。2 24点游戏输入表达式的判别算法
讨论了24点游戏的算法思想后,表达式的判别问题首当其冲。我们输入的数字和字符是否跟牌面显示的值相符是一个很关键的点。假设现在我们开始游戏,按下开始按钮,然后游戏界面显示了如下4张牌:黑桃A,草花5,红心5和方片5,要求算出24点。假设你要测试一下它的表达式判别的话,可以输入1+2+3+4这个算式。如果系统未直接提示回答正确的话,即可说明此游戏没有实现对表达式的判别。我们接下来将使用编译原理的知识对表达式进行判别。编译原理是一门分析计算机语言的文法和词法的学科,能够轻易地判断出表达式运算顺序和表达式输入是否正确[5]。我们输入一段字符串之后使用此方法进行文法分析和语法判断就可以轻松地判断出来。表达式顺序的问题可以通过一种叫逆波兰式的方法进行判断,这样就能按照一定的算法顺序对我们输入的运算符号和整形变量进行排列了【4】。举个例子,如果要得到a+b则逆波兰式为ab+;要得到(a+b)*c则逆波兰式为ab+c*;更复杂的形如a:=b*c+b*d,它的逆波兰式为abc*bd*+:=,从以上可知,逆波兰式能够省略掉所有有括号的表达式中的括号。文献综述