C语言实现24点小游戏
目录:
- 问题描述
- 问题分析
- 算法设计
- 主函数
- 完整代码
问题描述
游戏规则:
从键盘输入任意1-13的4个数,然后用算术运算符“+、一、*、/”将这四个数组成一一个算术表达式(可加括号,每个数字只能使用1次),使得该式的运算结果为24,每输入一次表达式,系统给出该式的运算结果,如果结果是24,则游戏结束;如果不是,则继续组合表达式,直到结果为24为止。
问题分析
本题最简单的解法就是应用穷举法搜索整个解的空间,然后筛选出符合项的全部解,因此关键就是如何确定该题的解题空间。
假设输入4个整数,A,B,C,D,如果只考虑括号不考虑优先级的情况,有一下几种情况:
(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)
即在□输入“+、-、*、/”中的任意一种。我们就是在填入的所有式子中所得到的答案里面找出答案为24的表达式。
算法设计
我们在不同的地方设置不同的变量,即:op1、op2、op3,并且规定A和B之间的运算符为op1,B和C之间的运算符为op2,C和D之间的运算符为op3。即:
A op1 B op2 C op3 D
又规定op1、op2、op3的取值范围为1、2、3、4分别为加减乘除,如表所示:
op1、op2、op3变量值 | 表示的运算 |
---|---|
1 | + |
2 | - |
3 | * |
4 | / |
此时就得到了以下算法:
for(op1=1;op1<=4;op1++)for(op2=1;op2<=4;op2++)for(op3=1;op3<=4;op3++){得到一种不含括号的表达式情形:A op1 B op2 C op3 D
}
下面我们要填入符号,根据括号和优先级的限制,我们有以下的填入方式
(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)
根据优先级来说,以上五种情况包括了全部的算式,我们只需计算出每个表达式的值,将其与24进行比较。
float calculate_model1(float i,float j,float k,float t,
int op1,int op2,int op3)
{ /*对应关系式 ((A□B)□C)□D */float r1,r2,r3;r1 = cal(i,j,op1);r2 = cal(r1,k,op2);r3 = cal(r2,t,op3);return r3;}float calculate_model2(float i,float j,float k,float t,
int op1,int op2,int op3)
{ /*对应关系式 (A□(B□C))□D */float r1,r2,r3;r1 = cal(j,k,op2);r2 = cal(i,r1,op1);r3 = cal(r2,t,op3);return r3;}float calculate_model3(float i,float j,float k,float t,
int op1,int op2,int op3)
{ /*对应关系式 A□((B□C)□D) */float r1,r2,r3 ;r1 = cal(k,t,op3);r2 = cal(j,r1,op2);r3 = cal(i,r2,op1);return r3;}float calculate_model4(float i,float j,float k,float t,
int op1,int op2,int op3)
{ /*对应关系式 ((A□B)□C)□D */float r1,r2,r3;r1 = cal(j,k,op2);r2 = cal(r1,t,op3);r3 = cal(i,r2,op1);return r3;}float calculate_model5(float i,float j,float k,float t,
int op1,int op2,int op3)
{ /*对应关系式 (A+B)-(C×D) */float r1,r2,r3 ;r1 = cal(i,j,op1);r2 = cal(k,t,op3);r3 = cal(r1,r2,op2);return r3;}
上述算法中,每一个函数对应一种表达式类型, 其返回值为表达式的值,原表达式式的形式为i opl j op2 k op3 t
,不同的表达式类型,根据其运算时优先级的不同进行不同的运算。其中函数cal()的作用是通过每种表达式的状态计算出对应的表达式的值。
int op1,op2,op3;int flag=0;for(op1=1;op1<=4;op1++)for(op2=1;op2<=4;op2++)for(op3=1;op3<=4;op3++)
op1、op2、op3都是取 “+”,“-”,“*”,“/”四个选项
函数cal()包括3个参数,第3个参数为运算符变量,它标志着不同种类的运算符,前两个参数为运算数。该函数的作用是使用前两个参数指定的操作数进行第3个参数指定的运算,并返回其运算结果。例如函数调用cal(2,3.1)的作用是计算2+3=5.并返回5。函数cal0的代码如下:
float cal(float x,float y,int op)
{switch(op){case 1:return x+y;case 2:return x-y;case 3: return x*y;case 4: return x/y;}
}
将上面所讲的算法进行结合,可以遍历由4个操作数(范围:1-13), 3个运算符(+,-,*,/),这样就缩小了搜索空间,提高查询效率。
主函数
main()
{int i,j,k,t;printf("Please input four integer (1~13)\n");
输入 i,j,k,t四位数。
loop: scanf("%d %d %d %d",&i,&j,&k,&t);if(i<1||i>13 || j<1||j>13 || k<1||k>13 || t<1||t>13){printf("Input illege, Please input again\n");goto loop;}
如果这四位数小于1或者大于13,则报错。
if(i==j||i==k || i==t||j==k || j==t||k==t){printf("Input wrong, Please input again\n");goto loop;}
如果这四位数有一位以上的数输入了2遍,则报错(题目要求只能用一次)
if(get24(i,j,k,t));else {printf("Sorry, the four integer cannot be calculated to get 24\n");goto loop;} }
如果这四个数通过运算不等于24,则需要重新输入4位数重新计算
goto loop;表示继续执行不退出。
完整代码
以下是完整代码:
#include<stdio.h>
char op[5]={'#','+','-','*','/',};
float cal(float x,float y,int op)
{switch(op){case 1:return x+y;case 2:return x-y;case 3: return x*y;case 4: return x/y;}}float calculate_model1(float i,float j,float k,float t,int op1,int op2,int op3)
{float r1,r2,r3;r1 = cal(i,j,op1);r2 = cal(r1,k,op2);r3 = cal(r2,t,op3);return r3;}float calculate_model2(float i,float j,float k,float t,int op1,int op2,int op3)
{float r1,r2,r3;r1 = cal(j,k,op2);r2 = cal(i,r1,op1);r3 = cal(r2,t,op3);return r3;}float calculate_model3(float i,float j,float k,float t,int op1,int op2,int op3)
{float r1,r2,r3 ;r1 = cal(k,t,op3);r2 = cal(j,r1,op2);r3 = cal(i,r2,op1);return r3;}float calculate_model4(float i,float j,float k,float t,int op1,int op2,int op3)
{float r1,r2,r3;r1 = cal(j,k,op2);r2 = cal(r1,t,op3);r3 = cal(i,r2,op1);return r3;}float calculate_model5(float i,float j,float k,float t,int op1,int op2,int op3)
{float r1,r2,r3 ;r1 = cal(i,j,op1);r2 = cal(k,t,op3);r3 = cal(r1,r2,op2);return r3;}get24(int i,int j,int k,int t)
{int op1,op2,op3;int flag=0;for(op1=1;op1<=4;op1++)for(op2=1;op2<=4;op2++)for(op3=1;op3<=4;op3++){if(calculate_model1(i,j,k,t,op1,op2,op3)==24){printf("((%d%c%d)%c%d)%c%d=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;}if(calculate_model2(i,j,k,t,op1,op2,op3)==24){printf("(%d%c(%d%c%d))%c%d=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;}if(calculate_model3(i,j,k,t,op1,op2,op3)==24){printf("%d%c(%d%c(%d%c%d))=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;}if(calculate_model4(i,j,k,t,op1,op2,op3)==24){printf("%d%c((%d%c%d)%c%d)=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;}if(calculate_model5(i,j,k,t,op1,op2,op3)==24){printf("(%d%c%d)%c(%d%c%d)=24\n",i,op[op1],j,op[op2],k,op[op3],t);flag = 1;}}return flag;
} main()
{int i,j,k,t;printf("Please input four integer (1~13)\n");loop: scanf("%d %d %d %d",&i,&j,&k,&t);if(i<1||i>13 || j<1||j>13 || k<1||k>13 || t<1||t>13){printf("Input illege, Please input again\n");goto loop;}if(i==j||i==k || i==t||j==k || j==t||k==t){printf("Input wrong, Please input again\n");goto loop;}if(get24(i,j,k,t));else {printf("Sorry, the four integer cannot be calculated to get 24\n");goto loop;} }
此时改程序已经可以成功实现。
C语言实现24点小游戏相关推荐
- c语言纸牌小游戏制作,C语言实现纸牌24点小游戏
本文实例为大家分享了C语言纸牌24点小游戏的具体实现代码,供大家参考,具体内容如下 此程序参考C语言实现经典24点纸牌益智游戏,并做出一些改进. 一.题目要求: 24点游戏规则: 从扑克中每次取出4张 ...
- 24点小游戏(C语言实现)
一.题目分析 题目要求: 24点小游戏是经典的纸牌益智游戏. 常见游戏规则如下: 从扑克牌中任意取出四张牌,对牌面上的四个数字使用任意的加减乘除(每张牌牌面上的数字都只能使用一次),第一个能得到24者 ...
- c语言算24点答案,C语言-纸牌计算24点小游戏
C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...
- C语言-纸牌计算24点小游戏
C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...
- c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 24点游戏java_Java实现24点小游戏
一.引育Java是当今最热门的编程语言,它的跨平台与网络应用方面的强大功能使之非常适用于网络游戏的开发.Jav.不仅功能简单,还很容易上手,对于新手来说,做一些简单的游戏相对容易.24点小游戏涉及Ja ...
- c语言射击类小游戏任务书,(c语言课程设计报告小游戏“石头剪子布”.doc
(c语言课程设计报告小游戏"石头剪子布" <C语言课程设计>报告 题目:石头剪子布 班级: 学号: 姓名: 指导教师: 成绩: 目 录: 一.选题背景- 3 - 二.设 ...
- R语言入门——猜数小游戏
R语言入门--猜数小游戏 题目介绍 使用代码(2种方法) 运行结果 题目介绍 设计一个猜数字的游戏:计算机随机生成一个1~100 之间的整数,然后由用户猜测所产生的随机数.根据用户猜测的情况给出不同提 ...
- C语言开发打气球小游戏
C语言开发打气球小游戏 首先我们写一下项目所需要的头文件 #include<stdio.h>//标准输入输出头文件 #include<math.h>//数学库头文件 #incl ...
最新文章
- 【KDD 2020】推荐系统领域论文汇总
- Xamarin XAML语言教程基本页面ContentPage占用面积(二)
- Python实现PS滤镜Fish lens图像扭曲效果示例
- html制作统计期末成绩,JS-结合html综合练习js的对象——班级成绩表制作
- VBScript - Round Function
- Java从string数组创建临时文件
- flask-restful接口
- curl工具使用实例
- .Net core 应用程序发布Web时,有些文件夹没有发布成功解决办法
- 用于网络销售的虚拟产品演示软件
- 2019 deecamp B题不完全的记录
- 浏览器字体变大|变小怎么办,浏览器字体大小设置方法
- 网站托管服务器配置,了解托管服务器的三个小技巧
- colab上装在谷歌网盘
- 列表块元素 ul和ol
- zkSnarks:QAP上构造零知识证明
- python内置函数用来返回_python内置函数2
- 详细说明如何在pycharm不联网的情况下,离线安装第三方库及依赖包(如sklearn)
- C Programming学习笔记【谭浩强老师编】(第四章选择结构程序设计)02 逻辑运算符和逻辑表达式
- python 计算召回率的程序_python实现计算精度、召回率和F1值