C語言實現簡單24點遊戲
參考了很多網上的程式,簡單實現了基本功能
程式原始碼:
//##賀雪 軟工1502班 1508010208 #include<stdio.h> #include<time.h> #include<stdlib.h> int chu(int p,int q) //除法運算 { if(p%q==0) return p/q; else return 111111; } int fun(int i,int j,int c) //c(區域性變數)選擇運算子,i,j為運算數字 { int s; switch(c) { case 1: s=i+j;break; case 2: s=i-j;break; case 3: s=i*j;break; case 4: s=chu(i,j);break; } return s; } void print(int c) //c(區域性變數)選擇輸出運算子 { if(c==1)printf("+"); else if(c==2)printf("-"); else if(c==3)printf("*"); else printf("/"); } int main() { int f[4];//四個1-13的數 int i,j,m,n; int a,b,c;//符號 int d1,d2,d3; //每步的結果 srand(time(NULL)); //隨機生成四個數字(四張撲克牌) for(int w=0;w<4;w++) { f[w]=rand()%13+1; //生成隨機數範圍在1~13 } for(w=0;w<4;w++) { printf("%d ",f[w]); } printf("\n"); for(i=0;i<4;i++) for(j=0;j<4;j++) if(j!=i) for(m=0;m<4;m++) if(m!=i&&m!=j) for(n=0;n<4;n++) if(n!=i&&n!=j&&n!=m) //四個數字的位置不可重複且多重可能置換位置運算 for(a=1;a<5;a++) for(b=1;b<5;b++) for(c=1;c<5;c++) //選擇四個數字中間的三個運算子,皆有四種可能 { //避免了對括號的思考,轉化為二元運算 d1=fun(f[i],f[j],a); d2=fun(d1,f[m],b); //用前兩個數字的運算結果代替 d3=fun(d2,f[n],c); //同理,兩兩運算,遞迴過程 if(d3==24) { printf("%d",f[i]); print(a); printf("%d",f[j]); print(b); printf("%d",f[m]); print(c); printf("%d=24\n",f[n]); } } return 0; }
執行結果如下:
運算結果無法等於24: 執行結果等於24時,輸出所有表示式:做這次的程式,有很多的漏洞,一開始想法侷限在窮舉法中,列出了所有的可能性,一一比較輸出,毫無演算法可言,後來在網上查詢資料,看到了遞迴的方法,但是好多的for迴圈一時間很難讀懂,在程式的思維方法上無法理解,學習了很久才看懂了for語句的巢狀以及迴圈變數的範圍設定的意義,雖然這次在程式設計和思維創新上收穫不大,但是通過對這個演算法的理解,對for迴圈巢狀的應用和題目的邏輯思考有了很深的體會和學習。
這次只完成了基本的要求,對於提高要求,會繼續查詢相關資料,學習完成。