关于java简单的24点游戏的信息

发布时间:2022-11-21

本文目录一览:

  1. 求JAVA 24点游戏算法,界面和发牌器已弄好,求算法
  2. 想用java写个24点的游戏、不懂、急求教、
  3. 24点速算游戏 Java 代码
  4. java算24点代码:输入4个数算24点,能够在命令提示符下就可以运行。100多

求JAVA 24点游戏算法,界面和发牌器已弄好,求算法

package zhidao;
import java.util.Scanner;
public class Game21 {
    public static void main(String[] args) {
        System.out.println("游戏规则:");
        System.out.println("开始游戏后屏幕上将出现一个随机数字");
        System.out.println("按a可以随机增加一个1-10范围内的一个数字");
        System.out.println("按s则揭晓你和电脑对决的结果!");
        System.out.println("如果你的数字大于21点,则游戏直接结束!");
        int rand = (int) (Math.random() * 10 + 1);
        int sum1 = rand, sum2 = 0, which = 0; // 0电脑,1我
        System.out.println("系统先给出1个数字: " + rand);
        System.out.print("轮到你了: ");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String input = "";
            if (which == 0) {
                input = scanner.next();
            }
            if (which == 0 && "a".equals(input)) {
                which = 1;
                int r = (int) (Math.random() * 10 + 1);
                sum2 += r;
                System.out.println("您抽到的数字是: " + r);
                if (sum2 > 21) {
                    System.out.println("你的点数为 " + sum2 + " , 超过了最大限制 21 点,游戏提前结束!");
                    break;
                }
                System.out.print("该电脑了: a\n");
            } else if (which == 1) {
                which = 0;
                int r = (int) (Math.random() * 10 + 1);
                sum1 += r;
                System.out.println("电脑抽到的数字是: " + r);
                if (sum1 > 21) {
                    System.out.println("电脑点数为 " + sum1 + " , 超过了最大限制 21 点,游戏提前结束!");
                    break;
                }
                System.out.print("轮到你了: ");
            } else if (which == 0 && "s".equals(input)) {
                System.out.println("电脑共有:  " + sum1 + " 点");
                System.out.println("你共有: " + sum2 + " 点");
                if (sum1 > sum2) {
                    System.out.println("YOU LOSE !!!");
                } else if (sum1 < sum2) {
                    System.out.println("YOU WIN !!!");
                } else {
                    System.out.println("DRAW GAME !!!");
                }
                System.out.print("轮到你了: ");
                which = 0;
            }
        }
        scanner.close();
    }
}

想用java写个24点的游戏、不懂、急求教、

给你两点提示吧

  1. 四个数有效的运算顺序一共5种,如,(1#2)#(3#4),((1#2)#3)#4为其中的两种。
  2. 将四则运算用函数完成,定义eval(int lhs, int rhs, int op),lhs、rhs 为左右操作数,op为操作符,这样穷举的时候可以将op从1取到4来完成。 PS: 一般玩的24点是可以交换顺序的,如果须要可以再写一个全排列的算法。

24点速算游戏 Java 代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
 * 用给定的4个整数通过加减乘除运算得到24点,如果有多种情况,则全部输出,如果不能得到24点,输出提示
 *
 * @思路:将指定的4个数字进行全排列,将运算符‘+’、‘-’、‘*’、‘/’取3个进行所有情况排列,
 * 然后将所有的数字排列与所有的运算符排列按顺序计算,
 * 如果最后计算结果等于想要的结果值比如24,则为符合条件的运算,
 * 将所有符合条件的数字排列和运算符排列存储起来,并在最后打印输出所有可能的情况
 *
 * @author chenjie
 *
 */
public class TwentyFourPoint {
    public static void main(String[] args) {
        try {
            Set<String> set = caculate(new int[] { 18, 18, 6, 12 }, 24);
            printlnResultSet(set);
        } catch (Exception e) {
            // e.printStackTrace();开发期间方便查找错误,测试通过后就无需打印错误信息了
            System.err.println(e.getMessage());
        }
    }
    /**
     * 打印结果集
     *
     * @param resultSet
     *            结果集
     */
    private static void printlnResultSet(Collection<String> resultSet) {
        for (String str : resultSet) {
            System.out.println(str);
        }
    }
    /**
     * 得到给定整形数组的全排列情况
     *
     * @param numbers
     *            给定的整形数组
     * @return 全排列数组
     */
    private static int[][] arrangeAllNumbers(int[] numbers) {
        List<int[]> list = new ArrayList<int[]>();
        allSort(numbers, 0, numbers.length - 1, list);
        int[][] resultSet = new int[list.size()][list.get(0).length];
        resultSet = list.toArray(resultSet);
        return resultSet;
    }
    /**
     * 得到给定的操作中出现的所有操作符排列情况
     *
     * @param operators
     *            出现的操作符数组
     * @param number
     *            每组操作符的数量
     * @return 所有操作符排列数组
     */
    private static char[][] arrangeAllOperators(char[] operators, int number) {
        int setSize = (int) Math.pow(operators.length, number);
        int index = 0;
        char[][] resultSet = new char[setSize][number];
        for (int i = 0; i < operators.length; i++) {
            for (int j = 0; j < operators.length; j++) {
                for (int k = 0; k < operators.length; k++) {
                    resultSet[index][0] = operators[i];
                    resultSet[index][1] = operators[j];
                    resultSet[index][2] = operators[k];
                    index++;
                }
            }
        }
        return resultSet;
    }
    /**
     * 根据给定的一组整数,通过加减乘除运算,得到想要的结果,如果可以得到结果,则返回所有可能的结果的运算形式。
     * 返回的运算形式,均按从左到右的顺序计算,并不是遵循四则运算法则,比如:
     * 输出的结果形式为:
     * 1 * 8 - 6 * 12 = 24
     * 表示的运算顺序是:
     * 1:1 * 8 = 8,
     * 2:8 - 6 = 2,
     * 3:2 * 12 = 24
     * 而不是按照四则运算法则计算:
     * 1:1 * 8 = 8,
     * 2:6 * 12 = 72,
     * 3:8 * 72 = 576
     *
     * @param numbers
     *            给定进行运算的一组整数,4个数为一组
     * @param targetNumber
     *            想要得到的结果
     * @return 所有可能得到想要的结果的所有运算形式的字符串形式集合
     * @throws Exception
     *             如果不能得到想要的结果,则抛出该异常,表明根据指定的一组数字通过一系列的加减乘除不能得到想要的结果
     */
    public static Set<String> caculate(int[] numbers, int targetNumber)
            throws Exception {
        Set<String> resultSet = new HashSet<String>();// 这里用Set而不是用List,主要是因为当给定的一组数字中如果有重复数字的话,同一结果会被出现多次,如果用List存放的话,会将重复的结果都存放起来,而Set会自动消除重复值
        char[][] operatorsArrangement = arrangeAllOperators(new char[] {
                '+', '-', '*', '/' }, 3);
        int[][] numbersArrangement = arrangeAllNumbers(numbers);
        for (int[] nums : numbersArrangement)
            for (char[] operators : operatorsArrangement) {
                int result = 0;
                try {
                    result = caculate(nums, operators);
                } catch (Exception e) {// 出现非精确计算
                    continue;
                }
                if (result == targetNumber)
                    resultSet.add(buildString(nums, operators, targetNumber));// 如果计算后的结果等于想要的结果,就存放到集合中
            }
        if (resultSet.isEmpty())
            throw new Exception("给定的数字:" + Arrays.toString(numbers)
                    + "不能通过加减乘除运算得到结果:" + targetNumber);
        return resultSet;
    }
    /**
     * 将一组整型数字以给定的操作符按顺序拼接为一个完整的表达式字符串
     *
     * @param nums
     *            一组整型数字
     * @param operators
     *            一组操作符
     * @param target
     *            目标值
     * @return 拼接好的表达式字符串
     */
    private static String buildString(int[] nums, char[] operators, int target) {
        String str = String.valueOf(nums[0]);
        for (int i = 0; i < operators.length; i++) {
            str = str + ' ' + operators[i] + ' ' + nums[i + 1];
        }
        str = str + " = " + target;
        return str;
    }
    /**
     * 将给定的一组数字以给定的操作符按顺序进行运算,如:int result = caculate(new int[]{3,4,5,8}, new
     * char[]{'+','-','*'});
     *
     * @param nums
     *            一组数字
     * @param operators
     *            一组运算符,数量为数字的个数减1
     * @return 最后的计算结果
     * @throws Exception
     *             当计算结果不精确时,抛出该异常,主要是针对除法运算,例如18 / 8 = 2,诸如这样不精确计算将抛出该异常
     */
    private static int caculate(int[] nums, char[] operators) throws Exception {
        int result = 0;
        for (int i = 0; i < operators.length; i++) {
            if (i == 0) {
                result = caculate(nums[i], nums[i + 1], operators[i]);
            } else {
                result = caculate(result, nums[i + 1], operators[i]);
            }
        }
        return result;
    }
    /**
     * 根据指定操作符将两个给定的数字进行计算
     *
     * @param num1
     *            数字1
     * @param num2
     *            数字2
     * @param operator
     *            操作符,只能从“+、-、*、/”4个操作符中取值
     * @return 计算结果
     * @throws Exception
     *             当计算结果不精确时,抛出该异常,主要是针对除法运算,例如18 / 8 = 2,诸如这样不精确计算将抛出该异常
     */
    private static int caculate(int num1, int num2, char operator)
            throws Exception {
        double result = 0;
        switch (operator) {// 根据操作符做相应的计算操作
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num1 - num2;
                break;
            case '*':
                result = num1 * num2;
                break;
            case '/':
                result = (double) num1 / (double) num2;
                break;
        }
        if (!check(result))
            throw new Exception("不精确的计算数字");
        return (int) result;
    }
    /**
     * 检查指定的浮点数是否可以直接转换为整型数字而不损失精度
     *
     * @param result
     *            要检查的浮点数
     * @return 如果可以进行无损转换,返回true,否则返回false
     */
    private static boolean check(double result) {
        String str = String.valueOf(result);
        int pointIndex = str.indexOf(".");// 小数点的下标值
        String fraction = str.substring(pointIndex + 1);
        return fraction.equals("0") ? true : false;// 通过判断小数点后是否只有一个0来确定是否可以无损转换为整型数值
    }
    /**
     * 对传入的整型数组buf进行全排列
     *
     * @param buf
     *            要进行全排列的整型数组
     * @param start
     *            开始的下标值
     * @param end
     *            结束下标值
     * @param list
     *            保存最后全排列结果的集合
     */
    private static void allSort(int[] buf, int start, int end, List<int[]> list) {
        if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
            int[] a = new int[buf.length];
            System.arraycopy(buf, 0, a, 0, a.length);
            list.add(a);
        } else {// 多个字母全排列
            for (int i = start; i <= end; i++) {
                int temp = buf[start]; // 交换数组第一个元素与后续的元素
                buf[start] = buf[i];
                buf[i] = temp;
                allSort(buf, start + 1, end, list); // 后续元素递归全排列
                temp = buf[start]; // 将交换后的数组还原
                buf[start] = buf[i];
                buf[i] = temp;
            }
        }
    }
}

