24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
随机生成4个代表扑克牌牌面的数字字母,用户输入能够得出24的表达式则加一分,不能在规定时间内完成则扣一分。最终将得分情况输出到End.txt文本文档中。
算法核心:利用穷举法,得出所有可能的表达式,并将结果add进ArrayList集合类,如果输入的值被包含在对象list中,则回答正确,加一分。

package card;
import java.io.FileWriter;
import java.util.*;public class test {//定义随机产生的四个数static ArrayList<String>list=new ArrayList<>();static int[] number = new int[4];//转换后的num1,num2,num3,num4static int[] t =new int [4];static String[] n = new String[4];//存放操作符static char[] operator = { '+', '-', '*', '/' };public static void main(String[] args){int life,score;life=3;score=0;Scanner s= new  Scanner(System.in);System.out.println("24 点游戏 玩家有三条命 每4张牌有1分钟时间 来写出算式  A-1 J-11 Q-12 K-13");System.out.println("例如:10 2 10 8 ");System.out.println("该四个数字组成24的答案为: (10+2)*(10-8)");StringBuilder sb = new StringBuilder();Random rand = new Random();//  sb.append("下列给出四个数字,使用+,-,*,/进行计算使最后计算结果为24\n");System.out.println("下列给出四个数字,使用+,-,*,/进行计算使最后计算结果为24");do {long startTime = System.currentTimeMillis();if(life!=3 || score!=0)System.out.println("新一轮四张卡牌如下");for (int i = 0; i < 4; i++) {number[i] = rand.nextInt(13) + 1;//随机生成四个int型数if (number[i] == 1) {//   sb.append("A\n");System.out.println("A");//如果随机生成的数为1,则显示为扑克牌牌面中的A} else if (number[i] == 11) {//  sb.append("J\n");System.out.println("J");//如果随机生成的数为11,则显示为扑克牌牌面中的J} else if (number[i] == 12) {//  sb.append("Q\n");System.out.println("Q");//如果随机生成的数为12,则显示为扑克牌牌面中的Q} else if (number[i] == 13) {//  sb.append("K\n");System.out.println("K");//如果随机生成的数为13,则显示为扑克牌牌面中的K} else {//  sb.append(i + "\n");System.out.println(number[i]);}}System.out.println("请输入你的答案");String temp = s.next();long endTime = System.currentTimeMillis();// System.out.println("result"+(endTime-startTime));//调试代码:if(endTime-startTime>=5*1000)if(endTime-startTime>=60*1000){System.out.println("时间超时啦! ");life--;addition();System.out.println("可能的答案为:"+list);System.out.println("生命值-1,您此时的生命值为"+life);list.clear();continue;}//  sb.append("此次获得成绩为:\n");System.out.println("可能的答案为:");addition();System.out.println(list);if(list.isEmpty()){System.out.println("发牌员出老千,本轮没有正确答案,生命值不变!");continue;}if (list.contains(temp)) {score++;System.out.println("你真棒!答对了!加一分,现在分数为"+score+",下一轮开始");list.clear();} else{life--;if(life==0)System.out.println("游戏结束,您的最终分数为"+score);else {System.out.println("答案错误,生命值-1!您的生命值现在为" + life + ",当前分数为" + score);list.clear();}}}while(life!=0);sb.append("该玩家最终获得分数为").append(score);try {FileWriter fw = new FileWriter("E:\\IDEA_1\\End.txt");fw.write(sb.toString());fw.close();} catch (Exception e) {e.printStackTrace();}}//给定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 {//当除法条件不满足时,返回10000000,防止出现错误return 100000000;}}//计算生成24的函数public static void addition(){Map<Integer, Integer> map = new HashMap<Integer, Integer>();//存放数字,用来判断输入的4个数字中有几个重复的,和重复的情况for (int j : number) {map.merge(j, 1, Integer::sum);}if(map.size() == 1){//如果只有一种数字,此时只有一种排列组合,如5,5,5,5calculation(number[0], number[1],number[2],number[3]);}else if(map.size()==2){//如果只有2种数字,有2种情况,如1,1,2,2和1,1,1,2int 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类型,下同t[0]=num1;t[1]=num2;t[2]=num3;t[3]=num4;for(int p=0;p<4;p++){if(t[p]==1){n[p]="A";}  //n为String 数组if(t[p]==2){n[p]="2";}if(t[p]==3){n[p]="3";}if(t[p]==4){n[p]="4";}if(t[p]==5){n[p]="5";}if(t[p]==6){n[p]="6";}if(t[p]==7){n[p]="7";}if(t[p]==8){n[p]="8";}if(t[p]==9){n[p]="9";}if(t[p]==10){n[p]="10";}if(t[p]==11){n[p]="J";}if(t[p]==12){n[p]="Q";}if(t[p]==13){n[p]="K";}}if(calcute(firstMidResult, num4, operator3) == 24){// System.out.println("((" + n[0] + operator1 + n[1] + ")"//      + operator2 + n[2] + ")" + operator3 +//     n[3]);list.add("((" + n[0] + operator1 + n[1] + ")" + operator2 + n[2] + ")" + operator3 + n[3]);}if(calcute(firstResult, firstTailResult, operator3) == 24){//    System.out.println("(" + n[0] + operator1 + n[1] + ")" + operator3 + "(" + n[2] + operator2 +//           n[3] + ")");list.add("(" + n[0] + operator1 + n[1] + ")" + operator3 + "(" + n[2] + operator2 +n[3] + ")");}if(calcute(midFirstResult, num4, operator3) == 24){//    System.out.println("(" + n[0] + operator2 + "(" + n[1] + operator1 + n[2] + "))" + operator3 +//            n[3]);list.add("(" + n[0] + operator2 + "(" + n[1] + operator1 + n[2] + "))" + operator3 +n[3]);}if(calcute(num1,midTailResult, operator3) == 24){//   System.out.println(" " + n[0] + operator3 + "((" + n[1] + operator1 + n[2] + ")" + operator2 +//           n[3] + ")");list.add(n[0] + operator3 + "((" + n[1] + operator1 + n[2] + ")" + operator2 +n[3] + ")");}if(calcute(num1,tailMidResult,operator3) == 24){//     System.out.println(" " + n[0] + operator3 + "(" + n[1] + operator2 + "(" + n[2] + operator1 +//            n[3] + "))");list.add(n[0] + operator3 + "(" + n[1] + operator2 + "(" + n[2] + operator1 +n[3] + "))");}}}}}}

程序运行结果为

程序设计方法学第三次作业

关于Java穷举法对24点卡牌游戏规定时间内输入判断对错的程序相关推荐

  1. 穷举法java_OpenJudge 4146:数字方格 java穷举法

    首先是题目描述: 描述 如上图,有3个方格,每个方格里面都有一个整数a1,a2,a3.已知0<=a1,a2,a3<=n,而且a1+a2是2的倍数,a2+a3是3的倍数,a1+a2+a3是5 ...

  2. java 穷举法求水仙花数_常用算法-穷举法

    穷举法又称为枚举法,它是在计算机算法设计中用得最多的一种编程思想.它的实现方式是:在已知答案范围的情况下,依次地枚举该范围内所有的取值,并对每个取值进行考查,确定是否满足条件.经过循环遍历之后,筛选出 ...

  3. java穷举法找素数,使用穷举法输出100以内所有素数

    满意答案 //使用穷举法输出100以内所有素数 class Prime { public static void main(String[] args) { for(int n=2;n<101; ...

  4. java 穷举法_C++基本算法思想之穷举法

    穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场 ...

  5. java穷举法解方程_枚举法(穷举法)_Java语言程

    枚举法(穷举法)_Java语言程 3.5.1 枚举法(穷举法) 枚举法就是把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出. [例3-20] 百元买百鸡:用一百元钱买一百只鸡.已知公鸡5元/ ...

  6. 24点卡牌游戏C++实现

    问题描述: 24点游戏是经典的纸牌益智游戏. 常见游戏规则: 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24 ...

  7. python穷举法搬砖_python 穷举法 算24点(史上最简短代码)-阿里云开发者社区

    # 作者:hhh5460 # 时间:2017年6月3日 import itertools deftwentyfour(cards): '''史上最短计算24点代码''' for nums in ite ...

  8. 常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501 目录 1.穷举法 2.贪心算法 3.递归与分治算法 4.回溯算法 5.数值概率 ...

  9. python算24点穷举法_24点游戏7节课–第1节-游戏介绍与基本算法 | 学步园

    这仅仅是一个控制台(DOS窗口下)的小游戏--有人欢喜有人烦了.欢喜的是因为可以专心于游戏逻辑自身过程,就算你只学过C++简单的屏幕输入输出(cin.cout ),乃至换用java,C#也可以写这个小 ...

最新文章

  1. r语言中调用c 程序,如何在R程序包中调用C函数
  2. 通用权限管理系统组件 (GPM - General Permissions Manager)
  3. Java黑皮书课后题第10章:*10.10(Queue类)10.6节给出一个Stock类。设计一个名为Queue的类用于存储整数。像栈一样,队列保存元素。在栈中,元素后进先出。队列中元素先进先出
  4. 斜线 背景_腊梅花开 摄影 | 斜线加中心构图
  5. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)...
  6. 认清面向服务架构SOA的真实面目
  7. 结构体类型指针做函数参数(C++)
  8. 基于卷积神经网络的人脸识别项目_使用Tensorflow-gpu+dilib+sklearn
  9. ant执行命令的详细参数和Ant自带的系统属性
  10. IPVS和Nginx两种WRR负载均衡算法详解
  11. 归纳推理测试没做完_无论顺还是剖,有几件事尽量在生娃当天做完,月子期间基本没负担...
  12. List map转json
  13. ABAQUS-学习笔记
  14. 华为主题包hwt下载_hwtTool下载-华为主题开发工具下载 v9.0.2.301 官方版[百度网盘资源] - 安下载...
  15. Ubuntu 20.04 更换阿里源
  16. 抛开Wintel体系和AA体系
  17. linux搭建雷霆传奇h5源码,【雷霆传奇H5服务端】2020.07最新超好看大羽翼传奇网页游戏程序[附超详尽构建实例教程]...
  18. 4个方法判断食物的热量高低
  19. 正则表达式re.S与re.M的区别
  20. 如何搞定你喜欢的美术妹纸?

热门文章

  1. MongoDB 聚合管道
  2. TP开发仿蓝奏云网盘网站系统源码+对接易支付
  3. QML VLC视频播放器
  4. 选男友最好的方式就是爬山
  5. Vivado2017.4运行时出现找不到VCOMP140.DLL,无法继续的报错
  6. 为什么PCB要沉金?
  7. 机器学习笔记二 单型线性回归
  8. 计算机科学数理逻辑考试,计算机科学中使用的数理逻辑_期末考试题2006到2014.pdf...
  9. 华为路由器排错的一些小总结
  10. 我们需要一颗强劲的心脏1--小谈机房建设工程