1. 程式人生 > >24點遊戲設計

24點遊戲設計

                                                                                                         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;
}