Java实现24点小游戏

时间:2022-04-27 16:12:01

本文实例为大家分享了java实现24点小游戏的具体代码,供大家参考,具体内容如下

程序设计要求:

24点游戏是经典的纸牌益智游戏。

常见游戏规则:

从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,j代表11,q代表12,k代表13,a代表1),按照要求编程解决24点游戏。

基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(c/c++/java或其他均可)实现程序解决问题。

1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。

算法设计思路:

算法采用了穷举的方法,对所有数字和操作符进行组合,从而找到所有的情况。
刚开始将四个数进行分组排序。
算法中我采用了将四个数分为1种的,两种的(在两种中又分为两种数的个数分别为1和3的,个数分别为2和2的),三种的和四种的,将所有情况排序排了出来。
每次只运算2个数,然后将结果拿去进行下一次运算。刚开始有4个数,拿出两个数进行第一次运算,运算后得出三个数,然后在这三个数中再拿出两个进行第二次运算,运算后就有两个数了,第三次运算就是将这两个数进行计算,得出最后值,判断最后这个值是否为24,若为24,则输出表达式,若不是,则输出提示消息。
现在在这4个数确定位置的情况下,再来改变操作符,即每次2个数进行运算的时候,有4种情况。在下一次计算的时候同样有4种情况,最后一次计算(第3次)同理。这样就找到了所有解的情况。

算法流程图为:

Java实现24点小游戏

下面是代码:

?
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
package game;
 
import java.util.arraylist;
import java.util.hashmap;
import java.util.map;
import java.util.random;
 
public class compute {
 //定义随机产生的四个数
 static int number[] = new int[4];
 //转换后的num1,num2,num3,num4
 static int m[]=new int [4];
 static string n[] = new string[4];
 //用来判断是否有解
 static boolean flag = false;
 //存放操作符
 static char[] operator = { '+', '-', '*', '/' };
 private static object key;
 
 public static void main(string[] args){
 random rand = new random();
 system.out.println("下列给出四个数字,使用+,-,*,/进行计算使最后计算结果为24");
 for(int i=0;i<4;i++){
 number[i]=rand.nextint(13)+1;//随机生成四个int型数
 
 if(number[i]==1){
 system.out.println("a");//如果随机生成的数为1,则显示为扑克牌牌面中的a
 }
 else if(number[i]==11){
 system.out.println("j");//如果随机生成的数为11,则显示为扑克牌牌面中的j
 }
 else if(number[i]==12){
 system.out.println("q");//如果随机生成的数为12,则显示为扑克牌牌面中的q
 }
 else if(number[i]==13){
 system.out.println("k");//如果随机生成的数为13,则显示为扑克牌牌面中的k
 }
 else
 system.out.println(number[i]);
 }
 system.out.println("可能的结果有:");
 calculate();
 
 }
 
 
 //给定2个数和指定操作符的计算
 public static int calcute(int count1, int count2, char operator) {
 if (operator == '+') {
  return count1 + count2;
  }
  else if (operator == '-') {
  return count1 - count2;
  }
  else if (operator == '*') {
  return count1 * count2;
  }
  else if ((operator == '/' )&& (count2 != 0) && (count1%count2==0)) {
  return count1 / count2;
  }
  else {
  return -1;  
  }
 }
 
 
 //计算生成24的函数
 public static void calculate(){
 
 map<integer, integer> map = new hashmap<integer, integer>();
 //存放数字,用来判断输入的4个数字中有几个重复的,和重复的情况
 for (int i = 0; i < number.length; i++) {
 if(map.get(number[i]) == null){
 map.put(number[i], 1);
 }
 else {
 map.put(number[i], map.get(number[i]) + 1);
 }
 }
 if(map.size() == 1){
 //如果只有一种数字,此时只有一种排列组合,如5,5,5,5
 calculation(number[0], number[1],number[2],number[3]);
 }
 else if(map.size()==2){
 //如果只有2种数字,有2种情况,如1,1,2,2和1,1,1,2
 int index = 0;//用于数据处理
 int state = 0;//判断是哪种情况
 for (integer key : map.keyset()) {
 if(map.get(key) == 1){
  //如果是有1个数字和其他3个都不同,将number变为 number[0]=number[1]=number[2],
  //将不同的那个放到number[3],方便计算
  number[3] = key;
  state = 1;
 }
 else if(map.get(key)==2){
  //如果是两两相同的情况,将number变为number[0]=number[1],number[2]=number[3]的情况
  number[index++]=key;
  number[index++]=key;
 }
 else{
  number[index++]=key;
 }
 }
 //列出2种情况的所有排列组合,并分别计算
 if(state == 1){
 calculation(number[3],number[1],number[1],number[1]);
 calculation(number[1],number[3],number[1],number[1]);
 calculation(number[1],number[1],number[3],number[1]);
 calculation(number[1],number[1],number[1],number[3]);
 }
 if(state==0){
 calculation(number[1],number[1],number[3],number[3]);
 calculation(number[1],number[3],number[1],number[3]);
 calculation(number[1],number[3],number[3],number[1]);
 calculation(number[3],number[3],number[1],number[1]);
 calculation(number[3],number[1],number[3],number[1]);
 calculation(number[3],number[1],number[1],number[3]);
 }
 }
 else if(map.size()==3){
 //有3种数字的情况
 int index = 0;
 for (integer key : map.keyset()) {
 if(map.get(key) == 2){ 
  //将相同的2个数字放到number[2]=number[3]
  number[2] = key; 
  number[3] = key;
 }
 else
  number[index++] = key;
 }
 }
 //排列组合,所有情况
 calculation(number[0],number[1],number[3],number[3]);
 calculation(number[0],number[3],number[1],number[3]);
 calculation(number[0],number[3],number[3],number[1]);
 calculation(number[1],number[0],number[3],number[3]);
 calculation(number[1],number[3],number[0],number[3]);
 calculation(number[1],number[3],number[3],number[0]);
 calculation(number[3],number[3],number[0],number[1]);
 calculation(number[3],number[3],number[1],number[0]);
 calculation(number[3],number[1],number[3],number[0]);
 calculation(number[3],number[0],number[3],number[1]);
 calculation(number[3],number[0],number[1],number[3]);
 calculation(number[3],number[1],number[0],number[3]);
 }
 else if(map.size() == 4){
 //4个数都不同的情况
 calculation(number[0],number[1],number[2],number[3]);
 calculation(number[0],number[1],number[3],number[2]);
 calculation(number[0],number[2],number[1],number[3]);
 calculation(number[0],number[2],number[3],number[1]);
 calculation(number[0],number[3],number[1],number[2]);
 calculation(number[0],number[3],number[2],number[1]);
 calculation(number[1],number[0],number[2],number[3]);
 calculation(number[1],number[0],number[3],number[2]);
 calculation(number[1],number[2],number[3],number[0]);
 calculation(number[1],number[2],number[0],number[3]);
 calculation(number[1],number[3],number[0],number[2]);
 calculation(number[1],number[3],number[2],number[0]);
 calculation(number[2],number[0],number[1],number[3]);
 calculation(number[2],number[0],number[3],number[1]);
 calculation(number[2],number[1],number[0],number[3]);
 calculation(number[2],number[1],number[3],number[0]);
 calculation(number[2],number[3],number[0],number[1]);
 calculation(number[2],number[3],number[1],number[0]);
 calculation(number[3],number[0],number[1],number[2]);
 calculation(number[3],number[0],number[2],number[1]);
 calculation(number[3],number[1],number[0],number[2]);
 calculation(number[3],number[1],number[2],number[0]);
 calculation(number[3],number[2],number[0],number[1]);
 calculation(number[3],number[2],number[1],number[0]);
 }
 if(flag==false)
 system.out.println("这四张牌面数字无法经过运算得到24!");
 }
 
 
 public static void calculation(int num1, int num2, int num3, int num4){
 
 for (int i = 0; i < 4; i++){
 //第1次计算,先从四个数中任意选择两个进行计算
 char operator1 = operator[i];
 int firstresult = calcute(num1, num2, operator1);//先选第一,和第二个数进行计算
 int midresult = calcute(num2, num3, operator1);//先选第二和第三两个数进行计算
 int tailresult = calcute(num3,num4, operator1);//先选第三和第四俩个数进行计算
 for (int j = 0; j < 4; j++){
 //第2次计算,从上次计算的结果继续执行,这次从三个数中选择两个进行计算
 char operator2 = operator[j];
 int firstmidresult = calcute(firstresult, num3, operator2);
 int firsttailresult = calcute(num3,num4,operator2);
 int midfirstresult = calcute(num1, midresult, operator2);
 int midtailresult= calcute(midresult,num4,operator2);
 int tailmidresult = calcute(num2, tailresult, operator2);
 for (int k = 0; k < 4; k++){
  //第3次计算,也是最后1次计算,计算两个数的结果,如果是24则输出表达式
  char operator3 = operator[k];
  //在以上的计算中num1,num2,num3,num4都是整型数值,但若要输出为带有a,j,q,k的表达式,则要将这四个数都变为string类型,下同
  if(calcute(firstmidresult, num4, operator3) == 24){
  m[0]=num1;
  m[1]=num2;
  m[2]=num3;
  m[3]=num4;
  for(int p=0;p<4;p++){
  if(m[p]==1){
  n[p]="a";}
  if(m[p]==2){
  n[p]="2";}
  if(m[p]==3){
  n[p]="3";}
  if(m[p]==4){
  n[p]="4";}
  if(m[p]==5){
  n[p]="5";}
  if(m[p]==6){
  n[p]="6";}
  if(m[p]==7){
  n[p]="7";}
  if(m[p]==8){
  n[p]="8";}
  if(m[p]==9){
  n[p]="9";}
  if(m[p]==10){
  n[p]="10";}
  if(m[p]==11){
  n[p]="j";}
  if(m[p]==12){
  n[p]="q";}
  if(m[p]==13){
  n[p]="k";}
  }
  system.out.println("((" + n[0] + operator1 + n[1] + ")" + operator2 + n[2] + ")" + operator3 + n[3]);
  flag = true;//若有表达式输出,则将说明有解,下同
  }
  if(calcute(firstresult, firsttailresult, operator3) == 24){
  system.out.println("(" + n[0] + operator1 + n[1] + ")" + operator3 + "(" + n[2] + operator2 + n[3] + ")"); 
  flag = true;
  }
  if(calcute(midfirstresult, num4, operator3) == 24){
  m[0]=num1;
  m[1]=num2;
  m[2]=num3;
  m[3]=num4; 
  for(int p=0;p<4;p++){
  if(m[p]==1){
  n[p]="a";}
  if(m[p]==2){
  n[p]="2";}
  if(m[p]==3){
  n[p]="3";}
  if(m[p]==4){
  n[p]="4";}
  if(m[p]==5){
  n[p]="5";}
  if(m[p]==6){
  n[p]="6";}
  if(m[p]==7){
  n[p]="7";}
  if(m[p]==8){
  n[p]="8";}
  if(m[p]==9){
  n[p]="9";}
  if(m[p]==10){
  n[p]="10";}
  if(m[p]==11){
  n[p]="j";}
  if(m[p]==12){
  n[p]="q";}
  if(m[p]==13){
  n[p]="k";}
  }
  system.out.println("(" + n[0] + operator2 + "(" + n[1] + operator1 + n[2] + "))" + operator3 + n[3]);
  flag = true;
  }
  if(calcute(num1,midtailresult, operator3) == 24){
  m[0]=num1;
  m[1]=num2;
  m[2]=num3;
  m[3]=num4;
  for(int p=0;p<4;p++){
  if(m[p]==1){
  n[p]="a";}
  if(m[p]==2){
  n[p]="2";}
  if(m[p]==3){
  n[p]="3";}
  if(m[p]==4){
  n[p]="4";}
  if(m[p]==5){
  n[p]="5";}
  if(m[p]==6){
  n[p]="6";}
  if(m[p]==7){
  n[p]="7";}
  if(m[p]==8){
  n[p]="8";}
  if(m[p]==9){
  n[p]="9";}
  if(m[p]==10){
  n[p]="10";}
  if(m[p]==11){
  n[p]="j";}
  if(m[p]==12){
  n[p]="q";}
  if(m[p]==13){
  n[p]="k";}
  }
  system.out.println(" " + n[0] + operator3 + "((" + n[1] + operator1 + n[2] + ")" + operator2 + n[3] + ")"); 
  flag = true;
  }
  if(calcute(num1,tailmidresult,operator3) == 24){
  m[0]=num1;
  m[1]=num2;
  m[2]=num3;
  m[3]=num4;
  for(int p=0;p<4;p++){
  if(m[p]==1){
  n[p]="a";}
  if(m[p]==2){
  n[p]="2";}
  if(m[p]==3){
  n[p]="3";}
  if(m[p]==4){
  n[p]="4";}
  if(m[p]==5){
  n[p]="5";}
  if(m[p]==6){
  n[p]="6";}
  if(m[p]==7){
  n[p]="7";}
  if(m[p]==8){
  n[p]="8";}
  if(m[p]==9){
  n[p]="9";}
  if(m[p]==10){
  n[p]="10";}
  if(m[p]==11){
  n[p]="j";}
  if(m[p]==12){
  n[p]="q";}
  if(m[p]==13){
  n[p]="k";}
  }
  system.out.println(" " + n[0] + operator3 + "(" + n[1] + operator2 + "(" + n[2] + operator1 + n[3] + "))"); 
  flag = true;
  }
 }
 }
 }
 }
}

运行及测试截图:

Java实现24点小游戏

Java实现24点小游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/WendyRay/article/details/82891624