从零开始实现数学题目的作答小游戏
开源技术栏
使用 Mathematical_Expression 让计算机做出题人,让代码与数学碰撞出趣味火花。
目录
文章目录
- 从零开始实现数学题目的作答小游戏
- 目录
- 从零开始实现数学题目的作答小游戏:让代码与数学碰撞出趣味火花
- 为什么选择动态数学题目?
- 来看一段核心代码的讲解
- 开始实现
- 实现不同的操作符
- 实现随机选择表达式功能
- 实现单个表达式操作数的随机修改功能
- 实现表达式结果的计算
- 实现与用户之间的校验(最终代码)

从零开始实现数学题目的作答小游戏:让代码与数学碰撞出趣味火花
数学,是逻辑与创造力的交汇点;而编程,则是将抽象思维转化为具体实践的桥梁。当二者相遇,会擦出怎样的火花?本文将带你用Java代码构建一款动态数学答题小游戏,通过随机生成数学题目、实时计算答案、交互式答题等功能,让学习数学的过程充满趣味性。更令人兴奋的是,我们将借助开源库 mathematical-expression 的强大能力,让代码自动解析和运算复杂的数学表达式,彻底解放开发者对"题目生成器"的实现难度。
为什么选择动态数学题目?
传统的数学练习往往局限于静态题库,而动态生成的题目系统能带来三大优势:
-
无限题库:通过算法随机组合数字与运算符,每次运行都产生全新题目;
-
难度自适应:可灵活控制运算符类型(加减乘除、括号等)和数值范围;
-
即时验证:利用表达式解析库自动判断用户答案的正确性。
来看一段核心代码的讲解
首先将依赖引入
<dependencies><dependency><groupId>io.github.BeardedManZhao</groupId><artifactId>mathematical-expression</artifactId><version>1.5.7</version></dependency></dependencies>
然后是我们要展示的代码!
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
实现与用户之间的校验(最终代码)
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】
事件描述备注:保存/发布
中国 天津市 天津