一、常見游戲規(guī)則
從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求編程解決24點游戲。
基本要求: 隨機生成4個代表撲克牌牌面的數(shù)字字母,程序自動列出所有可能算出24的表達式,用擅長的語言(C/C++/Java或其他均可)實現(xiàn)程序解決問題。
1.程序風格良好(使用自定義注釋模板)
2.列出表達式無重復(fù)。
二、具體代碼
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) //判斷運算符號,返回相對應(yīng)的運算結(jié)果 { case 0: return (m+n); case 1: return (m-n); case 2: return (m*n); case 3: if (n==0) return 10000; //除數(shù)為0,則返回10000,使之不能運算出24 else return (m/n); case 4: return (n-m); case 5: if (m==0) return 10000; //除數(shù)為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) //利用參數(shù)type選擇輸出形式,利用參數(shù)i,j,k確定輸出的運算符號 { char sign[6]; //定義運算符號數(shù)組 sign[0]= '+' ; sign[1]= '-' ; sign[2]= '*' ; sign[3]= '/' ; sign[4]= '-' ; //減法不符合交換律 sign[5]= '/' ; //除法不符合交換律 if (type==1) //根據(jù)括號的類型做不同的輸出 { 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 次兩兩運算的結(jié)果 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為做除法運算的標志,除數(shù)為 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,出現(xiàn)小數(shù)時,能夠包含在內(nèi) { 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) //出現(xiàn)小數(shù)時,能夠包含在內(nèi) { 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) //出現(xiàn)小數(shù)時,能夠包含在內(nèi) { m++; //標志能運算出24 show(3,i,j,k,a,b,c,d); // 輸出運算出 24 的表達式 } } } } } int main() //主函數(shù) { int y; int i,j,k,l; srand ((unsigned) time (0)); int a[4]; //儲存所輸入的 4個 整數(shù) { cout<< "******************************24點游戲*******************************" <<endl<<endl; cout<< "請輸入選項:0、隨機生成數(shù)字 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,每中情況調(diào)用calculate for (j=0; j<4; j++) if (j!=i) //第2數(shù)和第1個數(shù)不能重復(fù) for (k=0; k<4; k++) if (k!=j && k!=i) //第3數(shù)和第1,2個數(shù)不能重復(fù) for (l=0; l<4; l++) if (l!=i && l!=j && l!=k) //第4數(shù)和第1,2,3個數(shù)不能重復(fù) { calculate(a[i],a[j],a[k],a[l]); //調(diào)用calculate函數(shù),進行進行加、減、乘、除運算 } } return 0; } |
三、測試截圖
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/weixin_41258179/article/details/82901853