Java代码实现游戏24点

最近正在练练编码思维,代码如下

package cn.chetech.suanfa;

import java.util.Scanner;

/**
 * 24点游戏是一个大众化的益智游戏。任意给4张扑克牌(不包括大小王),只能够用加、减、乘、除以及适当的括号连接四张牌
 * 无论顺序,使计算结果为24,或者宣布根本就是无解的,每张牌必须运算,并且只能运算一次, J,Q,K可设置为11,12,13
 * 1、计算值是否24,四个变量去代替a,b,c,d,中间相邻的符号op1,op2,op3, a op1 b op2 c op3 d =
 * 24,符号运算还有优先级的问题,用括号去提升它的优先级 优先级的几种情况: 1、(a op1 b)op2 (c op3 d) 2、(( a op1
 * b)op2 c) op3 d 3、a op1 ((b op2 c) op3 d) 4、a op1 (b op2 (c op3 d)) 5、(a op1
 * (b op2 c) op3 d) op1 的取值范围加 ,减,乘,除 每次给4张牌,有多少种情况 ,64*5 = 320种,
 * 在320种找出计算结果为24的表达式打印出来
 */
public class TwentyFour {
    // 存储运算符
    private final static char[] op = { '#', '+', '-', '*', '/' };

    // 计算 x op y
    private static float cal(float x, float y, int op) {
        float result = 0; // 保存结果
        switch (op) {
        case 1:
            result = x + y;
            break;
        case 2:
            result = x - y;
            break;
        case 3:
            result = x * y;
            break;
        case 4:
            result = x / y;
            break;
        }
        return result;
    }

    // 1、(a op1 b)op2 (c op3 d)
    private static float cal_expressiona1(float a, float b, float c, float d, int op1, int op2, int op3) {
        float r1, r2, r3;
        r1 = cal(a, b, op1);
        r2 = cal(c, d, op3);
        r3 = cal(r1, r2, op2);
        return r3;
    }

    // 2、(( a op1 b)op2 c) op3 d
    private static float cal_expressiona2(float a, float b, float c, float d, int op1, int op2, int op3) {
        float r1, r2, r3;
        r1 = cal(a, b, op1);
        r2 = cal(r1, c, op2);
        r3 = cal(r2, d, op3);
        return r3;
    }

    // 3、a op1 ((b op2 c) op3 d)
    private static float cal_expressiona3(float a, float b, float c, float d, int op1, int op2, int op3) {
        float r1, r2, r3;
        r1 = cal(b, c, op2);
        r2 = cal(r1, d, op3);
        r3 = cal(a, r2, op1);
        return r3;
    }

    // 4、a op1 (b op2 (c op3 d))
    private static float cal_expressiona4(float a, float b, float c, float d, int op1, int op2, int op3) {
        float r1, r2, r3;
        r1 = cal(c, d, op3);
        r2 = cal(b, r1, op2);
        r3 = cal(a, r2, op1);
        return r3;
    }

    // 5、(a op1 (b op2 c) op3 d)
    private static float cal_expressiona5(float a, float b, float c, float d, int op1, int op2, int op3) {
        float r1, r2, r3;
        r1 = cal(b, c, op2);
        r2 = cal(a, r1, op1);
        r3 = cal(r2, d, op3);
        return r3;
    }

    static boolean get(int a,int b,int c, int d){
        boolean flag=false; // 判断24标志  未得到就是false
//        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){
                        System.out.println("("+a+op[op1]+b +")"+ op[op2] +"( "+c+op[op3]+d+")"+" = 24");
                        flag=true;
                    }
                    // 调用表达式2的方法  (( a op1 b)op2 c) op3 d
                    if(cal_expressiona2(a, b, c, d, op1, op2, op3)==24){
                        System.out.println("(("+a+op[op1]+b +")"+ op[op2]+ c +")"+op[op3]+d+" = 24");
                        flag=true;
                    }
                    // 调用表达式3的方法      a op1 ((b op2 c) op3 d)
                    if(cal_expressiona3(a, b, c, d, op1, op2, op3)==24){
                        System.out.println("( "+a+op[op1]+"(("+b+ op[op2]+ c +")"+op[op3]+d +")) = 24");
                        flag=true;
                    }
                    // 调用表达式4的方法      (a op1 (b op2 (c op3 d)))
                    if(cal_expressiona4(a, b, c, d, op1, op2, op3)==24){
                        System.out.println("( "+a+op[op1]+"("+b+ op[op2]+ "(" +c +op[op3]+d +"))) = 24");
                        flag=true;
                    }
                    // 调用表达式5的方法      (a op1 (b op2 c) op3 d)
                    if(cal_expressiona5(a, b, c, d, op1, op2, op3)==24){
                        System.out.println("("+a+op[op1]+"("+b+ op[op2]+ c +")"+op[op3]+d +") = 24");
                        flag=true;
                    }
                } 
            } 
        }
        return flag;
    }

    public static void main(String[] args) {
        int a,b,c,d;
        Scanner in = new Scanner(System.in);
        System.out.println("请输入四个数(1~13):");
        do {
            a = in.nextInt();
            b = in.nextInt();
            c = in.nextInt();
            d = in.nextInt();
            if(a<1 || a>13 ||b<1||b>13 || c<1 || c>13 || d<1 ||d>13)
                System.out.println("输入错误,请重新输入!");
        } while (a<1 || a>13 ||b<1||b>13 || c<1 || c>13 || d<1 ||d>13);
        if(!get(a,b,c,d))
            System.out.println("对不起,这四个数得不到24");
        in.close();
    }

}

猜你喜欢

转载自blog.csdn.net/baidu_37038557/article/details/83180489
今日推荐