本文实例为大家分享了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次)同理。这样就找到了所有解的情况。
算法流程图为:
下面是代码:
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 ; } } } } } } |
运行及测试截图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
原文链接:https://blog.csdn.net/WendyRay/article/details/82891624