24点游戏设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34778691/article/details/70056076

                                                                                                         24点游戏设计

问题描述:在数字1-13中随机生成4个数字,运用加减乘除四则使4个数字的运行结果为24,每个数字仅能使用一次。

算法设计:实现24点运算有如下两种算法。

       算法一穷举法。所谓穷举法就是列出4个数字加减乘除的各种可能性。我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。再进行符号的排列表达式,其中算术符号有+,—,*,/,(,)。其中有效的表达式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表达式。其中我们用枚举类型将符号定义成数字常量

   算法二是把多元运算转化为两元运算,先从四个数中取出两个数进行运算,然后把运算结果和第三个数进行运算,再把结果与第四个数进行运算。在求表达式的过程中,最难处理的就是对括号的处理,而这种思路很好的避免了对括号的处理。

核心代码如下:

float Compute(char* str)
{
	int i=0;
	float x;
	CharPush(m,';');           //初始化字符栈,中只有一个元素';',整数栈为空栈
	while(str[i]&&i<SIZE-1)   //处理中缀表达式循环
	{ 
		x=0;
		if(str[i]==' ')
		{
			i++;
			continue;
		}
		while(str[i]>=48&&str[i]<=57) //1到10的ASCII码值
		{
			x=x*10+str[i]-48;     //从屏幕上获取的都是以字符的形式展现出来的,所以要ASCILL码值都要减去48 ,这样才能输入多位数
			i++;
		}
		if(x!=0) ValuePush(n,x);     //如果x的值不等于 0那么就进整数栈
		else
		{
			int a=Prior2(str[i]);   //处理栈外字符
			int b=Prior(*(m.top-1)); //处理栈内字符,成员变量是字符栈中的栈顶元素
			if(a>b)                  //栈外运算符优先级高于栈内运算符优先级
			{
				CharPush(m,str[i]);i++;} //将其插入到字符栈中
			else 
				switch(CharPop(m))       //优先级相反,括号里面的参数变量是字符栈内的首元素
			{
				case '+':x=ValuePop(n)+ValuePop(n); //从整数栈中抛出两个数值,进行以上的运算
					ValuePush(n,x); break;
				case '-':x=ValuePop(n);
					x=ValuePop(n)-x;
					ValuePush(n,x);break;
				case '*':x=ValuePop(n)*ValuePop(n);
					ValuePush(n,x);break;
				case '/':x=ValuePop(n);
					if(x!=0.0)
					{
						x=ValuePop(n)/x;
						ValuePush(n,x);
					}
					else {cout<<"零不能做除数"<<endl;i=SIZE-1;}
					break;
				case '(':i++;break;
				case ';':i=SIZE-1;break;
				default:cout<<"====输入有误===="<<endl;
			} 
		} 
	}
	x=ValuePop(n);
	return x;
}



猜你喜欢

转载自blog.csdn.net/qq_34778691/article/details/70056076
今日推荐