使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】

从零开始实现数学题目的作答小游戏

开源技术栏

使用 Mathematical_Expression 让计算机做出题人,让代码与数学碰撞出趣味火花。

目录

文章目录

从零开始实现数学题目的作答小游戏:让代码与数学碰撞出趣味火花

数学,是逻辑与创造力的交汇点;而编程,则是将抽象思维转化为具体实践的桥梁。当二者相遇,会擦出怎样的火花?本文将带你用Java代码构建一款动态数学答题小游戏,通过随机生成数学题目、实时计算答案、交互式答题等功能,让学习数学的过程充满趣味性。更令人兴奋的是,我们将借助开源库 mathematical-expression 的强大能力,让代码自动解析和运算复杂的数学表达式,彻底解放开发者对"题目生成器"的实现难度。

为什么选择动态数学题目?

传统的数学练习往往局限于静态题库,而动态生成的题目系统能带来三大优势:

  • 无限题库:通过算法随机组合数字与运算符,每次运行都产生全新题目;

  • 难度自适应:可灵活控制运算符类型(加减乘除、括号等)和数值范围;

  • 即时验证:利用表达式解析库自动判断用户答案的正确性。

来看一段核心代码的讲解

首先将依赖引入

xml 复制代码
    <dependencies>
        <dependency>
            <groupId>io.github.BeardedManZhao</groupId>
            <artifactId>mathematical-expression</artifactId>
            <version>1.5.7</version>
        </dependency>
    </dependencies>

然后是我们要展示的代码!

java 复制代码
package org.example;

import io.github.beardedManZhao.mathematicalExpression.core.Mathematical_Expression;
import io.github.beardedManZhao.mathematicalExpression.core.calculation.number.JvmCalculation;
import io.github.beardedManZhao.mathematicalExpression.core.container.JvmExpression;

public class Main {
    public static void main(String[] args) {
        // 获取到一个Jvm计算组件
        JvmCalculation instance = (JvmCalculation) Mathematical_Expression.getInstance(Mathematical_Expression.jvmCalculation);
        // 将一个表达式进行编译
        JvmExpression compile = instance.compile("1 + 1 - 1 * 1", false);
        // 设置不同位置的操作数的值 用来改变表达式
        compile.setParamNumber(0, 2);
        compile.setParamNumber(1, 3);
        compile.setParamNumber(3, 4);
        // 打印出表达式的结果
        System.out.println(compile.getExpressionStrAndNumber());
    }
}

运行结果会输出:2.0 + 3.0 - 1.0 * 4.0

这正是我们构建题目的核心思路------通过程序化修改表达式参数,即可生成千变万化的数学题!

接下来我们将开始实现

开始实现

实现不同的操作符

我们发现 对于单个表达式的操作数可以进行修改,但操作符比较单一,因此多创建一些带有不同操作符的表达式!

复制代码
package org.example;

import io.github.beardedManZhao.mathematicalExpression.core.Mathematical_Expression;
import io.github.beardedManZhao.mathematicalExpression.core.calculation.number.JvmCalculation;
import io.github.beardedManZhao.mathematicalExpression.core.container.JvmExpression;

public class Main {

    public static void main(String[] args) {
        // 获取到一个Jvm计算组件
        JvmCalculation instance = (JvmCalculation) Mathematical_Expression.getInstance(Mathematical_Expression.jvmCalculation);
        // 编译不同操作符的表达式
        JvmExpression[] compiles = {
                instance.compile("1 + 1 - 1 * 1", false),
                instance.compile("1 - 1 / 1 * 1", false),
                instance.compile("1 + 1 - 1 / 1", false),
                instance.compile("1 + (1 - 1) * 1", false)
        };
    }
}

实现随机选择表达式功能

复制代码
package org.example;

import io.github.beardedManZhao.mathematicalExpression.core.Mathematical_Expression;
import io.github.beardedManZhao.mathematicalExpression.core.calculation.number.JvmCalculation;
import io.github.beardedManZhao.mathematicalExpression.core.container.JvmExpression;

import java.util.Random;

public class Main {

    public static void main(String[] args) {
        // 获取到一个Jvm计算组件
        JvmCalculation instance = (JvmCalculation) Mathematical_Expression.getInstance(Mathematical_Expression.jvmCalculation);
        // 编译不同操作符的表达式
        JvmExpression[] compiles = {
                instance.compile("1 + 1 - 1 * 1", false),
                instance.compile("1 - 1 / 1 * 1", false),
                instance.compile("1 + 1 - 1 / 1", false),
                instance.compile("1 + (1 - 1) * 1", false)
        };
        // 准备一个随机生成器
        final Random random = new Random();
        // 随机选择 10 个表达式 测测看看功能是否正常
        for (int i = 0; i < 10; i++) {
            JvmExpression compile = compiles[random.nextInt(4)];
            System.out.println(compile.getExpressionStrAndNumber());
        }
    }
}

