C++實現經典24點紙牌益智遊戲
阿新 • • 發佈:2020-03-07
本文為大家分享了經典24點紙牌益智遊戲的具體實現方法,供大家參考,具體內容如下
一.實驗內容
24點遊戲是經典的紙牌益智遊戲。
常見遊戲規則:
從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求程式設計解決24點遊戲。
基本要求: 隨機生成4個代表撲克牌牌面的數字字母,程式自動列出所有可能算出24的表示式,用擅長的語言(C/C++/Java或其他均可)實現程式解決問題。
1.程式風格良好(使用自定義註釋模板)
2.列出表示式無重複。
二.演算法設計思路
演算法描述:
1.通過rand()函式生成4個隨機數
2.通過F()函式進行遞迴呼叫
4.遞迴過程中,判斷是否(n==1&&A[0]==24),滿足條件則輸出結果。最後通過count最終知道有多少種解法
三.程式碼實現
#include<iostream> #include<stdlib.h> #include<math.h> #include<string.h> #include<ctime> using namespace std; int n=4; //三次運算標記值 double A[4]={0}; //儲存4個數字 char oper[4]={'+','-','*','/'}; //儲存運算子 string B[4]; int count=0; int F(int n){ //判斷是否已完成三次運算 if(n==1){ if(A[0]==24) //判斷結果是否為24 { cout<<B[0]<<endl; //如果是則輸出B[0]裡蘊含的整個表示式 count++; } } //遞迴實現 //從陣列中任意取出兩個數的組合 for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ double a,b; string x,y; a=A[i]; b=A[j]; A[j]=A[n-1]; //將最後一位數賦給A[j] x=B[i]; y=B[j]; B[j]=B[n-1]; //最後一位數字放入B[j]中 //加法 A[i]=a+b; //第一個空間儲存前兩個數的運算結果 B[i]='('+x+'+'+y+')'; //將運算結果存入陣列B中 F(n-1); //減法 //考慮兩種情況:1. a-b 2. b-a A[i]=a-b; B[i]='('+x+'-'+y+')'; F(n-1); A[i]=b-a; B[i]='('+y+'-'+x+')'; F(n-1); //乘法 A[i]=a*b; B[i]='('+x+'*'+y+')'; F(n-1); //除法 //考慮兩種情況:1. a/b 2. b/a 同時需要判斷分母不為零 if(b!=0){ A[i]=a/b; B[i]='('+x+'/'+y+')'; F(n-1); } if(a!=0){ A[i]=b/a; B[i]='('+y+'/'+x+')'; F(n-1); } //當以上四則運算的結果都不能滿足條件時 //進入下一個for迴圈之前,需要將之前的i和j上的值都找回,即賦值 A[i]=a; A[j]=b; B[i]=x; B[j]=y; } } } class RandNum{ public: RandNum(){ srand(time(0)); } double get(int begin = 0,int end = 1){ return rand()%(end-begin+1)+begin; } }; int main(void) { RandNum r; for (int i = 0; i < 4; i++) { //生成4個1~13之間的數字 A[i]=r.get(1,13); //將生成的數字存入陣列A中 cout<<A[i]<<" "; } cout<<endl; for(int i=0;i<4;i++){ if(A[i]==1) B[i]='A'; else if(A[i]==10) B[i]="10"; else if(A[i]==11) B[i]='J'; else if(A[i]==12) B[i]='Q'; else if(A[i]==13) B[i]='K'; else B[i]='0'+A[i]; } F(n); cout<<endl<<"總共有 "<<count<<" 種解法"<<endl; return 0; }
四.測試及執行結果
五.經驗歸納
這次的程式設計採用了遞迴呼叫的方式,使得問題一步步化簡,即每次都是兩個數字進行運算,得到結果,結果再與下一個數字進行運算,直到滿足終止條件,結束遞迴。遞迴這種思想雖然很好寫出,但難以理解,尤其是對一些大型的演算法。通過這次的程式設計,我對遞迴有了更深的認識。雖然遞迴的執行效率很低,但是有一些問題必須使用遞迴解決,因此我會在以後的程式設計中經常用到遞迴,提高對於遞迴的理解能力。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。