24点游戏设计
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?24點(diǎn)游戲設(shè)計(jì)
問題描述:在數(shù)字1-13中隨機(jī)生成4個數(shù)字,運(yùn)用加減乘除四則使4個數(shù)字的運(yùn)行結(jié)果為24,每個數(shù)字僅能使用一次。
算法設(shè)計(jì):實(shí)現(xiàn)24點(diǎn)運(yùn)算有如下兩種算法。
? ? ? ?算法一窮舉法。所謂窮舉法就是列出4個數(shù)字加減乘除的各種可能性。我們可以將表達(dá)式分成以下幾種:首先我們將4個數(shù)設(shè)為a,b,c,d,,將其排序列出四個數(shù)的所有排序序列組合(共有A44=24種組合)。再進(jìn)行符號的排列表達(dá)式,其中算術(shù)符號有+,—,*,/,(,)。其中有效的表達(dá)式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表達(dá)式。其中我們用枚舉類型將符號定義成數(shù)字常量。
? ?算法二是把多元運(yùn)算轉(zhuǎn)化為兩元運(yùn)算,先從四個數(shù)中取出兩個數(shù)進(jìn)行運(yùn)算,然后把運(yùn)算結(jié)果和第三個數(shù)進(jìn)行運(yùn)算,再把結(jié)果與第四個數(shù)進(jìn)行運(yùn)算。在求表達(dá)式的過程中,最難處理的就是對括號的處理,而這種思路很好的避免了對括號的處理。
核心代碼如下:
float Compute(char* str) {int i=0;float x;CharPush(m,';'); //初始化字符棧,中只有一個元素';',整數(shù)棧為空棧while(str[i]&&i<SIZE-1) //處理中綴表達(dá)式循環(huán){ x=0;if(str[i]==' '){i++;continue;}while(str[i]>=48&&str[i]<=57) //1到10的ASCII碼值{x=x*10+str[i]-48; //從屏幕上獲取的都是以字符的形式展現(xiàn)出來的,所以要ASCILL碼值都要減去48 ,這樣才能輸入多位數(shù)i++;}if(x!=0) ValuePush(n,x); //如果x的值不等于 0那么就進(jìn)整數(shù)棧else{int a=Prior2(str[i]); //處理?xiàng)M庾址鹖nt b=Prior(*(m.top-1)); //處理?xiàng)?nèi)字符,成員變量是字符棧中的棧頂元素if(a>b) //棧外運(yùn)算符優(yōu)先級高于棧內(nèi)運(yùn)算符優(yōu)先級{CharPush(m,str[i]);i++;} //將其插入到字符棧中else switch(CharPop(m)) //優(yōu)先級相反,括號里面的參數(shù)變量是字符棧內(nèi)的首元素{case '+':x=ValuePop(n)+ValuePop(n); //從整數(shù)棧中拋出兩個數(shù)值,進(jìn)行以上的運(yù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<<"零不能做除數(shù)"<<endl;i=SIZE-1;}break;case '(':i++;break;case ';':i=SIZE-1;break;default:cout<<"====輸入有誤===="<<endl;} } }x=ValuePop(n);return x; }
總結(jié)
- 上一篇: html dom onblur,html
- 下一篇: APUE---chap8(进程控制)--