下面是运行结果

复制代码
1.0 + (1.0 - 1.0) * 1.0
1.0 + (1.0 - 1.0) * 1.0
1.0 + 1.0 - 1.0 * 1.0
1.0 + 1.0 - 1.0 * 1.0
1.0 + (1.0 - 1.0) * 1.0
1.0 + 1.0 - 1.0 * 1.0
1.0 - 1.0 / 1.0 * 1.0
1.0 - 1.0 / 1.0 * 1.0
1.0 + 1.0 - 1.0 / 1.0
1.0 + (1.0 - 1.0) * 1.0

实现单个表达式操作数的随机修改功能

复制代码
package org.example;

import io.github.beardedManZhao.mathematicalExpression.core.Mathematical_Expression;
import io.github.beardedManZhao.mathematicalExpression.core.calculation.number.JvmCalculation;
import io.github.beardedManZhao.mathematicalExpression.core.container.JvmExpression;

import java.util.Random;

public class Main {

    public static void main(String[] args) {
        // 获取到一个Jvm计算组件
        JvmCalculation instance = (JvmCalculation) Mathematical_Expression.getInstance(Mathematical_Expression.jvmCalculation);
        // 编译不同操作符的表达式
        JvmExpression[] compiles = {
                instance.compile("1 + 1 - 1 * 1", false),
                instance.compile("1 - 1 / 1 * 1", false),
                instance.compile("1 + 1 - 1 / 1", false),
                instance.compile("1 + (1 - 1) * 1", false)
        };
        // 准备一个随机生成器
        final Random random = new Random();
        // 随机选择 10 个表达式 测测看看功能是否正常
        for (int i = 0; i < 10; i++) {
            JvmExpression compile = compiles[random.nextInt(4)];
            // 依次迭代当前表达式的每个操作数
            for (int i1 = 0; i1 < compile.getLength(); i1++) {
                // 开始修改 将操作数修改为 小于等于 100 的数
                compile.setParamNumber(i1, random.nextInt(100));
            }
            // 打印表达式
            System.out.println(compile.getExpressionStrAndNumber());
        }
    }
}

下面是运行结果

复制代码
31.0 + 15.0 - 83.0 * 18.0
70.0 + 7.0 - 34.0 / 85.0
84.0 + (29.0 - 65.0) * 14.0
68.0 + 75.0 - 71.0 * 49.0
57.0 - 32.0 / 30.0 * 87.0
98.0 + 35.0 - 51.0 / 51.0
10.0 - 54.0 / 28.0 * 51.0
67.0 - 3.0 / 74.0 * 23.0
0.0 + (71.0 - 14.0) * 34.0
76.0 - 16.0 / 59.0 * 65.0

现在可以看到表达式已经比较随机了,表达式的生成成功了!

实现表达式结果的计算

复制代码
package org.example;

import io.github.beardedManZhao.mathematicalExpression.core.Mathematical_Expression;
import io.github.beardedManZhao.mathematicalExpression.core.calculation.number.JvmCalculation;
import io.github.beardedManZhao.mathematicalExpression.core.container.JvmExpression;
import zhao.utils.StrUtils;

import java.util.Random;

public class Main {

    public static void main(String[] args) {
        // 获取到一个Jvm计算组件
        JvmCalculation instance = (JvmCalculation) Mathematical_Expression.getInstance(Mathematical_Expression.jvmCalculation);
        // 编译不同操作符的表达式
        JvmExpression[] compiles = {
                instance.compile("1 + 1 - 1 * 1", false),
                instance.compile("1 - 1 / 1 * 1", false),
                instance.compile("1 + 1 - 1 / 1", false),
                instance.compile("1 + (1 - 1) * 1", false)
        };
        // 准备一个随机生成器
        final Random random = new Random();
        // 随机选择 10 个表达式 测测看看功能是否正常
        for (int i = 0; i < 10; i++) {
            JvmExpression compile = compiles[random.nextInt(4)];
            // 依次迭代当前表达式的每个操作数
            for (int i1 = 0; i1 < compile.getLength(); i1++) {
                // 开始修改 将操作数修改为 小于等于 100 的数
                compile.setParamNumber(i1, random.nextInt(100));
            }
            // 打印表达式的结果
            Double result = compile.calculation(false).getResult();
            // 判断小数位是否过长 过长的不计算了
            boolean isWireless = String.valueOf(result).split("\\.")[1].length() > 2;
            if (!isWireless) {
                // 打印表达式
                System.out.println(compile.getExpressionStrAndNumber());
                // 打印计算结果
                System.out.println(result);
            }
        }
    }
}

