一、常見游戲規則
從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求編程解決24點游戲。
基本要求: 隨機生成4個代表撲克牌牌面的數字字母,程序自動列出所有可能算出24的表達式,用擅長的語言(C/C++/Java或其他均可)實現程序解決問題。
1.程序風格良好(使用自定義注釋模板)
2.列出表達式無重復。
二、具體代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
#include<iostream> #include<stdlib.h> #include<math.h> #include<time.h> using namespace std; int m; //用來標志能否運算出24 double arithmetic( int flag, float m, float n) //進行四則運算 { switch (flag) //判斷運算符號,返回相對應的運算結果 { case 0: return (m+n); case 1: return (m-n); case 2: return (m*n); case 3: if (n==0) return 10000; //除數為0,則返回10000,使之不能運算出24 else return (m/n); case 4: return (n-m); case 5: if (m==0) return 10000; //除數為0,則返回10000,使之不能運算出24 else return (n/m); default : return 0; } } void show( int type, int i, int j, int k, float a, float b, float c, float d) //利用參數type選擇輸出形式,利用參數i,j,k確定輸出的運算符號 { char sign[6]; //定義運算符號數組 sign[0]= '+' ; sign[1]= '-' ; sign[2]= '*' ; sign[3]= '/' ; sign[4]= '-' ; //減法不符合交換律 sign[5]= '/' ; //除法不符合交換律 if (type==1) //根據括號的類型做不同的輸出 { if (j==4 || j==5) //減法和除法 { if (k==4 || k==5) // a*(b*(c+d)) 形式 cout<<d<<sign[k]<< "(" <<c<<sign[j]<< "(" <<a<<sign[i]<<b<< ")) = 24 " <<endl; else // (a*(b+c))*d 形式 cout<< "(" <<c<<sign[j]<< "(" <<a<<sign[i]<<b<< "))" <<sign[k]<<d<< " = 24" <<endl; } else if (k==4 || k==5) // a*((b+c)*d) 形式 { cout<<d<<sign[k]<< "((" <<a<<sign[i]<<b<< ")" <<sign[j]<<c<< ") = 24" <<endl; } else // ((a+b)*c)*d 形式 cout<< "((" <<a<<sign[i]<<b<< ")" <<sign[j]<<c<< ")" <<sign[k]<<d<< "= 24" <<endl; } if (type==2 || type==3) // (a+b)*(c+d) 形式 { cout<< "(" <<a<<sign[i]<<b<< ")" <<sign[k]<< "(" <<c<<sign[j]<<d<< ")= 24" <<endl; } } void calculate( float a, float b, float c, float d) //進行加、減、乘、除運算 { int i,j,k; float sum1,sum2,sum3; //儲存 3 次兩兩運算的結果 for (i=0; i<4; i++) // "+ - * /" 4個運算符號選3個,有4*4*4=64種 for (j=0; j<6; j++) // 3種運算符排列 有 3!=6 種 for (k=0; k<6; k++) { if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0))) // 括號的類型為(()) { // 3為做除法運算的標志,除數為 0 時,跳過 = = sum1=arithmetic(i,a,b); //a,b做 以 i 為標志的運算,然后把值賦給sum1 sum2=arithmetic(j,sum1,c); //sum1,c做 以 j 為標志的運算,然后把值賦給sum2 sum3=arithmetic(k,sum2,d); //sum2,d做 以 k 為標志的運算,然后把值賦給sum3 if ( fabs (sum3-24)<0.001) //判斷能否運算出24,出現小數時,能夠包含在內 { m++; //標志能運算出24 show(1,i,j,k,a,b,c,d); // 輸出運算出 24 的表達式 } } if (k==2) // ()*() { sum1=arithmetic(i,a,b); //a,b做 以 i 為標志的運算,然后把值賦給sum1 sum2=arithmetic(j,c,d); //sum1,c做 以 j 為標志的運算,然后把值賦給sum2 sum3=sum1*sum2; if ( fabs (sum3-24)<0.001) //出現小數時,能夠包含在內 { m++; //標志能運算出24 show(2,i,j,k,a,b,c,d); // 輸出運算出 24 的表達式 } } if (k==3) // 括號的類型為()() { sum1=arithmetic(i,a,b); //sum1,c做 以 j 為標志的運算,然后把值賦給sum2 sum2=arithmetic(j,c,d); //sum1,c做 以 j 為標志的運算,然后把值賦給sum2 if (sum2!=0) { sum3=sum1/sum2; if ( fabs (sum3-24)<0.001) //出現小數時,能夠包含在內 { m++; //標志能運算出24 show(3,i,j,k,a,b,c,d); // 輸出運算出 24 的表達式 } } } } } int main() //主函數 { int y; int i,j,k,l; srand ((unsigned) time (0)); int a[4]; //儲存所輸入的 4個 整數 { cout<< "******************************24點游戲*******************************" <<endl<<endl; cout<< "請輸入選項:0、隨機生成數字 1、離開游戲" <<endl; cin>>y ; //輸入選項 while ( true ) { if (y==0) { for (i=0; i<4; i++) { a[i]= rand ()%13+1; } for (i=0; i<4; i++) { cout<<a[i]<< " " ; } cout<<endl; break ; } else { cout<< "等你回來哦!" <<endl; return 0; } } for (i=0; i<4; i++) //4的排列 4!=24,每中情況調用calculate for (j=0; j<4; j++) if (j!=i) //第2數和第1個數不能重復 for (k=0; k<4; k++) if (k!=j && k!=i) //第3數和第1,2個數不能重復 for (l=0; l<4; l++) if (l!=i && l!=j && l!=k) //第4數和第1,2,3個數不能重復 { calculate(a[i],a[j],a[k],a[l]); //調用calculate函數,進行進行加、減、乘、除運算 } } return 0; } |
三、測試截圖
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/weixin_41258179/article/details/82901853