1. 程式人生 > 程式設計 >C語言實現24點遊戲原始碼

C語言實現24點遊戲原始碼

本文例項為大家分享了C語言實現24點遊戲的具體程式碼,供大家參考,具體內容如下

參考文章:C語言實現經典24點演算法

將演算法實現改成C語言,並可在linux伺服器上執行。同時修改為可顯示所有結果。
注:如果傳參重複,如4,4,7,7這樣,會回顯重複結果,暫無法清除。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> 

const double PRECISION = 1E-6; 
#define COUNT 4 
const int RESULT = 24; 
#define STRLEN 50
double number[COUNT] = {0};  //這裡一定要用double,char expression[COUNT][STRLEN] = {0}; //儲存表示式 

#define TRUE 1
#define FALSE 0

int cnt = 0;

void Test(int n)
{ 
 int i = 0;
 int j = 0;
 int len = 0;
 //遞迴結束 
 if(1 == n){ 
  if(number[0] == RESULT)
  { 
   // 避免輸出前後括號 
   for (i = 1; i < strlen(expression[0]) - 1; i++) 
   { 
    printf("%c",expression[0][i]); 
   } 
   printf("\n"); 
   cnt++;
   return; 
  } 
  else 
   return; 
 } 
 //遞迴過程 
 for(i=0;i<n;i++){ 
  for(j=i+1;j<n;j++){ 
   double a,b; 
   char expa[STRLEN] = {0};
   char expb[STRLEN] = {0};
   a=number[i]; 
   b=number[j]; 
   // 刪除number[j]元素,用number[n-1]填補 
   number[j]=number[n-1]; 
   strcpy(expa,expression[i]);
   strcpy(expb,expression[j]);
   // 刪除expression[j]元素,用expression[n-1]填補 
   strcpy(expression[j],expression[n-1]);

   // 加法 
   len= strlen(expression[i]);
   snprintf(expression[i],STRLEN,"(%s+%s)",expa,expb);
   number[i]=a+b; 
   Test(n-1);
   //減號有兩種情況,a-b與b-a 
   len= strlen(expression[i]);
   snprintf(expression[i],"(%s-%s)",expb);
   number[i]=a-b; 
   Test(n-1); 
   if(a != b)
   {
    len= strlen(expression[i]);
    snprintf(expression[i],expb,expa); 
    number[i]=b-a; 
    Test(n-1); 
   }
   // 乘法 
   len= strlen(expression[i]);
   snprintf(expression[i],"(%s*%s)",expb); 
   number[i]=a*b; 
   Test(n-1); 
   //除法也有兩種情況,a/b與b/a 
   if(b!=0){ 
    len= strlen(expression[i]);
    snprintf(expression[i],"(%s/%s)",expb);
    number[i]=a/b; 
    Test(n-1);
   } 
   if((a!=0) && (a != b)){ 
    len= strlen(expression[i]);
    snprintf(expression[i],expa);
    number[i]=b/a; 
    Test(n-1); 
   } 
   //恢復陣列 
   number[i]=a; 
   number[j]=b; 
   strcpy(expression[i],expa);
   strcpy(expression[j],expb);
  } 
 } 
 return; 
} 
int main(int argc,char **argv)
{ 
 int i = 0;

 if(5 != argc)
 {
  printf("arg err\n");
  return 0;
 }

 for(i=0;i<COUNT;i++)
 { 
  char buffer[20]; 
  number[i] = atoi(argv[i + 1]);
  strcpy(expression[i],argv[i + 1]);
 } 

 Test(COUNT);

 if(0 != cnt) 
 {
  printf("Total[%d],Success\n",cnt); 
 }
 else 
 {
  printf("Fail\n"); 
 }
 return 0;
} 

執行結果如下:

andy@ubuntu14:~/work$ ./test 5 6 7 8
((5+7)-8)*6
(5+7)*(8-6)
8/((7-5)/6)
(6/(7-5))*8
6/((7-5)/8)
(8/(7-5))*6
(6*8)/(7-5)
((5-8)+7)*6
(7-(8-5))*6
(5+7)*(8-6)
(6*8)/(7-5)
(5+(7-8))*6
(5-(8-7))*6
Total[13],Success
andy@ubuntu14:~/work$ ./test 7 7 7 7
Fail

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