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

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

开源技术栏

使用 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】
事件描述备注:保存/发布
 中国 天津市 天津

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89993.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DQL-9-小结

DQL-9-小结 小结DQL语句 小结 DQL语句 SELECT 字段列表 -- 字段名 [AS] 别名FROM 表名列表WHERE条件列表 -- >、 >、 <、 <、 、 <>、 like、 between ... and、 in、 and、 or, 分组之前过滤 GROUP BY分组字段列表HAVING分组后条件列表 -- 分组之后…

[netty5: WebSocketServerHandshaker WebSocketServerHandshakerFactory]-源码分析

在阅读这篇文章前&#xff0c;推荐先阅读以下内容&#xff1a; [netty5: WebSocketFrame]-源码分析[netty5: WebSocketFrameEncoder & WebSocketFrameDecoder]-源码解析 WebSocketServerHandshakerFactory WebSocketServerHandshakerFactory 用于根据客户端请求中的 Web…

数据挖掘:深度解析与实战应用

在当今数字化时代&#xff0c;数据挖掘已经成为企业获取竞争优势的关键技术之一。通过从大量数据中提取有价值的信息&#xff0c;企业可以更好地理解客户需求、优化业务流程、提高运营效率。本文将深入探讨数据挖掘的核心技术、实际应用案例以及如何在企业中实施数据挖掘项目。…

LLM面试题14

算法岗面试题 介绍下Transformer模型。 Transformer本身是一个典型的encoder-decoder模型&#xff0c;Encoder端和Decoder端均有6个Block,Encoder端的Block包括两个模块&#xff0c;多头self-attention模块以及一个前馈神经网络模块&#xff1b;Decoder端的Block包括三个模块&…

Java金融场景中为什么金额字段禁止使用浮点类型(float/double)?

引言 Java金融场景中为什么金额字段禁止使用浮点类型&#xff1f;这是一篇你不能忽视的“爆雷”警告&#xff01; 在金融、电商、支付、清结算等业务系统中&#xff0c;浮点类型是绝对禁区&#xff01; &#x1f6a8;一、核心警告&#xff1a;浮点类型不是十进制数&#xff01;…

SVN下载与拉取

大家好我是苏麟&#xff0c;今天聊一聊SVN。 SVN官网&#xff1a;下载 TortoiseSVN - TortoiseSVN 软件 根据系统选择32位还是64位 打开文件 安装&#xff0c;下一步&#xff0c;下一步 安装成功后&#xff0c;右键找到SVNcheck 输入地址 输入用户名和密码就OK了 这期就到这里…

数据结构笔记8:堆

目录 满二叉树&#xff1a; 完全二叉树&#xff1a; 堆是一种特殊的完全二叉树&#xff1a; 我们可以以数组的方式存储堆。 父节点和子节点下标关系的推导&#xff1a; 1.使用数学归纳法证明n2 1 n0&#xff1a; 2.使用边和节点的关系证明n2 1 n0&#xff1a; 我们…

3. lvgl 9.3 vscode 模拟环境搭建 lv_port_pc_vscode-release-v9.3

文章目录1. 资源下载1. 1 lv_port_pc_vscode1.2 cmake 和 mingw 环境搭建1.3 sdl 下载1.4 下载lvgl_v9.32. 环境搭建2.1 拷贝lvgl 源码到工程2.2 添加SDL2 依赖2.3 执行工程3. 运行示例1. 资源下载 1. 1 lv_port_pc_vscode 那么多模拟器&#xff0c;为什么选择这个&#xff1…

【牛客刷题】小红的爆炸串(二)

一、题目介绍 本题链接为:小红的爆炸串(二) 小红定义一个字符串会爆炸,当且仅当至少有k对相邻的字母不同。 例如,当 k k k=2时,"arc"会爆炸,而"aabb"则不会爆炸。 小红拿到了一个长度为

【实战】如何训练一个客服语音对话场景VAD模型

1. 引言:客服场景下的VAD模型 在客服中心,每天都会产生海量的通话录音。对这些录音进行有效分析,可以用于服务质量监控、客户意图洞察、流程优化等。VAD在其中扮演着“预处理器”和“过滤器”的关键角色: 提升ASR效率与准确性:只将检测到的语音片段送入ASR引擎,可以避免…

