Java实现24点游戏

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43573534/article/details/102251712

目录

 

题目

分析

代码实现


题目

24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式。

分析

  1. 首先生成四个随机数(1~13之间)
  2. 进行结果为24的表达式计算

          第一步:计算出四个随机数的排列组合

          第二步:每一组数字去进行排列组合,找到等于24的表达式

                         具体的思想是:使用三层循环控制运算的优先级,也就是括号的存放位置

                                                   第一次:将四个数字的其中两个数字进行运算,得到三个数字,存入长度为3的数组temp1之中(第一个括号的位置)

                                                   第二次:将三个数字的其中两个数字再次进行运算,得到两个数字,存入长度为2的数组temp2之中(第二个括号的位置)

                                                    第三次:将最后的两个数字进行运算,得出最终的结果,sum

      3.计算所有表达式的数量(总共有四种情况)

              第一种:当四张卡牌的数字完全相同,那么组合方式只有一种

              第二种:当四张卡牌的数字有两个相同,其余不同,那么它的组合方式有96种

              第三种:当四张卡牌的数字全都不同,那么就有256种

              第四种:当四张卡牌两两相同,那么就有36种情况

              第五种:当四张卡牌种三张相同,那么就有16种情况

代码实现

randomNumber:存放四个随机数

getExpression():拿到所有结果为24的表达式

scard:数字double化,方便后面的运算

 private static ArrayList<String> getExpression(){
        ArrayList<String> exp = new ArrayList<String>();
        for(int i = 0;i < 4;i++){
            for(int j = 0;j < 4;j++){
                if(j == i){
                    continue;
                }
                for(int m = 0;m < 4;m++){
                    if(m == i || m == j){
                        continue;
                    }
                    for(int n = 0;n < 4;n++){
                        if(n == i || n == j || n == m){
                            continue;
                        }
                        temp[i] = randomNumber[0];
                        temp[j] = randomNumber[1];
                        temp[m] = randomNumber[2];
                        temp[n] = randomNumber[3];
                        for(int k = 0;k < 4;k++){
                            scard[k] = (double)temp[k]%13;
                            if(temp[k]%13 == 0){
                                scard[k] = 13;
                            }
                        }
                        exp = search();
                        if(isCorrect){
                            isCorrect = false;
                            return exp;
                        }

                    }
                }
            }
        }
        return null;
    }

    /**
     * 4个数字进行排列组合,找到等于24的表达式
     * @return
     */
    private static ArrayList<String> search(){
        ArrayList<String> exp = new ArrayList<String>();
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                for (int k = 0; k < 4; k++) {

                    /**
                     * 将前两个数字进行计算,并将计算结果及剩余数字保存到temp3中
                     * 此时缩短为3个数字
                     */
                    for (int m = 0; m < 3; m++) {
                        if (scard[m + 1] == 0 && operator[i] == '/') {
                            break;
                        }
                        temp3[m] = calcute(scard[m], scard[m + 1], operator[i]);

                        temp3[(m + 1) % 3] = scard[(m + 2) % 4];
                        temp3[(m + 2) % 3] = scard[(m + 3) % 4];

                        /**
                         * 将前两个数字进行计算,并将计算结果及剩余数字保存到temp2中
                         * 此时缩短为2个数字
                         */
                        for (int n = 0; n < 2; n++) {
                            if (temp3[n + 1] == 0 && operator[j] == '/') {
                                break;
                            }
                            temp2[n] = calcute(temp3[n], temp3[n + 1], operator[j]);
                            temp2[(n + 1) % 2] = temp3[(n + 2) % 3];

                            /**
                             * 将temp2中的两个数字进行计算,等到sum值
                             */
                            if (temp2[1] == 0 && operator[k] == '/') {
                                break;
                            }
                            sum = calcute(temp2[0], temp2[1], operator[k]);

                            /**
                             * 进行排列组合运算
                             */
                            if (sum == 24) {
                                isCorrect = true;
                                //expression存储表达式
                                String expression = "";
                                if (m == 0 && n == 0) {
                                    expression = "((" + (int) scard[0] + operator[i] + (int) scard[1] + ")"
                                            + operator[j] + (int) scard[2] + ")" + operator[k] + (int) scard[3] + "="
                                            + (int) sum;
                                } else if (m == 0 && n == 1) {
                                    expression = "(" + (int) scard[0] + operator[i] + (int) scard[1] + ")" + operator[k]
                                            + "(" + (int) scard[2] + operator[j] + (int) scard[3] + ")=" + (int) sum;
                                } else if (m == 1 && n == 0) {
                                    expression = "(" + (int) scard[0] + operator[j] + "(" + (int) scard[1] + operator[i]
                                            + (int) scard[2] + "))" + operator[k] + (int) scard[3] + "=" + (int) sum;
                                } else if (m == 2 && n == 0) {
                                    expression = "(" + (int) scard[0] + operator[j] + (int) scard[1] + ")" + operator[k]
                                            + "(" + (int) scard[2] + operator[i] + (int) scard[3] + ")=" + (int) sum;
                                } else if (m == 2 && n == 0) {
                                    expression = (int) scard[0] + operator[k] + "(" + (int) scard[1] + operator[j] + "("
                                            + (int) scard[2] + operator[i] + (int) scard[3] + "))=" + (int) sum;
                                }
                               // System.out.println(expression);
                                exp.add(expression);
                            }

                        }


                    }
                }
            }
        }
        return exp;
    }

猜你喜欢

转载自blog.csdn.net/weixin_43573534/article/details/102251712
今日推荐