24点游戏计算器
篇一:24点游戏程序设计说明书
**大学课 程 设 计 说 明 书学生姓名: 学 题 院: 目:学 号: 信息与通信工程学院 24 点游戏程序设计指导教师:职称:2015 年 1 月 19 日
**大学课程设计任务书14/15 学年第 一 学期学 专院: 信息与通信工程学院 业: 电子信息科学与技术学 生 姓 名: 学 题 号: 目: 24点游戏程序设计起 迄 日 期: 2015 年 1 月 12 日~2015 年 01 月 23 日 课程设计地点: 指 导 教 师: 学科部主 任:
下达任务书日期:2015年 1 月 12日课 程 设 计 任 务 书1.设计目的:通过设计,明确 24 点游戏的设计思想和设计过程,扎实掌握 VC、C++或 C 语言编程的 整体框架和步骤,使学生具有一定综合分析问题和解决问题的能力。2.设计内容和要求(包括原始数据、技术参数、条件、设计要求等) : 功能说明:具有 24 点游戏的各项功能。设计要求:课程设计的目的在于培养学生的综合素质,要求学生做到: (1)根据题目要求查阅有关资料,确定方案,写出设计方案; (2)根据对选题的理解,消化查阅资料,给出相关设计的流程图; (3) 在 C 语言、C++或 VC 环境下,实现各项功能; (4) 对结果进行分析总结。3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、 实物样品等〕 : 设计工作任务:(1) 了解课题背景,掌握基本技术,制定程序设计框架。 (2) 完成设计内容:包括程序流程图和完成实现功能的程序代码,写出设计说明书。 (3) 设计答辩。工作量的要求:(1) 通过查阅资料了解与 24 点游戏程序设计相关的基本理论、原理以及背景知识, 理解选题意义; (2) 掌握与 24 点游戏程序相关的设计思想、原理、设计框架和步骤; (3) 完成 24 点游戏程序的功能和程序代码的实现; (4) 通过实验验证程序代码的可行性; (5) 给出设计总结。
课 程 设 计 任 务 书4.主要参考文献:Visual C++课程设计案例精编 C++程序设计教材书 C 语言程序设计教程5.设计成果形式及要求:程序运行结果; 课程设计说明书。6.工作计划及进度:2015 年 1 月 12 日 ~ 2015 年 1 月 14 日:查资料 2015 年 1 月 15 日 ~ 2015 年 1 月 17 日:在指导教师指导下设计方案及程序 2015 年 1 月 18 日 ~ 2015 年 1 月 20 日:学生上机调试程序,指导教师辅导 2015 年 1 月 21 日~ 2015 年 1 月 22 日:完成课程设计说明书 2015 年 1 月 23 日:答辩系主任审查意见:签字: 年 月 日
目录 一、摘要………………………………………………………6 二、关键词……………………………………………………6 三、设计目的、意义…………………………………………7 四、流程图……………………………………………………7 五、设计内容: (正文)……………………………………9 六、结果分析…………………………………………………9 七、设计心得…………………………………………………10 八、参考文献…………………………………………………10
篇二:C语言计算得到24 24点游戏
#include
char mark[4]={'+','-','*','/'};
float cal(float x,float y,int mark)
{
switch(mark)
{
case 0:return x+y;
case 1:return x-y;
case 2:return x*y;
case 3:return x/y;
}
}
float calculate_A(float a,float b,float c,float d,int mark1,int mark2,int mark3) {
float r1,r2,r3;
r1=cal(a,b,mark1);
r2=cal(r1,c,mark2);
r3=cal(r2,d,mark3);
return r3;
}
float calculate_B(float a,float b,float c,float d,int mark1,int mark2,int mark3) {
float r1,r2,r3;
r1=cal(b,c,mark2);
r2=cal(a,r1,mark1);
r3=cal(r2,d,mark3);
return r3;
}
float calculate_C(float a,float b,float c,float d,int mark1,int mark2,int mark3) {
float r1,r2,r3;
r1=cal(c,d,mark3);
r2=cal(b,r1,mark2);
r3=cal(a,r2,mark1);
return r3;
}
float calculate_D(float a,float b,float c,float d,int mark1,int mark2,int mark3) {
float r1,r2,r3;
r1=cal(b,c,mark2);
r2=cal(r1,d,mark3);
r3=cal(a,r2,mark1);
return r3;
}
float calculate_E(float a,float b,float c,float d,int mark1,int mark2,int mark3) {
float r1,r2,r3;
r1=cal(a,b,mark1);
r2=cal(c,d,mark3);
r3=cal(r1,r2,mark2);
return r3;
}
float get(int a,int b,int c,int d)
{
int mark1,mark2,mark3;
float flag=0;
for(mark1=0;mark1<4;mark1++)
{
for(mark2=0;mark2<4;mark2++)
{
for(mark3=0;mark3<4;mark3++)
{
if(calculate_A(a,b,c,d,mark1,mark2,mark3)==24)
{
printf("((%d%c%d)%c%d)%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1;
}
if(calculate_B(a,b,c,d,mark1,mark2,mark3)==24)
{
printf("(%d%c(%d%c%d))%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1;
}
if(calculate_C(a,b,c,d,mark1,mark2,mark3)==24)
{
printf("%d%c(%d%c(%d%c%d))=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1;
}
if(calculate_D(a,b,c,d,mark1,mark2,mark3)==24)
{
printf("%d%c((%d%c%d)%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1;
}
if(calculate_E(a,b,c,d,mark1,mark2,mark3)==24)
{
printf("(%d%c%d)%c(%d%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d); flag=1;
}
}
}
}
return flag;
}
main()
{
int a,b,c,d;
loop: printf("Please input 4 numbers(1~10):\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
if((a>=1&&a<=10)&&(b>=1&&b<=10)&&(c>=1&&c<=10)&&(d>=1&&d<=10)) {
if(0!=get(a,b,c,d))
;
else
printf("Sorry!can not find!\n");
goto loop;
}
else
{
printf("Input illegal(违法),please input again(1~10)\n");
goto loop;
}
system("pause");
}
篇三:24点游戏C语言代码及报告
24点游戏
一,问题分析
二十四点游戏规则:
给出4个数字,所给数字均为有理数,用加、减、乘、除(可加括号)把给出的数算成24.每个数必须用一次且只能用一次,先算出结果者获胜。
步骤:比如下面的例子:
例:3、8、8、9,
答案1:(9—8)×8×3
答案2: 3×8 ÷(9—8)
答案3:(9—8÷8)×3
利用3×8=24、4×6=24求解
我的主要想法是 首先穷举的可行性问题。我把表达式如下分成三类——
1、 无括号的简单表达式。
2、 有一个括号的简单表达式。
3、 有两个括号的较复4、 杂表达式。
穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列
二,源程序及注释
//首先穷举的可行性问题。我把表达式如下分成三类——
//1、 无括号的简单表达式。
//2、 有一个括号的简单表达式。
//3、 有两个括号的较复4、 杂表达式。
//穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列
#include
#include
using namespace std;
int number=0;
string sss[5000];
float cal(float a,float b,int p)
{
switch(p)
{
case 1:return a+b;
case 2:return a-b;
case 3:return a*b;
case 4:return a/b;
case 5:return b-a;
case 6:return b/a;
}
}
string link(string a,string b,int p)
{
string st=a;
switch(p)
{
case 1:st+=("+"+b);break;
case 2:st+=("-"+b);break;
case 3:st+=("*"+b);break;
case 4:st+=("/"+b);break;
case 5:st=b+"-"+st;break;
case 6:st=b+"/"+st;break;
}
st="("+st+")";
return st;
}
void putout1(string c[],int p[])
{
string st;
st=link(c[1],c[2],p[1]);
st=link(st,c[3],p[2]);
st=link(st,c[4],p[3]);
st=st.erase(0,1);
st=st.erase(st.length()-1,1);
number++;
sss[number]=st;
(来自:WWw.SmhaiDa.com 海达范文网:24点游戏计算器)}
void putout2(string c[],int p[])
{
string st1,st2,st;
st1=link(c[1],c[2],p[1]);
st2=link(c[3],c[4],p[3]);
st=link(st1,st2,p[2]);
st=st.erase(0,1);
st=st.erase(st.length()-1,1);
number++;
sss[number]=st;
}
void suan(float a[],string c[])
{
int p[4];int i;float sum,sum1,sum2;
for(p[1]=1;p[1]<=6;p[1]++)
for(p[2]=1;p[2]<=6;p[2]++)
for(p[3]=1;p[3]<=6;p[3]++)
{
sum=cal(a[1],a[2],p[1]);
sum=cal(sum,a[3],p[2]);
sum=cal(sum,a[4],p[3]);
if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout1(c,p); sum1=cal(a[1],a[2],p[1]);
sum2=cal(a[3],a[4],p[3]);
sum=cal(sum1,sum2,p[2]);
if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout2(c,p); }
}
void disorder(float a[],string c[])
{
float b[5];
string d[5];
int i,j,k,l;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
{
if(j==i)continue;
for(k=1;k<=4;k++)
{
if(k==i||k==j)continue; for(l=1;l<=4;l++)
{
if(l==i||l==j||l==k)continue;
b[1]=a[i];b[2]=a[j];b[3]=a[k];b[4]=a[l];
d[1]=c[i];d[2]=c[j];d[3]=c[k];d[4]=c[l];
suan(b,d); }
}
}
}
int main()
{
cout<<"请输入四个数字";
float a[5];
int i,j;
string c[5];
for(i=1;i<=4;i++){cin>>a[i];if(a[i]==10)c[i]="10" c[i]=int(a[i])+'0';}
disorder(a,c);
int v=1,u=0;
for(i=1;i<=number;i++)
{v=1;for(j=1;j
if(u==0)cout<<"无解"< system("pause"); return 0; } 三,运行结果显示 ;else 四,调试和运行程序过程中产生的问题及采取的措施: 篇四:24点游戏程序设计 杭州电子科技大学 2012年6月短学期 姓名: 学号: 班级: 专业: 学院: 课题: 指导老师: 完成时间: 一、程序功能及规则设定 本题目将设计一个24点游戏。程序主要负责实现随机发牌、设置牌面、表达式验算、计算机给出解答、结果统计等功能。系统可随机给出4个数,也可由用户自行输入四张牌的值。用户输入表达式,先判断表达式是否正确,如果正确,计算是否24,不正确的话,给出可能的正确表达式。用户可放弃输入,由系统直接给出可能的答案 24点游戏是一种常见的纸牌游戏,就是利用加减乘除以及括号将给出的四张牌组成一个值为24的表达式,玩法十分简单,是一个消遣的好方法。本程序对传统24点作了一定的改变,用户不必自己手动输入表达式,程序提供相应的按钮,通过点击按钮键入表达式,方便用户操作。 二、程序实现思路 通过一定的功能分析,将程序基本化为:随机发牌,设置牌面,退出游戏,表达式键入,表达式验证,系统给出答案,判断是否无解这7个功能模块。 2.1 随机发牌: 产生4个随机数rand(),将4个数保存下来,对相应的按钮及图片做出对 应的处理,即显示相对应的扑克牌、修改数字按钮上显示的数字、设置按钮的可用性等。这些处理写在主窗口的私有成员函数中,名为startupCard(), 其中调用较多的API函数,如载入图片loadImage()、设置按钮内容SetDlgItemText()等。 2.2 设置牌面: 用户自己设置扑克牌牌面(此时跳出一个设置窗口),获取用户输入的数字, 其余操作与随机发牌操作相同,调用startupCard()完成。 2.3 退出游戏: 弹出关闭提示窗口,询问用户事故否确认退出。点击确定,则退出;点击 取消,则返回,继续游戏。 2.4 表达式键入: 设置4个数组、加、减、乘、除、左括号、右括号、清除、完成等按钮, 并且一定时期某些按钮可用,某些按钮不可用。其规则如下:1)程序开始时,只有数字及左括号可用;2)当按下数字按钮时,加减乘除按钮可用,若前面输入过左括号,则右括号可用;3)当按下左括号时,只有未使用的数字可用;4)当按下加减乘除时,未使用的数字及左括号可用;5)当按下右括号时,未使用的数字、加减乘除、右括号可用;6)当按下数字或右括号按钮,且数字都已经使用,左右括号匹配,此时完成按钮可用;7)清除按钮用于清除已键入的表达式。关于按钮可用性设置利用EnableWindow()函数来实现。 2.5 表达式验证: 即计算用户输入的表达式,首先获取表达式GetDlgItemText(),根据加 减乘除运算法则,使用C++ STL库所提供的栈,进行表达式计算,验证用户输入的是否等于24。 算法思路:(1) 运算符的优先级处理。为根据运算符的优先级对表达式进行运算,引入优先级最低的运算符“;”,该运算符不参加实际的运算,只出现在表达式的开始和最后,仅起到保证表达式的其他运算符运算完为止的作用。由此,规定运算符从低到高的优先级依次为:0级:‘;’,1级:‘)’,2级:‘+’和‘-’, 3级:‘*’和‘/’, 4级:‘(’。 (2) 运算过程中的运算符和运算数的操作处理。在从左到右依次读入表达式字符串中字符的过程中,若遇到连续若干个数码字符就转换为数值,并将其入运算数栈;若遇到运算符,当该运算符的优先级高于运算符栈顶的运算符时,将该运算符入运算符栈,否则弹出运算数栈顶的两个元素依次作为右边和左边的运算数,弹出运算符栈顶的元素作为运算符进行运算,将结果入栈到运算数栈。但要注意以下情况: ① 读入的运算符‘)’不入运算符栈; ② 当运算符栈顶是运算符‘(’时,读入的运算符除‘)’外均入栈; ③ 当读入的运算符是‘)’而运算符栈顶是‘(’时,运算符栈退栈; ④ 当读入的是运算数或是运算符而入栈了或是运算符‘)’而运算符栈顶是‘(’时,继续读入下一字符,否则不能读入下一字符。 (3) 比较运算符的优先级算法。根据存于一维数组中的运算符极其优先级,对运算符栈顶的运算符与读入的运算符比较其优先级,返回响应的信息。 (4) 核心算法:完成表达式的求值并输出响应的操作及运算符栈和运算数栈的变化状态。对依次从表达式字符串读入的字符,若是数码字符,则将连续的若干个数码字符转换成数值后,入栈到运算数栈;否则,若是运算符且不是‘)’:则当该运算符的优先级比运算符栈顶的运算符优先级高或运算符栈顶的运算符是‘(’时,该运算符入运算符栈,继续读入后续字符;否则,若是运算符且是‘)’,而运算符栈顶是‘(’时,运算符栈退栈,继续读入后续字符;否则,弹出运算数栈顶的两个元素依次作为右边和左边的运算数,弹出运算符栈顶的元素作为运算符进行运算,将结果入栈到运算数栈,此时,如果当前运算符的优先级高于运算符栈顶元素的优先级,则当前运算符入运算符栈,继续读入后续字符,如果表达式已读完而且运算符栈已空,则继续读入后续字符。以上各种情况处理完后,均输出响应的操作及运算符栈和运算数栈的变化状态。最后返回表达式的运算结果——运算数栈中唯一的一个数据。 2.6 系统给出答案: 使用递归的方式,达到穷举的效果求24点的解 算法思路:首先,从宏观上说,这种问题都是遍历穷举。再看看运算符,其中+,* 都是没有顺序的。即(a*b=b*a), 但是 -、/ 是有顺序的。那么假设都有顺序的。那么就可以统一处理了(最多效率低点,先解决问题。再考虑优化)。那么遍历所有a,b,c,d 以 及 三次运算 。即A(4,4) *4*4*4 就是该算法的复杂度。 微观上,由于中间有除法,那么不能用int类型来储存数据了。需要用double或者float.每次运算都只有两个数运算。 2.7 判断是否无解: 同样系统计算答案,判断有没有解 三、程序流程图 四、程序调试 4.1 图片显示:图片导入难以实现,不断修改、查阅信息、修改完成。 4.2 表达式求值算法:计算结构有误。原因为运算符优先级设置不正确,如加号和减号 的优先级相同,乘号和除号的优先级相同。 4.3 按钮可用性设定:不可连续输入括号,如:((6+6)+6)+6,是正确的解,但是无 法输入,修改了按钮可用性设定的规则:当按下左括号时,左括号仍可用,并且,四个数字都使用了以后,系统自动完成括号匹配的工作。 4.4 有待改进的地方:程序经常出现闪屏现象,可以增加定时、难度级别设置的功能。 五、部分截图 5.1主界面: 5.2设置牌面: 5.3退出游戏: 篇五:24点游戏模拟器 《开放式单片机应用系统专题设计》 专题名称:纸牌24玩法单片机模拟器 班级: 姓名: 学号: 指导教师: 光学与电子信息学院 2014.11 一、任务要求 设计一个模拟纸牌24点玩法的单片机模拟器,由单片机随机发出四个牌点,测试者在实验板按键上输入计算过程,单片机判断计算结果是否正确,并评定测试者的成绩。 【基本要求】: 1.测试多组数据 2.由单片机在数码管上随机给出4张牌点,牌点范围为1-12,10到12由字符a,b,c表示 3.在单片机实验板按键中设计4个数学运算键(+-×÷) 4.4个数字中每使用完一个后该字符亮度减半 5.只允许测试者使用四则运算 6.无论测试结果是否正确,均有声光效果提示; 7.测试完毕,由单片机给出测试者的最终成绩 二、功能特点与使用说明 1.每按下kint键,系统随机产生四个数(数值为1-12)分别显示在数码管上 2.第一个数码管对应着键值为7的键,第二个数码管对应着键值为4的键,第三个数码管对应 着键值为1的键,第四个数码管对应着键值为0的键,每按下这四个键中的一个键,其对应 的数码管上的字符亮度减半 3.+号对应着键值为15的键,-号对应着键值为14的键,*号对应着键值为13的键,/号对应 着键值为12的键,(/)括号对应着键值为11的键,=号对应着键值为10的键 4.在数码管上显示数字之后,若操作者认为可以产生24点,则输入自己认为可以产生24点的 表达式,按下=号,若结果为24则蜂鸣器会响,指示灯会亮;若结果不为24,则蜂鸣器不 响,只有指示灯会亮。若操作者认为不可以产生24点,则直接按下等号,若系统自动判断 也认为这四个数不可能产生24点,则蜂鸣器会响,指示灯会亮,若系统自动判断可以产生 24点,则此时蜂鸣器不响,只有指示灯会亮。 5.判断结束以后,按下kint键,重新开始判断以及输入表达式 6.游戏总共时间为1s,1s内答对了几道题目就有几分,1s结束以后在数码管上显示答对了几 道题目即为此时的你的得分 三、方案设计 (一)产生四位随机数并且按下半亮 (1) 本试验中的四位随机数是利用定时器完成的,让定时器T0不断的溢出,利用 TH0,TL0的分别的高低四位均除以12再将余数加一产生1-12的随机数并且 显示在数码管上,每按下kint键都可以显示一组随机数在数码管上 (2)判断某一数码管是否按下,利用20H-23H中的单元,若为1,即已经按下则改 变扫描时间,若未按下相应单元为0,则为原来的扫描时间。用改变扫描时间 的方法来使得按下的数码管变暗 资源分配:20H-23H(判断对应的数码管是否按下) 51H-55H(数码管产生随机数一 次存放的地址) (二)系统自动判断能否产生24点 在产生随机数以后,系统自动判断这四个数的所有组合能否构成24点,方法如下: (1)由于四个数可以交换位置来计算,所以四个数有24中排列组合的方法 A B C D (2)每一种排列组合根据能否产生24点进行加减乘除括号运算可以有31中具体的 算法 (3)按照顺序依次进行每一种排列组合的31种算法,若其中的任何一种可以产生 24点,则59H赋值为1,说明系统可以产生24点;若把这24种排列组合全部 都进行31种运算之后得到的值都不为24,则59H中仍然为0,说明这四个数无 论如何都不可能产生24点 资源分配:54H-59H(系统判断24点时将51H-54H数码管中的值逐次赋予给系统 分进行判断31中运算时的顺序值) (三)手动输入表达式 1.经过分析,手动输入的表达式有5种形式,分别为 A B C D (A B) (C D) (A B) C D A (B C) D A B (C D ) 将表达式的符号键值依次存入以31H单元开始地址,根据输入者输入表达式的五 种形式当中的某一种,系统会调到某一步执行相关的程序,进而进行表达式的计 算比如:第一种形式A B C D 只需要判断34H是否有键值,若没有键值,则进 行该形式的计算,否则则进行第二种形式的判断,第二种形式(A B) (C D)只需 要判断36H单元是否有键值,若有键值则进行该形式的计算,否则进行第三种形 式的判断,第三种形式(A B) C D只需要判断31H当中的内容是不是代表括号的 11H,若是,则进行该形式的计算,若不是,则进行第四种形式的判断,第四种 形式A (B C) D 只需要判断32H中的内容是否为11H即括号的键值,若是,则 进行该形式的计算,若不是,则进行最后一种形式A B (C D )的计算 2.表达式计算方法:将按下的数码管上的值一次存入由41H开始的单元的当中, 根据判断输入的符号键值来进行运算,若有括号(括号键值为 11),先进行 括号里面的运算,若没有括号,先进行乘除运算(乘法键值为13,除法键值 为12),再进行加减运算(加号键值为15,减号键值为14),经过一步步运 算之后将表达式的值赋给45H。此处要注意的是,括号里面的内容必须是加和减 资源分配:31H-38H(表达式中的符号存入的地址) 40H-46H (按下对应的数码管的值和运算值) 26H-29H(判断对应的数码管是否按下) (四)手动结果与系统自动判断结果对比得出答案是否正确 (1)若手动输入表达式的结果为24,即45H中的值为24,则表明输入正确,蜂鸣 器会响,指示灯会亮 (2)若手动输入表达式的结果不为24,即45H中的值不为24,则表明输入错误, 则此时蜂鸣器不响,只有指示灯会亮。 (3)若并没有输入表达式,而是直接按下等号,也即操作者认为不可能产生24 点,若此时系统判断当中的59H中为0,说明操作者认为的不可能产生24点 是正确的,蜂鸣器会响,指示灯会亮 (4)若并没有输入表达式,而是直接按下等号,也即操作者认为不可能产生24 点,若此时系统判断当中的59H中为1,说明操作者认为的不可能产生24点 是错误的,因为系统判断可以产生24点而操作者认为不可以产生24点,此 时蜂鸣器不会响,指示灯会亮 资源分配:45H(表达式结果的值) 59H(系统判断是否能够产生24点) 70H(蜂鸣器响的次数) (五)定时显示结果部分 系统设置了1分钟的游戏时间,在这1分钟内只要按下kint就可以重新产生随机 数,重新判断,每答对一道题目蜂鸣器就会响一次,每一次蜂鸣器响将70H的内容 加一表示答对题目的数目。当1分钟时间到时,停止所有的程序,此时数码管上显 示的是你答对题目的数目,即你的得分。此处的答对几道题目是利用到计算蜂鸣器 响的次数。 资源分配:75H(整个游戏延时时间) 70H(蜂鸣器响的次数,也是答对题目的数目) 四、流程图 (主程序、子程序的详细流程)