Java实现24点扑克牌游戏解法

存储结构设计

存储结构使用的ArrayList集合存储每张牌的数值和花色。后期存储24种四个数的排列组合时用到的是HashMap集合存储24中排列方式

主要操作设计

首先定义全局变量boolean[]数组来表示扑克牌是否在四次访问过。再定义ArrayList类型的fourCard用来保存四个扑克牌的数。方法如下:
(1): createFour(HBox center) 方法是随机生成扑克牌的方法,为每张扑克牌设定没有选过的false标记,然后利用随机函数生成1-52个数,根据此数选择已经命名好的图片。将其展示在面板上,并返回四张图片上的数字组成的Arraylist集合。
(2) checkExpression(String expression)方法是检验输入的字符串的方法,首先利用正则表达式对输入的字符串检验是否符合规范,然后把分割出来是数字跟fourCrad里面的四个数进行比较,若相等,则返回true,否则返回false.
(3) sort(ArrayList list) 对集合内部的数据进行排序,方便比较两个集合元素是否完全相同。
(4) start方法,是主要写了界面的布局,然后写了按钮的点击事件。Refresh按钮点击内部调用createFour(HBox center)方法生成四个图片。Verify按钮点击调用ScriptEngineManager类中的调用js的执行表达式的方法运算表达式看是否结果为24.
2. 1) 由于要对运算符计算是否可以得到24,所以利用穷举的办法,列举物种运算表达式。cal_expressiona1-5 并返回运算结果。
(2) sortList(ArrayList list) 方法是对集合中的四个数进行24种排序的排列组合穷举。并返回这24种的hashMap集合。
(3) findAnswer(ArrayList list) 是找出第一个存在此四个数可以计算出结果的表达式的情况,并返回此表达式的字符串形式。
(4) int cal(int x, int y, int op) 方法由不同操作运算符计算的结果。
(5) showFindSolution()方法是根据用户输入四个数,查看是否有解的方法。此方法内部调用 findAnswer 方法来检查,并把字符串显示到输入框内部。
(6) start 方法里面主要加了两个按钮,并实现了按钮的点击事件和方法。

技术难点与解决方法

  1. 对扑克牌的展示方法
    解决方法:将所有的扑克牌按顺序编好号码,然后通过路径名字加上号码找到扑克牌,并由扑克牌%13获得该扑克牌的面值。
  2. 随机产生扑克牌可能会产生相同扑克牌。
    解决方法:创建一个boolean[52]数组,每次随机生成四个时,都会每次标记访问标记true,下次访问此随机数时,若为true,则舍弃,继续向下访问随机数,以保证到4 个随机数不一样。这样保证产生的四个扑克牌都不一样。
 //随机生成扑克牌方法
    public ArrayList createFour(HBox center){
     
        ArrayList<Integer> list = new ArrayList();
        //为每张牌提供没选过的标记
        for (int i = 0; i < card.length; i++) {
     
            card[i] = false;
        }
        int i = 0;
        while (i < 4){
     
            //生成1-52的随机数
            int m = (int)(Math.random()*52)+1;
            //如果未被选择的话
            if (card[m-1] == false ){
     
                card[m-1] = true;
                Image image = new Image("file:src/dsKeshe/question3/image/"+m+".jpg");
                ImageView imageView = new ImageView(image);
                if (m%13==0){
     
                    digit[i] = new Equal(13);
                    list.add(13);
                }else{
     
                    digit[i] = new Equal(m%13);
                    list.add(m%13);
                }
                center.getChildren().add(imageView);
                i++;
            }

        }
        return list;
    }
  1. 穷举所有运算的算法。
    经分析四个数加四个运算符只有五种表达式,
    (a op1 b)op2 (c op3 d)
    (( a op1 b)op2 c) op3 d
    a op1 ((b op2 c) op3 d)
    a op1 (b op2 (c op3 d))
    (a op1 (b op2 c) op3 d)
    然后通过char[] op = {’#’,’+’, ‘-’, ‘*’, ‘/’}保存运算符。
    用sortList方法穷举四个数的24种排列组合方式,并返回hashMap保存24种方式。
    通过四层嵌套循环,判断运算结果是否为24,分别找到第一个解,找到则返回第一个解。
  HashMap<Integer, ArrayList<Integer>> integerArrayListHashMap = sortList(list);
        for(ArrayList<Integer> list1:integerArrayListHashMap.values()){
     
            int a = list1.get(0);
            int b = list1.get(1);
            int c = list1.get(2);
            int d = list1.get(3);
            char[] op = {
     '#','+', '-', '*', '/'};// 存储运算符
//        int op1,op2,op3;
            for (int op1 = 1; op1 <= 4; op1++) {
     
                for (int op2 = 1; op2 <= 4; op2++) {
     
                    for (int op3 = 1; op3 <= 4; op3++) {
     
                        // 调用表达式1的方法
                        if (cal_expressiona1(a, b, c, d, op1, op2, op3) == 24) {
     
                            return "(" + a + op[op1] + b + ")" + op[op2] + "(" + c + op[op3] + d + ")";

                        }

                        // 调用表达式2的方法  (( a op1 b)op2 c) op3 d
                        if (cal_expressiona2(a, b, c, d, op1, op2, op3) == 24) {
     
                            return "((" + a + op[op1] + b + ")" + op[op2] + c + ")" + op[op3] + d;

                        }
                        // 调用表达式3的方法      a op1 ((b op2 c) op3 d)
                        if (cal_expressiona3(a, b, c, d, op1, op2, op3) == 24) {
     
                            return "(" + a + op[op1] + "((" + b + op[op2] + c + ")" + op[op3] + d + "))";

                        }
                        // 调用表达式4的方法      (a op1 (b op2 (c op3 d)))
                        if (cal_expressiona4(a, b, c, d, op1, op2, op3) == 24) {
     
                            return "(" + a + op[op1] + "(" + b + op[op2] + "(" + c + op[op3] + d + ")))";

                        }
                        // 调用表达式5的方法      (a op1 (b op2 c) op3 d)
                        if (cal_expressiona5(a, b, c, d, op1, op2, op3) == 24) {
     
                            return "(" + a + op[op1] + "(" + b + op[op2] + c + ")" + op[op3] + d + ")";

                        }
                    }
                }
            }

        }


        return "No Solution!";

    }

你可能感兴趣的:(java数据结构,java,数据结构,集合)