24点纸牌游戏
2017-04-09 15:46
363 查看
//题目:24点纸牌游戏 //语言:C++ //日期:2017-4-9 //作者:软工1508010205杨兰 #include<iostream> #include<fstream> #include<cmath> using namespace std; char sign[4]={'+','-','*','/'};//全局变量,用于存储加减乘除符号 class game24point//24点纸牌游戏类 { private: double a[4];//用double类型实现精确计算 public: game24point();//构造函数 double calculate(double,double,char);//计算函数 void search();//搜索函数,寻找合适的解 void print();//打印得到四张纸牌的数值 }; game24point::game24point() { char ch[4];//纸牌中含有字母 ifstream infile("input.txt"); if(!infile)//文件打开失败 { cout<<"打开文件input.txt失败!"<<endl; exit(1); } for(int i=0;i<4;i++) infile>>ch[i]; cout<<" ###################################################"<<endl; cout<<" ## ##"<<endl; cout<<" ## 正在从input.txt中读取数据 ##"<<endl; cout<<" ## ##"<<endl; cout<<" ###################################################"<<endl; for(i=0;i<4;i++) {//纸牌字符转化成数值 if(ch[i]=='A') a[i]=1; else if(ch[i]=='J') a[i]=11; else if(ch[i]=='Q') a[i]=12; else if(ch[i]=='K') a[i]=13; else if(ch[i]=='2') a[i]=2; else if(ch[i]=='3') a[i]=3; else if(ch[i]=='4') a[i]=4; else if(ch[i]=='5') a[i]=5; else if(ch[i]=='6') a[i]=6; else if(ch[i]=='7') a[i]=7; else if(ch[i]=='8') a[i]=8; else if(ch[i]=='9') a[i]=9; else if(ch[i]=='10') a[i]=10; else { cout<<"第"<<i+1<<"个数据输入有误!"<<endl; exit(1); } } infile.close(); } double game24point::calculate(double a,double b,char index) { if(index=='+') return a+b; else if(index=='-') return a-b; else if(index=='*') return a*b; else if(index=='/') if(b!=0) return a/b; } void game24point::search() { double temp[3],tem[2];//第一个符号放置后,经过计算后相当于剩下三个数,用此数组来存储这三个数 double sum;//求和 int judge=0;//判断是否找到一个合理的解 ofstream outfile("output.txt",ios::app);//以输出方式打开文件 if(!outfile)//文件打开失败 { cout<<"打开文件output.txt失败"<<endl; exit(1); } cout<<" ###################################################"<<endl; cout<<" ## ##"<<endl; cout<<" ## 正在计算结果,请等待 ##"<<endl; cout<<" ## ##"<<endl; cout<<" ###################################################"<<endl; outfile<<"-------------------------------------------------------------"<<endl; outfile<<" ###################################################"<<endl; outfile<<" ## ##"<<endl; outfile<<" ## 本次24点游戏求得结果如下 ##"<<endl; outfile<<" ## ##"<<endl; outfile<<" ###################################################"<<endl; for(int i=0;i<4;i++)//第一次放置的符号 { for(int j=0;j<4;j++)//第二次放置的符号 { for(int k=0;k<4;k++)//第三次放置的符号 { for(int m=0;m<3;m++)//先计算的两个相邻数字共有3种情况,相当于括号的作用 { if(a[m+1]==0 && sign[i]=='/') break; temp[m]=calculate(a[m],a[m+1],sign[i]); temp[(m+1)%3]=a[(m+2)%4]; temp[(m+2)%3]=a[(m+3)%4]; //先确定首先计算的两个数字,计算完成相当于剩下三个数,按顺序存储在temp数组中 for(int n=0;n<2;n++)//三个数字选出先计算的两个相邻数字,两种情况,相当于第二个括号数字 { if(temp[n+1]==0 && sign[j]=='/') break; tem =calculate(temp ,temp[n+1],sign[j]); tem[(n+1)%2]=temp[(n+2)%3]; //先确定首先计算的两个数字,计算完成相当于剩下两个数,按顺序存储在temp数组中 if(tem[1]==0 && sign[k]=='/') break; sum=calculate(tem[0],tem[1],sign[k]); //计算和 if(sum==24) { judge=1;//已求得解 if(m==0 && n==0) outfile<<"(("<<a[0]<<sign[i]<<a[1]<<")"<<sign[j]<<a[2]<<")"<<sign[k]<<a[3]<<"="<<sum<<endl; else if(m==0 && n==1) outfile<<"("<<a[0]<<sign[i]<<a[1]<<")"<<sign[k]<<"("<<a[2]<<sign[j]<<a[3]<<")="<<sum<<endl; else if(m==1 && n==0) outfile<<"("<<a[0]<<sign[j]<<"("<<a[1]<<sign[i]<<a[2]<<")"<<sign[k]<<a[3]<<"="<<sum<<endl; else if(m==1 && n==1) outfile<<a[0]<<sign[k]<<"(("<<a[1]<<sign[i]<<a[2]<<")"<<sign[j]<<a[3]<<")="<<sum<<endl; else if(m==2 && n==0) outfile<<"("<<a[0]<<sign[j]<<a[1]<<")"<<sign[k]<<"("<<a[2]<<sign[i]<<a[3]<<")="<<sum<<endl; else if(m==2 && n==0) outfile<<a[0]<<sign[k]<<"("<<a[1]<<sign[j]<<"("<<a[2]<<sign[i]<<a[3]<<"))="<<sum<<endl; //m=0,1,2 n=0,1表示六种括号放置可能,并按照这六种可能输出相应的格式的计算式 } } } } } } if(judge==0) outfile<<"这四张扑克牌无法找到一个合理的解"<<endl; outfile<<"----------------------------------------------------------------"<<endl; outfile<<endl<<endl; outfile.close(); cout<<"计算完成,结果已保存在output.txt文件中!"<<endl; } void game24point::print() { cout<<"读取成功!"<<endl; for(int i=0;i<4;i++) { cout<<"第"<<i+1<<"张牌 "<<a[i]<<endl; } } int main(void) { game24point obj; obj.print(); cout<<endl; obj.search(); cout<<endl; system("PAUSE"); return 0; }
个人总结
在本次编写程序中,我发现我的编码速度仍然有待提高,起初编写的代码有点凌乱,效率比较低,每次运行都需要等待几秒钟,但是经过不断的修改,逐渐使得程序简洁明朗,效率也有所提升。
刚开始编译时也遇到了很多错误,但是根据错误提示很容易去改正,运行时,我尽可能的输入各种可能情况的数据,用以发现程序所存在功能方面的不足,然后返回程序再添加修改相应的功能,就这样一步一步地通过发现问题到解决问题,最终完成了这个程序。
说实话,每次的编程作业都会经历从痛苦到喜悦,在开始编程之前首先得考虑好大致的思路,然后再着手进行代码的编写,而且,程序并非一次性能编好,它需要不断地进行修改,不断地查漏补缺,不断地发现问题,最终才能编出一个较完善的程序。
最后,对于txt文件输出的格式,我尽量做得稍微人性化,使得界面看起来简洁明了。
相关文章推荐
- Java实现24点纸牌游戏
- 24点纸牌益智游戏
- 算24点纸牌游戏【破代码】
- 24点纸牌游戏计算器
- Java编写的24点纸牌游戏
- 24点纸牌游戏 c语言
- 24点纸牌游戏
- 纸牌游戏之24点
- 24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1)
- 24点纸牌游戏计算
- NYOJ 43-24 Point game,24点游戏:记忆搜索
- 24点游戏探秘系列7: 24点无解局面清单
- 24点游戏
- 每天一道编程题(一)----24点游戏
- C语言-纸牌计算24点小游戏
- hdu 2209 翻纸牌游戏
- 24点游戏
- C++实现24点游戏
- 24点游戏(java)
- 凑24点游戏实现