使用 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
英文地址,請注明出處:http://en.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…