一、题目内容
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式。
二、算法设计思路
利用产生随机数的函数rand()产生四个范围为1到13的随机数字存放到数组card【】中,分别代表从扑克牌中抽取到的四张卡牌,为了保证四个数字不相同,设计一个循环用于判断产生的随机数字是否已经产生过,产生过则重新产生一个随机数对数组中的项进行赋值,没有产生过则直接使用这个随机数赋值给数组中的项。
产生了四个不同的随机数之后,根据表达式中存在4个数据3个运算符设计一个4重循环用于对表达式中的4个数据进行赋值,保证4个数据出现所有的组合,另外设计一个3重循环用于对表达式中的3个操作符进行赋值,保证3个操作符也出现所有的组合,因为有3个基本运算,于是可以有6种运算顺序,则设计一个循环,循环中使用一个switch()语句使用不同的运算顺序,保证每一个表达式中出现所有的运算顺序,也就是加入小括号的功能。调用3次实现两个运算数的运算的函数fun()即表示算出我们所需的表达式,3次函数不同的调用顺序完成小括号的功能。fun()函数如下图所示:

三、程序代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
float card[4];
char symbol[4]={'+','-','*','/'};
void extractcard()                              //产生四个随机数据并显示在屏幕上
{printf("从卡牌中抽取4张卡牌的结果为:\n");srand(time(NULL));for(int i=0;i<4;i++){card[i]=rand()%13+1;if(i!=0){for(int k=i-1;k>=0;k--){if(card[i]==card[k]){i--;k=0;}}}}for(i=0;i<4;i++){if(card[i]==1)printf("A\t");else if(card[i]==11)printf("J\t");else if(card[i]==12)printf("Q\t");else if(card[i]==13)printf("K\t");elseprintf("%.0f\t",card[i]);}
}
float fun(float k,float l,int i)                        //两个数据之间的运算
{float tem;switch(i){case 0:tem=k+l;return tem;break;case 1:tem=k-l;return tem;break;case 2:tem=k*l;return tem;break;case 3:tem=k/l;return tem;break;}
}
void calculate()
{float temp1=0;float temp2=0;float result; printf("以下是利用抽取的4张卡牌结合加减乘除运算可以得到结果24的组合(A代表1,J代表11,Q代表12,K代表13,每张卡牌只能使用一次):\n");for(int i=0;i<4;i++)                 //第一个运算数循环for(int j=0;j<4;j++)                //第二个运算数循环for(int k=0;k<4;k++)            //第三个运算数循环for(int l=0;l<4;l++)        //第四个运算数循环{if(i==j||i==k||i==l||j==k||j==l||k==l)   //四个运算数不能存在相同continue;else{for(int n=0;n<4;n++)               //第一个运算符循环for(int m=0;m<4;m++)            //第二个运算符循环for(int p=0;p<4;p++)        //第三个运算符循环for(int q=0;q<6;q++)    //运算顺序循环{result=0;switch(q){case 0:temp1=fun(card[i],card[j],n);temp1=fun(temp1,card[k],m);result=fun(temp1,card[l],p);if(result==24)printf("((%.0f%c%.0f)%c%.0f)%c%.0f=24\n",card[i],symbol[n],card[j],symbol[m],card[k],symbol[p],card[l]);break;case 1:temp1=fun(card[i],card[j],n);temp2=fun(card[k],card[l],p);result=fun(temp1,temp2,m);if(result==24)printf("(%.0f%c%.0f)%c(%.0f%c%.0f)=24\n",card[i],symbol[n],card[j],symbol[m],card[k],symbol[p],card[l]);break;case 2:temp1=fun(card[j],card[k],m);temp1=fun(card[i],temp1,n);result=fun(temp1,card[l],p);if(result==24)printf("(%.0f%c(%.0f%c%.0f))%c%.0f=24\n",card[i],symbol[n],card[j],symbol[m],card[k],symbol[p],card[l]);break;case 3:temp1=fun(card[k],card[l],m);temp2=fun(card[i],card[j],p);result=fun(temp1,temp2,n);if(result==24)printf("(%.0f%c%.0f)%c(%.0f%c%.0f)=24\n",card[i],symbol[n],card[j],symbol[m],card[k],symbol[p],card[l]);break;case 4:temp1=fun(card[j],card[k],p);temp1=fun(temp1,card[l],n);result=fun(card[i],temp1,m);if(result==24)printf("%.0f%c((%.0f%c%.0f)%c%.0f)=24\n",card[i],symbol[n],card[j],symbol[m],card[k],symbol[p],card[l]);break;case 5:temp1=fun(card[k],card[l],p);temp1=fun(card[j],temp1,m);result=fun(card[i],temp1,n);if(result==24)printf("%.0f%c(%.0f%c(%.0f%c%.0f))=24\n",card[i],symbol[n],card[j],symbol[m],card[k],symbol[p],card[l]);break;}}}}
}
void main()
{extractcard();calculate();
}

四、测试截屏
第一次测试结果如下图所示

第二次测试结果如下图所示

