2D类数独随机运算数学游戏开发:行列运算逻辑实现求助
2D数学方格游戏开发问题解决方案
现有代码问题排查
- 语法错误:
if判断分支直接写在了by4equations函数外部,函数逻辑完全断裂 - 数组越界:
num[2][2] = ...属于非法越界访问,2x2数组的下标最大为[1][1],该写法会篡改栈上其他内存数据 - 运算逻辑错误:当前
sum = num[i][j] + num[i][j]是同一个数自身运算,完全没有实现行、列维度的连续运算,也没有单独存储行、列的运算结果 - 变量名违规:
operator是C/C++的保留关键字,不能用作自定义变量名 - 随机种子设置错误:
srand(time(0))不要放在业务函数中,每次调用都会重置随机种子,短时间内连续调用会生成完全相同的随机数,应该放在程序启动入口处仅执行一次 - 运算合法性缺失:未校验减法、除法的合法性,容易出现负数、除零、非整数等不符合答题游戏需求的无效题目
核心实现思路
1. 数据结构设计
以2x2方格为例,你需要新增三组数据存储规则和结果:
- 行规则数组:长度等于行数,每个位置存储对应行的运算符、运算结果
- 列规则数组:长度等于列数,每个位置存储对应列的运算符、运算结果
- 空白格标记:可以随机标记几个数字格为待填空,作为玩家的答题位
2. 二维运算逻辑拆分
先计算所有行的结果:逐行遍历,用该行对应的运算符从左到右依次运算整行的数字,结果存入行结果数组
再计算所有列的结果:逐列遍历,用该列对应的运算符从上到下依次运算整列的数字,结果存入列结果数组
3. 合法性校验逻辑
随机生成数字和运算符后必须做校验:减法运算结果不能为负,除法运算必须能整除且除数不能为0,不符合要求就重新生成,避免出现无解的题目。
简易修正代码示例
#include <stdio.h> #include <stdlib.h> #include <time.h> // 2x2方格的运算结果存储结构体 typedef struct { int row_res[2]; // 每行的运算结果 int col_res[2]; // 每列的运算结果 int row_op[2]; // 每行的运算符 0加1乘2减3除 int col_op[2]; // 每列的运算符 } MathSquare; // 运算工具函数 int calc(int a, int op, int b) { switch(op) { case 0: return a + b; case 1: return a * b; case 2: return a - b; case 3: return a / b; default: return 0; } } // 生成合法的2x2数学方格 void generate_square(int num[2][2], MathSquare *res) { // 生成4个1-9的随机数 for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { num[i][j] = rand() % 9 + 1; } } // 生成并校验行运算符、计算行结果 for(int i = 0; i < 2; i++) { int op; int cal_res; do { op = rand() % 4; cal_res = calc(num[i][0], op, num[i][1]); // 校验合法性 if(op == 2 && cal_res < 0) continue; if(op == 3 && num[i][1] == 0) continue; if(op == 3 && num[i][0] % num[i][1] != 0) continue; break; } while(1); res->row_op[i] = op; res->row_res[i] = cal_res; } // 生成并校验列运算符、计算列结果 for(int j = 0; j < 2; j++) { int op; int cal_res; do { op = rand() % 4; cal_res = calc(num[0][j], op, num[1][j]); if(op == 2 && cal_res < 0) continue; if(op == 3 && num[1][j] == 0) continue; if(op == 3 && num[0][j] % num[1][j] != 0) continue; break; } while(1); res->col_op[j] = op; res->col_res[j] = cal_res; } } int main() { srand(time(0)); // 全局仅设置一次随机种子 int num[2][2]; MathSquare square; generate_square(num, &square); // 后续可以随机隐藏几个num的数值作为答题位 return 0; }
内容的提问来源于stack exchange,提问作者lemon
相关产品推荐
相关产品推荐

