java24点

24点游戏是经典的纸牌益智游戏。常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
提高要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。 1. 程序风格良好(使用自定义注释模板) 2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。 3.所有成绩均可记录在TopList.txt文件中。

  /*
* 中缀表达式转化为后缀表达式:s
* 1.遍历字符串
* 2.当遇到操作数直接输出
* 3.当遇到栈顶为"("直接进站或者为null直接进站
* 4.当遇到")"直接输出至"(";
* 5.当遇到运算符,比较与栈顶的优先级,如果大于,直接进站,小于输出栈内运算符直到遇到"("或者null为止,然后进站;
* 6.当结尾时,直接输出栈中的运算符
* 7.判断operator内是否为null,不为空输出,为null不操作.
* */
public static StringBuffer zhuanHua(String s) {
    LinkedList<String> operator = new LinkedList<>();
    StringBuffer oper = new StringBuffer();
    //String regex = "[a-d]";
    //a + b * c + (d * e + f)*g
    for (int i = 0; i < s.length(); i++) {
        String sb = s.substring(i, i + 1);
        //System.out.println(sb);
        if (isOperater(sb)) {
            if (operator.isEmpty() || operator.get(0).equals("(")) {
                operator.push(sb);
            } else if (sb.equals(")")) {
                while (!(operator.get(0).equals("("))) {
                    String pop = operator.pop();
                    oper.append(pop);
                }
                operator.pop();
            } else if (priority(sb) > priority(operator.get(0))) {
                operator.push(sb);
            } else if (priority(sb) <= priority(operator.get(0))) {
                if (operator.contains("(")) {
                    while (!(operator.get(0).equals("("))) {
                        String pop = operator.pop();
                        oper.append(pop);
                    }
                } else {
                    while (!operator.isEmpty()) {
                        String pop = operator.pop();
                        oper.append(pop);
                    }
                }
                operator.push(sb);
            }

        } else {
            oper.append(sb);
        }
    }
    if (!operator.isEmpty()) {
        for (String s1 : operator) {
            oper.append(s1);
        }
    }
    return oper;
    }
2./*
* 后缀表达式计算:
* 处理规则:从左到右依次遍历每个数字和符号,遇到数字就进栈,遇到是运算符就将栈顶的两个数字
* 出栈,进行运算,运算结果入栈,一直到最终获得结果.最后送出栈顶的值就是结果
* */
* public static double suan(StringBuffer s) {
        LinkedList<Double> list = new LinkedList<>();

        for (int i = 0; i < s.length(); i++) {
            String substring = s.substring(i, i + 1);
            if (isOperater(substring)) {
                double pop = list.pop();
               // System.out.println(pop+"pop");
                double pop1 = list.pop();
                //System.out.println(pop1+"pop");
                if (substring.equals("+")) {
                    double a= pop+pop1;
                    list.push(a);
                } else if (substring.equals("-")) {
                    double a= pop1-pop;
                    list.push(a);
                } else if (substring.equals("*")) {
                    double a= pop*pop1;
                    list.push(a);
                } else if (substring.equals("/")) {
                    double a= pop1/pop;
                    list.add(a);
                }
            } else {
                int a=map.get(substring);
                //System.out.println(a);
                double b = (double) a;
                list.push(b);
            }
        }
        return list.pop();
    }
  /*判断操作符*/
    public static boolean isOperater(String s) {
        boolean boo = false;
        if (s.equals("=") || s.equals("+") || s.equals("(") || s.equals(")") || s.equals("*") || s.equals("/")) {
            boo = true;
        }
        return boo;
    }
/*设定优先级*/
    public static Integer priority(String a) {
        Map<String, Integer> map1 = new HashMap<>();
        map1.put("(", 3);
        map1.put(")", 3);
        map1.put("+", 1);
        map1.put("-", 1);
        map1.put("*", 2);
        map1.put("/", 2);
        Integer integer = map1.get(a);
        return integer;
    }

}
欢迎各位大牛指点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值