java算24点代码:输入4个数算24点,能够在命令提示符下就可以运行。100多

import java.util.Scanner;
/**
 * 给定4个数字计算24
 */
public class Core {
    private double expressionResult = 24;
    // private int maxLine=10;
    private boolean error = true;
    private double numbers[] = new double[4];
    public Object resultReturn;
    /**
     * 该对象拥有3个私有变量 expressionResult,所需结果 maxLine,输出结果每页行数 error,是否出错
     * numbers[4],记录用来运算的4个数
     *
     * 其次,该对象拥有以下方法供外部调用 setNumbers(double[] 运算的数) 输入用来运算的数,4个时才能计算,无返回
     * setMaxLine(int 行数) 输入每页的行数,无返回 getMaxLine() 返回每页的行数,类型为int
     * setExpressionResult(double 所需结果) 输入所需结果,无返回 getExpressionResult()
     * 返回所需结果,类型为double getExpression() 返回可得出所需结果的表达式,类型为字符串数组
     *
     * 最后,私有方法均为计算与表达式转换部分
     */
    // 测试使用
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[4];
        System.out.print("输入第一个数:");
        arr[0] = scanner.nextInt();
        System.out.print("输入第二个数:");
        arr[1] = scanner.nextInt();
        System.out.print("输入第三个数:");
        arr[2] = scanner.nextInt();
        System.out.print("输入第四个数:");
        arr[3] = scanner.nextInt();
        Core s = new Core();
        s.setNumbers(arr);
        String[] output = s.getExpression();
        for (int i = 0; i < output.length; i++) {
            System.out.println(output[i]);
        }
    }
    /** 设定被计算的四个数,由于是数组,所以具有容错功能(不为4个数) */
    public void setNumbers(double[] n) {
        if (n.length == 4) {
            error = false;
            numbers = n;
        } else
            error = true;
    }
    public void setNumbers(int[] n) {
        if (n.length == 4) {
            error = false;
            for (int i = 0; i < 4; i++) {
                numbers[i] = n[i];
            }
        } else
            error = true;
    }
    /** 设定每页显示的行数 */
    // public void setMaxLine(int n) {
    // if (n>0) {
    // maxLine=n;
    // }
    // }
    // /** 返回每页显示的行数 */
    // public int getMaxLine() {
    // return maxLine;
    // }
    /** 设定需要得到的结果 */
    public void setExpressionResult(double n) {
        expressionResult = n;
    }
    /** 返回所需结果 */
    public double expressionResult() {
        return expressionResult;
    }
    /** 返回符合条件的表达式 */
    public String[] getExpression() {
        if (!error) {
            String[] expression = calculate(numbers);
            return expression;
        } else
            return new String[] { "出错了,输入有误" };
    }
    /** cal24(),输出结果为24的表达式 */
    private String[] calculate(double[] n) {
        if (n.length != 4)
            return new String[] { "Error" };
        double[] n1 = new double[3];
        double[] n2 = new double[2];
        String[] resultString = new String[1024]; // 最多1000组解,暂时未溢出
        int count = 0;
        boolean isRepeat = false;
        for (int t1 = 0; t1 < 6; t1++) {
            for (int c1 = 0; c1 < 6; c1++) {
                for (int t2 = 0; t2 < 3; t2++) {
                    for (int c2 = 0; c2 < 6; c2++) {
                        for (int c3 = 0; c3 < 6; c3++) {
                            if ((c1 / 3 == c2 / 3 && (c1 % 3) * (c2 % 3) != 0)
                                    || (c2 / 3 == c3 / 3 && (c2 % 3) * (c3 % 3) != 0)
                                    || (c1 / 3 == c3 / 3
                                    && (c1 % 3) * (c3 % 3) != 0 && t2 == 2)) {
                                // 去除连减连除的解,因为x/(y/z)=x*z/y
                                continue;
                            }
                            n1 = cal1(n, t1, c1);
                            n2 = cal2(n1, t2, c2);
                            double result = cal(n2[0], n2[1], c3);
                            if ((result - expressionResult) < 0.00000001
                                    || (expressionResult - result) < 0.00000001) {
                                resultString[count] = calString(n, t1, c1, t2,
                                        c2, c3)
                                        + "=" + (int) expressionResult;
                                for (int i = 0; i < count; i++) {
                                    isRepeat = false;
                                    if (resultString[i]
                                            .equals(resultString[count])) { // 去除完全重复的解
                                        isRepeat = true;
                                        break; // 提前退出循环
                                    }
                                }
                                if (c1 == c2 && c2 == c3 && c1 % 3 == 0
                                        && t1 + t2 != 0) { // 连加连乘
                                    isRepeat = true;
                                }
                                if (!isRepeat) {
                                    count++;
                                }
                            }
                        }
                    }
                }
            }
        }
        if (count == 0)
            return new String[] { "该组数无解" };
        String[] resultReturn = new String[count];
        System.arraycopy(resultString, 0, resultReturn, 0, count);
        return resultReturn;
    }
    /** cal1(),将4个数计算一次后返回3个数 */
    private double[] cal1(double[] n, int t, int c) { // t为原来的t1,c为原来的c1
        double[] m = new double[3];
        switch (t) {
            case 0:
                m[1] = n[2];
                m[2] = n[3];
                m[0] = cal(n[0], n[1], c);
                break;
            case 1:
                m[1] = n[1];
                m[2] = n[3];
                m[0] = cal(n[0], n[2], c);
                break;
            case 2:
                m[1] = n[1];
                m[2] = n[2];
                m[0] = cal(n[0], n[3], c);
                break;
            case 3:
                m[1] = n[0];
                m[2] = n[3];
                m[0] = cal(n[1], n[2], c);
                break;
            case 4:
                m[1] = n[0];
                m[2] = n[2];
                m[0] = cal(n[1], n[3], c);
                break;
            default:
                m[1] = n[0];
                m[2] = n[1];
                m[0] = cal(n[2], n[3], c);
        }
        return m;
    }
    /** cal2(),将3个数计算一次后返回2个数 */
    private double[] cal2(double[] n, int t, int c) { // t为原来的t2,c为原来的c2
        double[] m = new double[2];
        switch (t) {
            case 0:
                m[1] = n[2];
                m[0] = cal(n[0], n[1], c);
                break;
            case 1:
                m[1] = n[1];
                m[0] = cal(n[0], n[2], c);
                break;
            default:
                m[1] = n[0];
                m[0] = cal(n[1], n[2], c);
        }
        return m;
    }
    /** cal(),将2个数计算后返回结果 */
    private double cal(double n1, double n2, int c) { // n1,n2为运算数,c为运算类型
        switch (c) {
            case 0:
                return n1 + n2;
            case 1:
                return n1 - n2;
            case 2:
                return n2 - n1;
            case 3:
                return n1 * n2;
            case 4:
                if (n2 == 0)
                    return 9999; // 使计算结果必不为24
                else
                    return n1 / n2;
            default:
                if (n1 == 0)
                    return 9999; // 同上
                else
                    return n2 / n1;
        }
    }
    /** calString(),输出表达式 */
    private String calString(double[] n, int t1, int c1, int t2, int c2, int c3) {
        String[] nString = new String[4];
        switch (t1) {
            case 0:
                nString[0] = calString2("" + (int) n[0], "" + (int) n[1], c1);
                nString[1] = "" + (int) n[2];
                nString[2] = "" + (int) n[3];
                break;
            case 1:
                nString[0] = calString2("" + (int) n[0], "" + (int) n[2], c1);
                nString[1] = "" + (int) n[1];
                nString[2] = "" + (int) n[3];
                break;
            case 2:
                nString[0] = calString2("" + (int) n[0], "" + (int) n[3], c1);
                nString[1] = "" + (int) n[1];
                nString[2] = "" + (int) n[2];
                break;
            case 3:
                nString[0] = calString2("" + (int) n[1], "" + (int) n[2], c1);
                nString[1] = "" + (int) n[0];
                nString[2] = "" + (int) n[3];
                break;
            case 4:
                nString[0] = calString2("" + (int) n[1], "" + (int) n[3], c1);
                nString[1] = "" + (int) n[0];
                nString[2] = "" + (int) n[2];
                break;
            default:
                nString[0] = calString2("" + (int) n[2], "" + (int) n[3], c1);
                nString[1] = "" + (int) n[0];
                nString[2] = "" + (int) n[1];
        }
        if ((c2 / 3 > c1 / 3 && (t2 != 2 || c2 / 3 == c3 / 3))
                || ((c3 / 3 > c1 / 3 + c2 / 3) && t2 == 2)
                || (c3 == 1 && c1 / 3 == 0)) // 特定情况下加上一个括号*****************************
            nString[0] = '(' + nString[0] + ')';
        switch (t2) {
            case 0:
                nString[0] = calString2(nString[0], "" + nString[1], c2);
                nString[1] = nString[2];
                break;
            case 1:
                nString[0] = calString2(nString[0], nString[2], c2);
                break;
            default:
                nString[3] = nString[0];
                nString[0] = calString2(nString[1], nString[2], c2);
                nString[1] = nString[3];
        }
        if (c3 / 3 > c2 / 3 || (c3 == 2 && nString[0].indexOf('+') >= 0)) // 特定情况下加上一个括号*****************************
            nString[0] = '(' + nString[0] + ')';
        return calString2(nString[0], nString[1], c3);
    }
    /** calString(),根据符号输出一部运算表达式 */
    private String calString2(String n1, String n2, int c) {
        switch (c) {
            case 0:
                return n1 + '+' + n2;
            case 1:
                return n1 + '-' + n2;
            case 2:
                return n2 + '-' + n1;
            case 3:
                return n1 + '*' + n2;
            case 4:
                return n1 + '/' + n2;
            default:
                return n2 + '/' + n1;
        }
    }
}