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);
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM