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

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,num4
        static 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,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类型,下同
                        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] + "))");
                        }

                    }
                }
            }
        }
    }





程序运行结果为
在这里插入图片描述
程序设计方法学第三次作业

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值