24点游戏(c++)

24点游戏(c++)
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。
`
以下为源代码:
#include
#include
#include <math.h>
#include <time.h>
using namespace std;
const double LING = 1E-6;
const int CONT = 4;
const int VOLUE = 24;
double number[CONT];//四张纸牌
string expression[CONT];//保存表达式
static string s;
static int life=3,score=0;
bool m_judge = false; //判断是否有解。
int count = 0;//统计解的个数
//递归方法
void Test(int n)
{
if (n == 1)
{
if ( fabs(number[0] - VOLUE) <= LING )
{
if(!(expression[0].compare(s)))//将输入的表达式与满足24点的表达式进行比较
{
cout<<“输入正确”<<endl;
score=score+10;
cout<<“life=”<<life<<endl;
cout<<“score=”<<score<<endl;
}
else
{
cout<<endl<<“life=”<<–life<<endl;
cout<<“score=”<<score<<endl;
}
cout << expression[0] << “\t\t”;
m_judge = true;
life++;
count ++;
if((count % 3)==0) //使输出时每行三个表达式
cout<<endl;

	}
	
}
for(int i=0; i < n; i++)//从数组中取任意两个数的组合
{
	for (int j = i + 1; j < n; j++)//与其后面的查找进行计算
	{
		double a, b;
		string expressiona, expressionb;
		a = number[i];//前一个值
		b = number[j];//后一个值
		// 删除number[j]元素,用number[n-1]填补
		number[j] = number[n - 1];
		expressiona = expression[i];
		expressionb = expression[j];
		 // 删除expression[j]元素,用expression[n-1]填补
		expression[j] = expression[n - 1];
		expression[i]= '('+ expressiona + '+' + expressionb + ')';
		number[i] = a + b;//将运算结果放入数组中
		Test(n-1);//对新数组调用递归函数
		expression[i]='('+ expressiona+ '-' + expressionb + ')';
		number[i] = a - b;
		Test(n-1);
		expression[i] = '('+expressionb + '-' + expressiona + ')';
		number[i] = b -a;
		Test(n-1);
		expression[i]= '('+ expressiona +'*'+ expressionb+ ')';
		number[i]=a*b;
		Test(n-1);
		//除法的两种情况
		if (b != 0)
		{
			expression[i] ='('+expressiona+'/' + expressionb + ')';
			number[i] = a / b;
			Test(n-1);
		}
		if (a != 0)
		{
			expression[i]='('+expressionb + '/'+ expressiona + ')';
			number[i] = b / a;
			Test(n-1);
		}
		number[i] =a;
		number[j]=b;
		expression[i] = expressiona;
		expression[j] = expressionb;
	}
}

}
//将随机生成的数字转换为纸牌
char getPoker(int val)
{
if(val1)
{ return ‘A’; }
else if(val<10)
{ return val+‘0’;}
else if(val
10)
{ return ‘0’;}
else if(val11)
{ return ‘J’; }
else if(val
12)
{ return ‘Q’; }
else if(val13)
{ return ‘K’; }
}
int main()
{
printf(“纸牌计算24点\n--------------------------------------------\n”);
cout<<“life=”<<life<<endl;
cout<<“score=”<<score<<endl;
printf(“随机生成的纸牌为:\n”);
srand((unsigned)time(NULL));
for (int i = 0; i < CONT; i++)
{
char ch[20];
cout<<“第”<<i+1<<“个数:”;
number[i]=rand()%12+1; //随机产生4个数
cout<<number[i]<<endl;
//printf("%c \n",getPoker(number[i]));
itoa(number[i],ch, 10); //itoa()函数的作用是把第一个参数(数值)传送(转换)到第二个参数(字符串)中去,第三个参数(int型)是该数值在字符串里以什么进制存放。
expression[i] = ch;//把四个数存到数组里
}
cout<<endl;
cin>>s;
cout<<endl;
Test(CONT) ;
if(m_judge
true)//解存在,输出解的个数
{
cout << “\n成功!” << endl;
cout<<“总共的计算方法共有: “<<count<<endl;
}
else
{
cout << “失败!” << endl;
}
printf(”--------------------------------------------\n”);

return 0;

}`

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值