还剩9页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
电92丁健民2009010942王哲2009010921Part1课题任务“24点”是一种数学游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受这种游戏方式简单易学,能健脑益智,是一项极为有益的活动游戏的规则是一副牌中抽去大小王剩下52张,(如果初练也可只用1・10这40张牌)任意抽取4张牌(称牌组),用加、减、乘、除(可加括号)把牌面上的数算成24每张牌必须用一次且只能用一次,如抽出的牌是
3、
8、
8、9,那么算式为(9—8)X8X3或3X8+(9—8)或(9-84-8)X3等就游戏编程角度而言,程序需要实现要求玩家输入A,2~10,J,Q,K中任意四个数字(允许重复),计算机判断是否可以计算使其值等于24,并输出表达式Part2解题思路与计划24点游戏CopyrightPTHU丁健民2009010942王哲
20090109214.重难点函数说明本程序包含了头文件windows.h,利用这个头文件我们定义了9次且只能用一次】函数locatexy,clrscr0locatexy函数通过定义句柄,再定位光请嘤■版本0:追出:游:戏il标的形式利用windows.h中包含的库函数使光标到达想要的位l.置clrscr函数利用locatexy函数先定位光标,再打印一系列空格,达到清屏的效果这也是本程序的一大特色calResult函数o口用来存放运算符,对于[]和expression这两个数组,使用precede函数来进行排序element暂时存放整型数据通过入字符变量并判断ASCII代码的形式筛选出0・9之间的数字并标记从标记处读入整型数据最后结果若读入四个整型数据并且这四个数据与计算机所选数据相同不分先后,则说明输入的数字正确否则返回0,这其中,遇到整型数据,expression^]的i加1,使在使用percede函数时expression[i]总为运算符号然后通过排序的结果和数据进行计算d[]用来存放每次的计算值最后输出最终结果print_lnfo函数,这也是本程序的一个特色,通过这个函数实现了人和计算机的完美配合,可以选择的选项达到9个之多这个函数也是各个函数之间的中转站在feedBack,help_lnfo等函数中均有调用,可以通过它实现对不同函数的灵活调用output函数此函数参数比较多,可以精确控制输出的表达式checkout函数此函数是本程序的核心之一,用来判断数组中的数能否经过计算得到24原理与前几个版本的大同小异,唯一不同的是调用了一些其他函数,如sort,calculate等缩短了代码的长度precede函数在calResult函数中调用,定义了一个二维字符数组,用来判断运算符号的优先级feedback,help_lnfo函数不可或缺的中转函数;file函数定义两个文件指针达到读写排行榜的目的;sort函数通过定义两个整型数组,一存放,一使用的方法对除了first以外的三个整型数据进行排序,以便运算;calculate,operate函数都是进行一次运算,不同为calculate函数传递的代表运算符号的变量为整型,operate的为字符变量,且calculate运算方式较多;其他的函数或是较短,或是较为简单,在这里就不再赘述Part4心得体会当点击“提交作业”的一瞬,终于算是松了口气,这些日子,为了筹备24点的大作业实在用心用力颇多,“天道酬勤”,希望可以收获圆满的结局回首筹备大作业的这些天,感触颇多,收获颇多1体会到了编写一个大程序的艰辛与不易细数下来,我们编写的程序代码将近900行,已经将我们折磨得“死去活来”,更何况我们编写的还是一个并不算大的“大程序二原先自己非常反感微软打击盗版,可现在想来,一个XP系统几千万行代码,都是程序员用键盘一行一行敲出来的,知识产权的保护制度在中国还很不完善,人们也多没有此意识,因此盗版成风乃是必然中国要想迈入发达国家之列,知识产权保护势在必行!2认识到了函数“封装”的必要性如果整个程序仅由一个main函数构成,我们实在很难想象这个程序将有多么的混乱,可读性差不说,别无它用,相反,如果将不同功能封装在不同的函数中,使用时进行调用,将大大增强程序的可读性和利用率在这次程序编写中体现得较为明显的一点是,在三个版本的程序中,均调用了change函数将玩家输入的A〜K牌组转化为整型数据1〜133体会到团队合作的重要性在此次编写24点游戏的过程中,我们小组两名同学合理分工,共同协作完成了最后的程序和文档因为作为这样一个“大程序”,以一人之力往往很难完成,倒不是说能力不够,只是缺少另一名同学的鼓励以及提供新颖独特的思考问题的角度,能否坚持下来首先是个问题,更不要说“一条道走到黑”的恶果了因此,一个巨型程序的背后往往有与其规模匹配的程序员队伍以一己之力完成霸业的英雄已不属于这个时代,团队的合作才是创造神话的必经之路
(4)认识到编程的核心是思路的形成入门C语言,首先应该掌握什么?是语言的语法还是算法思路?老实说在前半学期我们不大理解何老师为什么那么强调算法思路的重要性,进入后半学期,再经过完成此次大作业,我们意识到,会语言的语法,你至多只能成为一名电脑前的程序员,而掌握算法思路,你才可能算是迈入软件设计的殿堂,成为专家甚至大师,因为“思维比知识更重要”(爱因斯坦)最后感谢何老师和各位助教以及课代表的辛勤工作,正是因为有你们,我们很能踏进程序设计的殿堂游戏主界面【24点游戏视频链接】我们首先把课题任务分为三部分
1.输入A,2~10,J,Q,K中任意四张牌,
2.判断是否可以计算使其值等于24,
3.输出表达式首先由游戏者输入符合上述条件的四张牌,由于不能直接将牌进行计算,因此需要将牌转化为其所对应的数字,这个功能可以通过字符串函数来实现得到四个数字后,要判断它能否通过加减乘除四种运算得到24o我们最初的想法是,可以在这四个数字组成的所有可能的表达式中搜索,在计算的同时记录本次的计算过程,如果此表达式的结果为24,则通过记录结果来输出表达式,这即是“穷举法”的思路列出所有的表达式通过控制数字及运算法则循环来实现,对其中两个数进行一次运算得到一个数,再在剩下的三个数中选出两个再进行一次运算,然后对最后的两个数字进行运算,判断是否可以得到24记录表达式通过记录循环参数实现最后,根据记录的循环参数输出表达式,括号的输出可以通过输出模板来实现,经分析,两种模板可以符合输出的要求我们试图对上述思路进行简化经过计算,对于给定的四个数字,所有符合标准的表达式共有A*X43XC§.5+1+1=10752种考虑到种类过多,算法繁琐,再结合我们曾经学过的函数的递归调用,我们想到对于第二部分,可以只进行一次运算,在这次运算中如果得不到24,就进行“后悔”,退回到上一步计算,这种“后悔”算法可以通过将判断函数的结果传递到一个函数,再将另一个函数的结果对判断函数进行反馈,使判断函数能够正确判断来实现算法的简化以及运算量的减少,这即是“回溯法”的思想这样可以实现判断函数的多次调用,直到得到正确结果24这样就可以大大减少运算量做完上面的事情后,我们又结合了所学的猜数与反猜数游戏,联想到可以使游戏增加一种由计算机给出数字,人来计算的方式四个数字通过所学的随机数选取的方式得到对这四个数通过上面的方式判断其能否计算得到24,并得到表达式在这个“反24点游戏”中,最重要的是判断人输入的表达式是否正确首先读入人输入的表达式,再在这个表达式中选取整型数据,判断这四个数字与计算机给出的四个数字相同与否可以通过建立两个数组(一个存放数字,一个存放数字个数),再控制其循环的方式实现如果不完全相同,则认为其输入错误,否则进行下一步判断计算表达式的结果由于加减乘除及括号有其优先级,先通过一个判断优先级的函数判定下一步运算,直至所有运算完成;判断优先级可以通过建立二维字符数组的方法实现如果最后的结果等于24,则认为其输入正确,并邀请此人留下姓名在游戏开始和结束时分别记录时间,将此时间做差,如果此时间能够在排行榜中排至前五(以短为前),则将其数据(姓名,时间)写入记录排行榜的文本文档总之,目前程序(主要指终结版本)在除实现课题要求的任务外,还实现了
1.添加了背景音乐(通过playsound函数实现)
2.修改了界面的前景色、后景色(通过stdlib头文件中实现)
3.中英文界面
4.清屏功能,避免不同版本的游戏界面在同一界面堆积,使界面简明轻快
5.计算机出题,人来计算24点,当人无法算出结果时,由计算机产生答案
6.建立排行榜,并且直接在程序中显示,且可随时查看因编码为二进制文件,避免了人为的修改Part3循序渐进多版本描述“穷举版”程序说明
1.各函数的功能int feedback(int a[]);时输入数字迸行反馈int caloperator(int x,int y,int i,int j,char operation!]);j二七int outputinta,int b,int cjntd;〃构i void version」;”穷入;-少版函汶
3.游戏界面请输入四张Af之间的牌以空格分开,退出请输入000A234此牌组是有效的,其中一神算法〈<1,2〉・3〉*4=24请输入四张之间的牌以空格分开,退出请输入000游戏主界面
4.重难点函数说明output函数是本程序的重点和难点所在,本函数将所有可能的表达式分为两类第一种表达式类型A#B#C#D=24,第二种表达式类型A#B#C#D=24,在每种表达式类型中,如第一种表达式类型,通过依次运算变换不同的运算符,value
[0]=caloperatora,b,ope
[0],0,operation;value
[1]=caloperatorvalue
[0],c,o pe
[1],1,operation;value
[2]=caloperatorvalue
[1],d,ope
[2],2,operation;将每个分步的表达式结果存在value
[0],value
[1],value
[3]中,其中最后一步表达式结果value
[3]也即整个一步表达式结果,因此,当value
[3]等于24时,表明该牌组可组成24,并打印表达式巧妙地将表达式分为两类,为应用穷举法提供了便捷,因此也就达到了我们通过穷举实现输出表达式的目的“回溯版”程序说明
1.各函数的功能void calbackfloat a,float b,float c,float d,int j;〃各运策时WJ voidbackfloata,float b,float c,float d,int j;.M1■L voidplusfloat a,float b,float c,float d,int j;行!j|Ui勺运*void minusfloata,float b,float c,float d,int j;j械I们void multiplyfloata,float b,float c,float d,intj;F却void dividefloata,float b,float c,float d,int j;ii行除的认匚voidversion_2;//回溯版主函数
2.游戏进程
3.游戏界面请输入四张A%的牌(以空格分开)A23424=12*212=4*34=1*4继续游戏请输入1;退出请输入游戏主界面
4.重难点函数说明回溯版的核心在于回溯算法,解决方案重点在于4个数算出的结果如果不能在该步运算出24能否后悔还原会上一次循环或递归后悔正是回溯算法的中心思想,在得不到真正的结果的时候退回上一步,back函数正是本版本的核心,在back中调用plus和multipIyO各一次,divide和minus各两次,原因是加法和乘法具有交换律而减法和除法则不具有交换律而在调用的这些函数,如plus中,又返回去调用back,事实上每种运算被调用时,只对首尾两数进行运算,因此需变化首尾两数不计顺序,共调用back函数共6次,为简化程序,专门写一个函数calback为6个首尾两数不同的back函数,这样每个运算函数只需调用calback即可每种运算函数将首尾两数的运算结果存入首数,调用back后如发现首数为24a+b+c+d==24与a==24||b==24||c==24||d==24无异,并且运算符使用总次数为3由参数j控制,则令i=1,而i=1即是相应运算打印分步表达式的信号经过这样--个相互调用的回溯过程,即实现了我们编程的目标“终结版本”程序说明
1.各函数的功能double operatechar oper,double a,double b;根扣:,五打i.E次,玄W charprecedechar oper1,char oper2;〃5符时J七「二上级;;■.int calResultchar*expression,int*poker;j4;j入表达式的涪果double fabsdoublea;//求冷对int sortintstar,int remain[],int temp[];//对瑚卜l勺个S.-Hjfll ij-float calculatefloata,float b,int n;/根hf仲谣的整型参数进行char oper_posint n;charoper_invint n;void outputintsignjnt k,int first,int remain[],int m,int n;//「Ml|;-l个汶%得到24的表达式int checkoutint*poker,int flag;//检验数组是否符合能够运算产生24的条件,若传递的整型数据flag为1则输出表达式void clearSpacechar*p;/去除7仰中的空格void feedBack;//游戏界面对输入进行反馈void help_lnfo;//打印游戏规则及排行榜void generate;//‘I ISvoid locatexyintnX,int nY;〃将光标移动到拒走仲.昔void languageSet;//勺E冲J选择1普void print_lnfoint n;〃打l J各类游戏i,息void clrscrintxjnt y;//洁除拼常并使光标指向指定位置void pauseintn;〃打卬“请按回车键继纣..…”,川「各游戏环节间切换void fileintn;//.;;z,J I:.I;;int version_3fl
2.游戏进程欢迎来到速算游戏Welcome togame-speed calculation请您选择提示语言的种类,1为汉语,2为英语Please selectthe language,one forChinese,two forEnglish您选择1Choose:你选择的是中文,是否不再询问N请按回车键继续.....初始界面选择语言―欢迎进入速算24游戏八盘磊懿益景•开始游戏艰看游戏规则及排行榜屹出游戏游戏界面〜人欢迎进入逮算24游戏~人以下是避戏选项
1.开始游戏
2.查看游戏规则及排行榜
3.退出游戏请输入酸戏选项1薄曹露甥蒐号将下面四个基数组成一串算式,使它的值为24,.返回
2.产生一个答案
3.检验一组基数敲“回车〃键开始输入并计时....游戏模式。