從零開始實現數學題目的作答小游戲
開源技術欄
使用 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】
事件描述備注:保存/發布
? 中國 天津市 天津