




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机程序设计基础 24点游戏 王哲&丁健民24点游戏电92 丁健民(2009010942) 王哲(2009010921)Part 1课题任务“24点”是一种数学游戏,正如象棋、围棋一样是一种人们喜闻乐见的娱乐活动。它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。这种游戏方式简单易学,能健脑益智,是一项极为有益的活动。游戏的规则是一副牌中抽去大小王剩下52张,(如果初练也可只用1-10这40张牌)任意抽取4张牌(称牌组),用加、减、乘、除(可加括号)把牌面上的数算成24。每张牌必须用一次且只能用一次,如抽出的牌是3、8、8、9,那么算式为(9
2、8)×8×3或3×8(98)或(98÷8)×3等。就游戏编程角度而言,程序需要实现:要求玩家输入A,210,J,Q,K中任意四个数字(允许重复),计算机判断是否可以计算使其值等于24,并输出表达式。Part 2解题思路与计划游戏主界面【24点游戏视频链接】我们首先把课题任务分为三部分:1.输入A,210,J,Q,K中任意四张牌,2.判断是否可以计算使其值等于24,3.输出表达式。首先由游戏者输入符合上述条件的四张牌,由于不能直接将牌进行计算,因此需要将牌转化为其所对应的数字,这个功能可以通过字符串函数来实现。得到四个数字后,要判断它能否通过加减
3、乘除四种运算得到24。我们最初的想法是,可以在这四个数字组成的所有可能的表达式中搜索,在计算的同时记录本次的计算过程,如果此表达式的结果为24,则通过记录结果来输出表达式,这即是“穷举法”的思路。列出所有的表达式通过控制数字及运算法则循环来实现,对其中两个数进行一次运算得到一个数,再在剩下的三个数中选出两个再进行一次运算,然后对最后的两个数字进行运算,判断是否可以得到24。记录表达式通过记录循环参数实现。最后,根据记录的循环参数输出表达式,括号的输出可以通过输出模板来实现,经分析,两种模板可以符合输出的要求。我们试图对上述思路进行简化。经过计算,对于给定的四个数字,所有符合标准的表达式共有A4
4、4×43×(C52-5+1+1)=10752种。考虑到种类过多,算法繁琐,再结合我们曾经学过的函数的递归调用,我们想到对于第二部分,可以只进行一次运算,在这次运算中如果得不到24,就进行“后悔”,退回到上一步计算,这种“后悔”算法可以通过将判断函数的结果传递到一个函数,再将另一个函数的结果对判断函数进行反馈,使判断函数能够正确判断来实现算法的简化以及运算量的减少,这即是“回溯法”的思想。这样可以实现判断函数的多次调用,直到得到正确结果24。这样就可以大大减少运算量。做完上面的事情后,我们又结合了所学的猜数与反猜数游戏,联想到可以使游戏增加一种由计算机给出数字,人来计算的方式
5、。四个数字通过所学的随机数选取的方式得到。对这四个数通过上面的方式判断其能否计算得到24,并得到表达式。在这个“反24点游戏”中,最重要的是判断人输入的表达式是否正确。首先读入人输入的表达式,再在这个表达式中选取整型数据,判断这四个数字与计算机给出的四个数字相同与否可以通过建立两个数组(一个存放数字,一个存放数字个数),再控制其循环的方式实现。如果不完全相同,则认为其输入错误,否则进行下一步判断:计算表达式的结果。由于加减乘除及括号有其优先级,先通过一个判断优先级的函数判定下一步运算,直至所有运算完成;判断优先级可以通过建立二维字符数组的方法实现。如果最后的结果等于24,则认为其输入正确,并邀
6、请此人留下姓名。在游戏开始和结束时分别记录时间,将此时间做差,如果此时间能够在排行榜中排至前五(以短为前),则将其数据(姓名,时间)写入记录排行榜的文本文档。总之,目前程序(主要指终结版本)在除实现课题要求的任务外,还实现了:1.添加了背景音乐(通过playsound函数实现)2.修改了界面的前景色、后景色(通过stdlib头文件中实现)3.中英文界面4.清屏功能,避免不同版本的游戏界面在同一界面堆积,使界面简明轻快。5.计算机出题,人来计算24点,当人无法算出结果时,由计算机产生答案。6.建立排行榜,并且直接在程序中显示,且可随时查看。因编码为二进制文件,避免了人为的修改Part 3循序渐进
7、多版本描述“穷举版”程序说明1.各函数的功能int feedback(int a);/对输入数字进行反馈int caloperator(int x,int y,int i,int j,char operation);/对两数进行一次运算int output(int a,int b,int c,int d);/构造表达式判断并输出四0退出游戏void version_1();/”穷举一步版”主函数2.游戏进程主函数version_1( )有数字小于1或大于13重新输入输入反馈录入四个数字输入正确 对四个数的每种排列调用output()判断是否可以构造结果为24的表达式若可行,则令flag=1,并
8、跳出循环,否则,打印无解3.游戏界面游戏主界面4.重难点函数说明output()函数是本程序的重点和难点所在,本函数将所有可能的表达式分为两类:第一种表达式类型(A#B)#C)#D=24,第二种表达式类型(A#B)#(C#D)=24,在每种表达式类型中,如第一种表达式类型,通过依次运算(变换不同的运算符),value0=caloperator(a,b,ope0,0,operation);value1=caloperator(value0,c,ope1,1,operation);value2=caloperator(value1,d,ope2,2,operation);将每个分步的表达式结果存在
9、value0,value1,value3中,其中最后一步表达式结果value3也即整个一步表达式结果,因此,当value3等于24时,表明该牌组可组成24,并打印表达式。巧妙地将表达式分为两类,为应用穷举法提供了便捷,因此也就达到了我们通过穷举实现输出表达式的目的。 “回溯版”程序说明1.各函数的功能void calback(float a,float b,float c,float d,int j); /各运算时调用回溯void back(float a,float b,float c,float d,int j);/回溯声明void plus(float a,float b,float c
10、,float d,int j);/进行加的运算 void minus(float a,float b,float c,float d,int j);/进行减的运算 void multiply(float a,float b,float c,float d,int j);/进行乘的运算 void divide(float a,float b,float c,float d,int j);/进行除的运算 void version_2( );/回溯版主函数2.游戏进程主函数version_2( )调用back( )看是否可以组成24,否则变换首尾两数(不计顺序),直至可以组成24录入四个数字3.游戏
11、界面游戏主界面4. 重难点函数说明回溯版的核心在于回溯算法,解决方案重点在于4个数算出的结果如果不能在该步运算出24能否后悔还原会上一次循环或递归。后悔正是回溯算法的中心思想,在得不到真正的结果的时候退回上一步。,back()函数正是本版本的核心,在back()中调用plus()和multiply()各一次,divide()和minus()各两次,原因是加法和乘法具有交换律而减法和除法则不具有交换律。而在调用的这些函数,如plus()中,又返回去调用back(),事实上每种运算被调用时,只对首尾两数进行运算,因此需变化首尾两数(不计顺序),共调用back()函数共6次,为简化程序,专门写一个函
12、数calback()为6个首尾两数不同的back()函数,这样每个运算函数只需调用calback()即可。每种运算函数将首尾两数的运算结果存入首数,调用back()后如发现首数为24(a+b+c+d=24与a=24|b=24| c=24|d=24无异),并且运算符使用总次数为3(由参数j控制),则令i=1,而i=1即是相应运算打印分步表达式的信号。经过这样一个相互调用的回溯过程,即实现了我们编程的目标。 “终结版本”程序说明1.各函数的功能 double operate(char oper, double a, double b);/ 根据运算符进行一次运算 char precede(char
13、 oper1,char oper2);/ /判断符号的优先级别 int calResult( char *expression,int *poker);/计算输入表达式的结果 double fabs(double a); /求绝对值 int sort(int star,int remain,int temp); /对剩下的三个数进行排序 float calculate(float a,float b,int n);/ 根据传递的整型参数进行一次运算 char oper_pos(int n);/ 返回运算符(正序) char oper_inv(int n); /返回运算符(逆序) void ou
14、tput(int sign,int k,int first,int remain,int m,int n); /输出四个数经运算得到24的表达式 int checkout(int *poker,int flag); /检验数组是否符合能够运算产生24的条件,若传递的整型数据flag为1则输出表达式 void clearSpace(char*p);/去除字符串中的空格 void feedBack();/游戏界面对输入进行反馈 void help_Info();/打印游戏规则及排行榜 void generate();/随机产生四张牌 void locatexy(int nX, int nY);/将
15、光标移动到指定位置 void languageSet();/初始时选择语言 void print_Info(int n);/打印各类游戏信息 void clrscr(int x,int y); /清除屏幕并使光标指向指定位置 void pause(int n); /打印“请按回车键继续.”,用于各游戏环节间切换 void file(int n);/读写排行榜int version_3()/终结版本的主函数2.游戏进程主函数version_3( )清屏,选择语言种类读入排行榜board.txt将结构体所有元素归零提示重新输入表达式错误记录姓名和时间到排行榜表达式正确直接输入表达式检验一组基数选项
16、3 产生一个答案选项2返回游戏选项界面选项1游戏模式计算机随机选取四张牌选项1:开始游戏打印游戏规则及排行榜选项2:查看游戏规则及排行榜选项3:结束游戏游戏选项清屏,打印游戏界面3.游戏界面初始界面选择语言 游戏界面游戏模式4.重难点函数说明本程序包含了头文件<windows.h>,利用这个头文件我们定义了函数locatexy(),clrscr()。locatexy()函数通过定义句柄,再定位光标的形式(利用<windows.h>中包含的库函数)使光标到达想要的位置。clrscr()函数利用locatexy()函数先定位光标,再打印一系列空格,达到清屏的效果。这也是本程
17、序的一大特色。calResult()函数:o用来存放运算符,对于o和expression这两个数组,使用precede()函数来进行排序。element暂时存放整型数据。通过入字符变量并判断ASCII代码的形式筛选出0-9之间的数字并标记。从标记处读入整型数据。最后结果若读入四个整型数据并且这四个数据与计算机所选数据相同(不分先后),则说明输入的数字正确(否则返回0),这其中,遇到整型数据,expressioni的i加1,使在使用percede()函数时expressioni总为运算符号。然后通过排序的结果和数据进行计算。d用来存放每次的计算值。最后输出最终结果。print_Info ()函数
18、,这也是本程序的一个特色,通过这个函数实现了人和计算机的完美配合,可以选择的选项达到9个之多。这个函数也是各个函数之间的中转站。在feedBack(),help_Info()等函数中均有调用,可以通过它实现对不同函数的灵活调用。output()函数:此函数参数比较多,可以精确控制输出的表达式。checkout()函数:此函数是本程序的核心之一,用来判断数组中的数能否经过计算得到24。原理与前几个版本的大同小异,唯一不同的是调用了一些其他函数,如sort(),calculate()等。缩短了代码的长度。precede() 函数:在calResult()函数中调用,定义了一个二维字符数组,用来判断
19、运算符号的优先级。feedback(),help_Info()函数:不可或缺的中转函数;file()函数:定义两个文件指针达到读写排行榜的目的;sort()函数:通过定义两个整型数组,一存放,一使用的方法对除了first以外的三个整型数据进行排序,以便运算;calculate(),operate()函数:都是进行一次运算,不同为calculate()函数传递的代表运算符号的变量为整型,operate()的为字符变量,且calculate()运算方式较多;其他的函数或是较短,或是较为简单,在这里就不再赘述。Part 4心得体会当点击“提交作业”的一瞬,终于算是松了口气,这些日子,为了筹备24点的大作业实在用心用力颇多,“天道酬勤”,希望可以收获圆满的结局。回首筹备大作业的这些天,感触颇多,收获颇多:(1)体会到了编写一个大程序的艰辛与不易细数下来,我们编写的程序代码将近900行,已经将我们折磨得“死去活来”,更何况我们编写的还是一个并不算大的“大程序”。原先自己非常反感微软打击盗版,可现在想来,一个XP系统几千万行代码,都是程序员用键盘一行一行敲出来的,知识产权的保护制度在中国还很不完善,人们也多没有此意识
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国移动鸡西市2025秋招笔试题库含答案
- 临汾市中石油2025秋招笔试模拟题含答案法律与合规岗
- 中国广电焦作市2025秋招笔试行测题库及答案市场与服务类
- 宜昌市中石油2025秋招面试半结构化模拟题及答案油品分析质检岗
- 克拉玛依市中储粮2025秋招面试专业追问题库综合管理岗
- 中国移动襄阳市2025秋招笔试行测题库及答案互联网运营
- 巴彦淖尔市中储粮2025秋招财务资产岗高频笔试题库含答案
- 中国广电克拉玛依市2025秋招笔试行测题库及答案财务审计类
- 国家能源六安市2025秋招面试专业追问及参考法学岗位
- 2025年供热二次网考试题及答案
- (正式版)SHT 3158-2024 石油化工管壳式余热锅炉
- 多格列艾汀使用指南2024课件
- 居民电费户名更改委托书
- (2024年)面神经炎课件完整版
- 机动车交通事故责任纠纷民事起诉状(模板)
- 铝锭质检报告
- 《群英会蒋干中计》课件38张 2023-2024学年高教版(2023)中职语文基础模块下册
- 保密监督与检查方法培训
- 宁夏差旅费报销标准
- 2022版义务教育语文课程标准小学语文学习任务群解读的七个维度
- 妊娠合并先心病指南解读专家讲座
评论
0/150
提交评论