下面是运行结果

复制代码
4.0 + (60.0 - 26.0) * 80.0
2724.0
52.0 + (82.0 - 12.0) * 52.0
3692.0
68.0 + 48.0 - 21.0 * 60.0
-1144.0
18.0 + (56.0 - 27.0) * 4.0
134.0
81.0 + (16.0 - 79.0) * 44.0
-2691.0
94.0 + 38.0 - 53.0 * 75.0
-3843.0
30.0 + (27.0 - 40.0) * 41.0
-503.0

实现与用户之间的校验(最终代码)

java 复制代码
package org.example;

import io.github.beardedManZhao.mathematicalExpression.core.Mathematical_Expression;
import io.github.beardedManZhao.mathematicalExpression.core.calculation.number.JvmCalculation;
import io.github.beardedManZhao.mathematicalExpression.core.container.JvmExpression;

import java.util.Random;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // 获取到一个Jvm计算组件
        JvmCalculation instance = (JvmCalculation) Mathematical_Expression.getInstance(Mathematical_Expression.jvmCalculation);
        // 编译不同操作符的表达式
        JvmExpression[] compiles = {
                instance.compile("1 + 1 - 1 * 1", false),
                instance.compile("1 - 1 / 1 * 1", false),
                instance.compile("1 + 1 - 1 / 1", false),
                instance.compile("1 + (1 - 1) * 1", false)
        };
        // 准备一个随机生成器
        final Random random = new Random();
        // 准备一个扫描器
        final Scanner scanner = new Scanner(System.in);
        // 随机选择 10 个表达式 测测看看功能是否正常
        for (int i = 0; i < 10; i++) {
            JvmExpression compile = compiles[random.nextInt(4)];
            // 依次迭代当前表达式的每个操作数
            for (int i1 = 0; i1 < compile.getLength(); i1++) {
                // 开始修改 将操作数修改为 小于等于 100 的数
                compile.setParamNumber(i1, random.nextInt(100));
            }
            // 打印表达式的结果
            Double result = compile.calculation(false).getResult();
            // 判断小数位是否过长 过长的不计算了
            boolean isWireless = String.valueOf(result).split("\\.")[1].length() > 2;
            if (!isWireless) {
                // 打印表达式
                System.out.print(compile.getExpressionStrAndNumber() + " = ");
                try {
                    // 等待用户输入计算结果
                    final String s = scanner.nextLine();
                    // 校验
                    if (Double.parseDouble(s) == result) {
                        System.out.println("解答正确!");
                    } else {
                        System.out.println("解答错误~,正确答案为 = " + result);
                    }
                } catch (NumberFormatException e) {
                    System.out.println("解答错误,您输入的不是一个数字,正确答案为:" + result);
                }
            }
        }
    }
}

下面是运行的效果

复制代码
49.0 + (61.0 - 78.0) * 90.0 = -1481
解答正确!
76.0 + (84.0 - 92.0) * 5.0 = 0
解答错误~,正确答案为 = 36.0
50.0 + (96.0 - 15.0) * 5.0 = qqq
解答错误,您输入的不是一个数字,正确答案为:455.0

操作记录

作者:zhao

操作时间:2025-07-04 12:57:13 星期五 【时区:UTC 8】

事件描述备注:保存/发布

 中国 天津市 天津

相关推荐
程序员张337 分钟前
Maven编译和打包插件
java·spring boot·maven
ybq195133454312 小时前
Redis-主从复制-分布式系统
java·数据库·redis
weixin_472339462 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
小毛驴8503 小时前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
DKPT3 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
子燕若水4 小时前
Unreal Engine 5中的AI知识
人工智能
好奇的菜鸟5 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
极限实验室5 小时前
Coco AI 实战(一):Coco Server Linux 平台部署
人工智能
杨过过儿5 小时前
【学习笔记】4.1 什么是 LLM
人工智能
巴伦是只猫5 小时前
【机器学习笔记Ⅰ】13 正则化代价函数
人工智能·笔记·机器学习