五、总结
在编写程序时遇到了一些困难:出现了一些乱码,程序无限循环不能正常运行,条件选择出现错误执行等等。最后都慢慢修改得到解决,并有以下总结:
1.在编写程序代码时使用循环语句和条件选择语句的时候很容易出错,要么无限循环,要么是无法完成预期的功能,所以在编写循环语句的时候可以在语句中添加中间变量用于查看哪里出现了错误,程序完成之后可以直接在中间变量部分加上注释,方便理解也不会对程序运行结果产生负面影响。
2.在完成复杂的算法时,尽量使用多个自定义函数进行嵌套完成算法的功能,如果写在一个函数中不便于理解也不便于修改。
3.在写代码时,先在主函数中写出大框架然后编写自定义函数的功能代码,每完成一小步进行测试,这样出现错误时方便找到问题的所在。

24点游戏(随机产生四个不同的1到13的随机数据外加加减乘除构成表达式,输出结果等于24的表达式)相关推荐

  1. SRPG游戏开发(四十)第九章 战斗系统 - 二 计算战斗数据(Calculate Combat Data)

    返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...

  2. 24点游戏java_Java实现24点小游戏

    一.引育Java是当今最热门的编程语言,它的跨平台与网络应用方面的强大功能使之非常适用于网络游戏的开发.Jav.不仅功能简单,还很容易上手,对于新手来说,做一些简单的游戏相对容易.24点小游戏涉及Ja ...

  3. 趣味数学:解24点游戏小技巧

    漫漫暑假怎么度过呢?大笨兔给大家介绍一种趣味游戏吧.就是之前大笨兔在博客中提到的24点游戏 二十四点是一种益智游戏,它能在游戏中锻炼人们的心算,它往往要求人们将四个数字进行加减乘除四则混合运算(允许使 ...

  4. 1.16 24点游戏

    24点游戏的解决办法,也是采取穷举法的思路,4个数,有4!=24中排列的方法,然后3个操作符号,有4×4×4 = 64种结果,再加上括号,有5种结果,于是,每4个数有24*66*5 = 7680中结果 ...

  5. cdoj 1252 24点游戏 dfs

    24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Descr ...

  6. Cdoj 24点游戏之解题报告

    24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Descr ...

  7. Java黑皮书课后题第7章:*7.29(游戏:挑选四张牌)编写一个程序,从一副52张牌中选出4张,然后计算它们的和。Ace King Quee Jack分别表示1、13、12和11,显示得到和24的次

    *7.29(游戏:挑选四张牌)编写一个程序,从一副52张牌中选出4张,然后计算它们的和.Ace King Quee Jack分别表示1.13.12和11,显示得到和为24的选牌次数 题目 题目描述 破 ...

  8. [c++]随机生成四个数字,计算24点,并输出算式

    此次程序使用了"ctime"头文件,用来获取时间,用rand()函数生成随机数,"srand((unsigned)time(NULL));"此语句可以生成随时间 ...

  9. python游戏开发步骤_详解Python GUI版24点游戏制作过程

    本文作者为浙江温州永嘉县教师发展中心应根球老师,电子邮箱:ycicada@163.com. 传统用扑克牌算24点游戏用于小学低中段学生训练四则运算效果不错,也可用于防止老年痴呆.本项目模拟传统扑克24 ...

最新文章

  1. C#计算两个日期的相隔天数
  2. R语言ggplot2可视化删除所有分面图(facet_wrap可视化的facet结果)的标签实战(Remove facet_wrap labels)
  3. 云计算之路-阿里云上:RDS用户的烦恼
  4. mysql表创建在哪_mysql创建表命令是哪句
  5. 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质 | 实序列的幅频特性偶对称 | 实序列相频特性奇对称 | 示例说明 )
  6. js函数的内部属性---arguments,callee,caller
  7. Spring的bean实例化过程
  8. vue的Prop属性
  9. matlab函数包_Matlab论文插图绘制的270种补充颜色
  10. CNN——学习率LR的参考值范围是符合指数函数的增长规律的
  11. Git可视化极简易教程 —— Git GUI使用方法
  12. js中url的对象化管理
  13. Python基础 day4
  14. RF 操作页面滚动条上下滚动
  15. centos:清理磁盘空间
  16. mongodb查询某个字段数据
  17. 三角形~~行列式~~皮克公式~~gcd
  18. PDF文件拆分为图片
  19. Python数据分析实例,利用Pandas建立流域三层蒸发和蓄满产流模型
  20. 解决ubuntu18 上网速度慢的问题(已经确定没用,你的网速慢就是网速慢)

热门文章

  1. 阿里云部署公司网盘实例
  2. pycharm使用pip install xxx 解决超时问题
  3. java内存模型作用是什么意思_JMM(Java内存模型)是什么?为什么使用并发?
  4. 人机交互知识 理论篇1
  5. vuepress侧边栏配置_VuePress默认主题配置(default theme config) - VuePress中文网
  6. 模板方法模式---榨汁机
  7. GO语言环境搭建 + Sublime text 3 + Git + MarGo + gocode 组合配置详解
  8. FPGA开发 Quartus Signaltap的基本使用
  9. 2013年Devoxx法国-第3天
  10. 程序员忽悠女朋友玩gal