1. 程式人生 > 程式設計 >C++實現經典24點紙牌益智遊戲

C++實現經典24點紙牌益智遊戲

本文為大家分享了經典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()函式進行遞迴呼叫

3.首先將陣列A中的兩個數進行運算,得到結果,然後通過遞迴呼叫將結果與下一個數字運算,得到結果再通過遞迴呼叫,與最後一個數進行運算
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;
}

四.測試及執行結果

C++實現經典24點紙牌益智遊戲

C++實現經典24點紙牌益智遊戲

五.經驗歸納

這次的程式設計採用了遞迴呼叫的方式,使得問題一步步化簡,即每次都是兩個數字進行運算,得到結果,結果再與下一個數字進行運算,直到滿足終止條件,結束遞迴。遞迴這種思想雖然很好寫出,但難以理解,尤其是對一些大型的演算法。通過這次的程式設計,我對遞迴有了更深的認識。雖然遞迴的執行效率很低,但是有一些問題必須使用遞迴解決,因此我會在以後的程式設計中經常用到遞迴,提高對於遞迴的理解能力。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。