使用 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】

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

 中国 天津市 天津

相关推荐
KG_LLM图谱增强大模型21 小时前
[谷歌最新白皮书]嵌入与向量存储:打开AI多模态数据处理的钥匙
人工智能·大模型·知识图谱·向量存储·多模态
吃喝不愁霸王餐APP开发者21 小时前
Java后端系统对接第三方外卖API时的幂等性设计与重试策略实践
java·开发语言
roman_日积跬步-终至千里21 小时前
【人工智能导论】08-学习-如何让计算机理解序列数据——用RNN/LSTM建模时序依赖,用文本嵌入表示序列元素
人工智能·rnn·学习
TG:@yunlaoda360 云老大21 小时前
华为云国际站代理商的CBR主要有什么作用呢?
java·网络·华为云
技术吧21 小时前
2025年AI不是宠物,是会思考的幽灵!
人工智能·宠物
苍何1 天前
以前我以为达人营销很玄学,用了 Aha 才知道还能这么玩!(附教程)
人工智能
苍何1 天前
扣子彻底变了!拥抱 Vibe Coding,不只是智能体!
人工智能
苍何1 天前
抢先实测豆包1.8模型,多模态Agent超强!
人工智能
速易达网络1 天前
基于Java TCP 聊天室
java·开发语言·tcp/ip
黎相思1 天前
项目简介
人工智能·chatgpt