在 Dokploy 中为 PostgreSQL 搭建 PgBouncer 数据库连接池(图文)

前言&#xff1a;为什么你需要一个连接池&#xff1f; 如果你正在使用 Node.js (尤其是像 Next.js 这样的框架) 配合 Prisma 操作 PostgreSQL 数据库&#xff0c;你很可能在某个阶段会遇到那个令人头疼的错误&#xff1a;“Error: Too many clients already”。这通常发生在应…

Mac获取终端历史

在 macOS 中&#xff0c;历史记录文件的位置取决于你使用的 shell。以下是针对不同 shell 的历史记录文件的默认位置&#xff1a;对于 Bash 用户&#xff1a; 历史记录文件通常位于 ~/.bash_history。对于 Zsh 用户&#xff08;macOS Catalina及以后版本默认使用的shell&#x…

高频交易服务器篇

在 Binance 进行高频交易&#xff08;HFT&#xff09;时&#xff0c;服务器的低延迟、高稳定性和快速网络是关键。亚马逊云&#xff08;AWS&#xff09; 提供了多种适合高频交易的方案&#xff0c;以下是推荐的配置和优化策略&#xff1a;1. 选择 AWS 区域&#xff08;Region&a…

MVC与MVVM架构模式详解:原理、区别与JavaScript实现

Hi&#xff0c;我是布兰妮甜 &#xff01;在当今复杂的前端开发领域&#xff0c;如何组织代码结构一直是开发者面临的核心挑战。MVC和MVVM作为两种经典的架构模式&#xff0c;为前端应用提供了清晰的责任划分和可维护的代码组织方案。本文将深入探讨这两种模式的原理、实现差异…

从小白到进阶:解锁linux与c语言高级编程知识点嵌入式开发的任督二脉(2)

【硬核揭秘】Linux与C高级编程&#xff1a;从入门到精通&#xff0c;你的全栈之路&#xff01; 第三部分&#xff1a;Shell脚本编程——自动化你的Linux世界&#xff0c;让效率飞起来&#xff01; 嘿&#xff0c;各位C语言的“卷王”们&#xff01; 在Linux的世界里&#xf…

锁和事务的关系

事务的4大特性(ACID) 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务被视为一个单一的、不可分割的工作单元一致性&#xff08;Consistency&#xff09;&#xff1a;事务执行前后&#xff0c;数据库从一个一致状态转变为另一个一致状态&#xff0c;并且强制执行所有…

电动车信用免押小程序免押租赁小程序php方案

电动车信用免押租赁小程序&#xff0c;免押租小程序&#xff0c;信用免押接口申请、对接开发&#xff0c;可源码搭建&#xff0c;可二开或定制。开发语言后端php&#xff0c;前端uniapp。可二开定制 在线选择门店&#xff0c;选择车辆类型&#xff0c;选择租赁方式&#xff08…

机器学习在智能安防中的应用:视频监控与异常行为检测

随着人工智能技术的飞速发展&#xff0c;智能安防领域正经历着一场深刻的变革。智能安防通过整合先进的信息技术&#xff0c;如物联网&#xff08;IoT&#xff09;、大数据和机器学习&#xff0c;能够实现从传统的被动防御到主动预防的转变。机器学习技术在智能安防中的应用尤为…

MySQL中DROP、DELETE与TRUNCATE的深度解析

在MySQL数据库操作中&#xff0c;DROP、DELETE和TRUNCATE是三个常用的数据操作命令&#xff0c;它们都可以用于删除数据&#xff0c;但在功能、执行效率、事务处理以及对表结构的影响等方面存在显著差异。本文将从多个维度对这三个命令进行详细对比和解析&#xff0c;帮助读者更…

一条 SQL 语句的内部执行流程详解(MySQL为例)

当执行如下 SQL&#xff1a; SELECT * FROM users WHERE id 1;在数据库内部&#xff0c;其实会经历多个复杂且有序的阶段。以下是 MySQL&#xff08;InnoDB 引擎&#xff09;中 SQL 查询语句从发送到结果返回的完整执行流程。 客户端连接阶段 客户端&#xff08;如 JDBC、My…