24点游戏算法

  • 从小一直玩这个扑克游戏,昨晚终于抽时间把这个算法实现,虽然还有不好的地方,懒得改了,有了再在优化,到现在我没有参考网上的算法,也不知道有没有。
    游戏规则:每人发四张牌,依据四张牌的点数通过加减乘除自由组合计算出结果为24即为胜利。
    下面是我的代码,在思考算法的时候感觉很困难,有时候想把自己的思路记下来,又不知道用什么符号表示这种抽象的思维,得寻找学习某种可以提炼思维的工具或者辅助思考的工具。
  • 说不定过一段时间我就看不懂我写了个啥,虽然我现在写了我的思路但是由于表达不是很清晰,过一段时间还是看不懂,但是还是要写啊,写多了,就思路清晰了,和上次五子连珠的算法我想了一周比起来这一次几个小时就搞定还是有进步的,虽然这个可能简单一小点。
  • 思路:
    将输入的数字通过C1数组保存
    通过两层for循环后,设两层循环变量分别为i,j.将C1中坐标为i,j的数字进行组合计算,返回大小为4,内容依次为这两个数加减乘除结果的数组C2。其中设置内层循环变量j的值不等于i时再计算,这样不会出现自我重复。
    再内嵌两层for循环,循环变量分别为q,w。通过限定((q!=j)&(w!=q)),来拿避免重复,同上返回数组C3。
    将两个数组中的元素依次交叉计算,检测返回的数组中是否包含结果24,如果包含反向打印出对应的计算数据。
package ericTest;

import java.nio.channels.ShutdownChannelGroupException;
import java.util.ArrayList;
import java.util.Scanner;

import javax.security.auth.x500.X500Principal;

public class test {
    public static void main(String[] args) {
        System.out.println("请依次输入4个数,用来计算24点"+'\n'+'\t'+'\t'+"design by SunYangfan");
        Scanner saScanner1 = new Scanner(System.in);
        double A = saScanner1.nextDouble();

        Scanner scanner2 = new Scanner(System.in);
        double B = scanner2.nextDouble();

        Scanner saScanner3 = new Scanner(System.in);
        double C = saScanner3.nextDouble();

        Scanner scanner4 = new Scanner(System.in);
        double D = scanner4.nextDouble();

        ArrayList<Double> in = new ArrayList<Double>();
     in.add(A);
     in.add(B);
     in.add(C);
     in.add(D);
     int flg=0;
        // System.out.println(in);
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {

                if (i != j) {
                    ArrayList<Double> x = caculateArrayList(in.get(i),
                            in.get(j));
                    for (int q = 0; q < 4; q++) {

                                for (int w = 0; w < 4; w++) {

                                    if ((q!=j)&(w!=q)) {
                                        ArrayList<Double> y = caculateArrayList(
                                                in.get(q), in.get(w));

                                        for (int k = 0; k < 4; k++) {
                                            for (int z = 0; z < 4; z++) {

                                                if (k != z) {
                                                    if (y.get(z) != 0) {
                                                        ArrayList<Double> H = caculateArrayList(
                                                                x.get(k), y.get(z));
                                                        if (H.contains(24.0)) {

                                                            int wz1 = H.indexOf(24.0);
                                                            String zf =  fuhaoString(wz1);
                                                            String lf = fuhaoString(k);
                                                            String rf = fuhaoString(z);
                                                            System.out
                                                            .println("("+(int)daihaoZhuanShuzi(in, i)+
                                                                    lf+
                                                                    (int)daihaoZhuanShuzi(in, j)+")"+zf+"("+
                                                                    (int)daihaoZhuanShuzi(in, q)+rf+
                                                                    (int)daihaoZhuanShuzi(in, w)+")"+
                                                                    "="+24);
                                                            //System.exit(status);
                                                            flg =1;
                                                        }
                                                    }

                                                }
                                            }
                                        }
                                    }
                                }

                    }

                }

            }
        }
        if (flg==0) {

            System.out.println("此组数据无解");
        }
    }
//此方法是将两个数的四种运算结果通过数组返回。
    public static ArrayList<Double> caculateArrayList(Double x, Double y) {
        ArrayList<Double> arrayList = new ArrayList<Double>();
        arrayList.add(x + y);
        arrayList.add(x - y);
        arrayList.add(x * y);
        arrayList.add(x / y);
        return arrayList;
    }
//此方法是通过在数组中的位置返回对应的运算符号。
    private static String fuhaoString(int i) {
        switch (i) {
        case 0:
            return new String("+");
        case 1:
            return new String("-"); 
        case 2:
            return new String("*");
        case 3:
            return new String("/");
        default:
            break;
        }
        return "符号获取失败";
    }
// 通过在数组中的位置返回对应的数值。
public static double  daihaoZhuanShuzi(ArrayList<Double> arrayList,Integer   i) {
    return arrayList.get(i);
}
}
posted @ 2017-10-15 23:42  icanactnow  阅读(2833)  评论(0编辑  收藏  举报