admin 管理员组文章数量: 1086019
2024年4月27日发(作者:基因编程可怕的技术)
一、 实验设计方案
1、实验内容与目的(简单介绍实验内容,说明实验目的)
实验目的:实现扑克牌游戏:对于任意的四个1到13的整数(四张扑克牌),求能
算出24的表达式;运算符有()+-*/;若无解则输出相应的信息。
实验内容:
你的具体选择(要详细)
文件输入()输出(),输出全部结果;
——————————————————————————————————————
2、实验准备工作(阐述解决问题所涉及的算法思想,至少要画一个算法流程图来说明)
本次实验相当于,给出四个数字,要求,在其间添加运算符和括号,使得计算结果
等于24。
括号的放置即为决定哪几个数先进行计算。所以,我们先确定首先进行计算的两个
相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间添加符号;然后再
决定在这三个数中哪两个相邻的数先计算。由此,我们就成功解决了数字的运算次序问
题,此时不需要再考虑不同运算符号的优先级问题,因为括号的优先级高于加减乘除。
通过循环,我们可以得到第一第二第三次计算的运算符,再通过计算,就可以得出
和,若和等于24,即为所求解。
在输出格式中,由于括号的放置共六种情况,故根据计算先后顺序的不同,输出时
在不同地方放置括号;
以下为循环计算的流程图:
选择先
行计算
的两个
相邻数
第一
个数
字
第二
个数
字
第三
个数
字
第四
个数
字
第一个
符号
选择先
行计算
的两个
相邻数
第一
个数
字
第二
个数
字
第三
个数
字
第二个
符号
第一
个数
字
第二
个数
字
第三个
符号
和
表示循环获取;
表示计算数值
以下为计算函数的流程图:
数字2
数字1
数字1
数字2
结果
+或-
或*
符号
/
返回
结果
若数字2
不为0
——————————————————————————————————————
二、实验步骤、测试与结果分析
1、源程序的设计(在此附上源程序(cpp文件)清单)
#include
#include
#include
using namespace std;
char sign[4]={'+','-','*','/'};
//定义一个全局变量,用于储存加减乘除符号,方便下面符号判断
class game24point
//24点纸牌游戏类
{
private:
double a[4];
//为实现精确计算,防止计算结果为小数却被强制转换为整数,采用double变量
public:
game24point();
//构造函数
double calcute(double,double,char);
//计算函数,给出一个符号两个有顺序的数,计算结果
void search();
//搜索函数,用于寻找合适的解
void print();
//打印得到的四张纸牌的数值
};
game24point::game24point()
{
char ch[4];
//由于纸牌中除了数字还有AJQK等字符,故使用字符数组
ifstream infile("");
if(!infile)
//若打开失败
{
cout<<"打开文件失败!"< exit(1); } for(int i=0;i<4;i++) infile>>ch[i]; //在input文件中读取数据 cout<<" ##########################################"< cout<<" ## ##"< cout<<" ## 正在从中读取数据 ##"< cout<<" ## ##"< cout<<" ##########################################"< for(i=0;i<4;i++) { if(ch[i]=='A') a[i]=10; 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]=='1') a[i]=1; 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 { cout<<"第"< exit(1); } } //纸牌字符转换为数值 (); } double game24point::calcute(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; //只有当分母不为0时,返回结果 } void game24point::search() { double temp[3],tem[2]; //第一个符号放置后,经过计算后相当于剩下三个数,这个数组用于存储这三个数 double sum; //求得的和 int judge=0; //判断是否找到一个合理的解 ofstream outfile("",ios::app); //以输出的方式打开文件 if(!outfile) //若文件打开失败 { cout<<"打开文件失败"< exit(1); } cout<<" ##########################################"< cout<<" ## ##"< cout<<" ## 正在计算结果,请等待 ##"< cout<<" ## ##"< cout<<" ##########################################"< outfile<<"=============================================================== ========"< outfile<<" ##########################################"< outfile<<" ## ##"< outfile<<" ## 本次24点游戏求得结果如下 ##"< outfile<<" ## ##"< outfile<<" ##########################################"< 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]=calcute(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[n]=calcute(temp[n],temp[n+1],sign[j]); tem[(n+1)%2]=temp[(n+2)%3]; //先确定首先计算的两个数字,计算完成相当于剩下两个数,按 顺序储存在temp数组中 if(tem[1]==0 && sign[k]=='/') break; sum=calcute(tem[0],tem[1],sign[k]); //计算和 if(sum==24) //若和为24 { judge=1; //判断符为1,表示已求得解 if(m==0 && n==0) outfile<<"(("< ]<<"="< else if(m==0 && n==1) outfile<<"("< <<")="< else if(m==1 && n==0) outfile<<"("< <<"="< else if(m==1 && n==1)
版权声明:本文标题:C++24点扑克牌游戏(含源码) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1714178297a668551.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论