猜数字只能练"比较",这一篇我们做一个真正会随机出题的小游戏:数学速算问答。程序自动生成加减乘除四则运算,你口算作答、答对加分,最后给出总分和评价。
玩法介绍
游戏共 10 题,每题从加、减、乘、除中随机抽取一种,操作数范围 1~20。答对 +10 分,答错公布正确答案;全部答完后,根据得分给出"心算大师"到"别灰心"的评价。
第 1 步:搭建出题循环
用常量 TOTAL 控制题数,for 循环跑 10 轮。记得先 srand 播种,否则每次运行生成的"随机题"都一模一样。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
const int TOTAL = 10; /* 一共 10 题 */
int i, score = 0;
srand((unsigned)time(NULL));
for (i = 1; i <= TOTAL; i++) {
/* 每轮在这里生成题目并判分 */
}
return 0;
}
第 2 步:随机生成算式
三个随机数决定一道题:op 决定运算符(0 加、1 减、2 乘、3 除),a、b 是操作数。switch 同时完成"算答案"和"打印题目"两件事。
int op = rand() % 4; /* 0 加 1 减 2 乘 3 除 */
int a = rand() % 20 + 1; /* 操作数: 1~20 */
int b = rand() % 20 + 1;
int answer;
switch (op) {
case 0: answer = a + b; printf("第 %d 题: %d + %d = ", i, a, b); break;
case 1: answer = a - b; printf("第 %d 题: %d - %d = ", i, a, b); break;
case 2: answer = a * b; printf("第 %d 题: %d × %d = ", i, a, b); break;
case 3: answer = a / b; printf("第 %d 题: %d ÷ %d = ", i, a, b); break;
}
第 3 步:处理减法与除法
直接相减可能出负数、相除可能出小数,对心算都不友好。技巧:减法题若 a < b 就交换两者,保证结果非负;除法题先随机除数,再把被除数设成它的倍数,保证整除。
if (op == 3) { /* 除法: 保证能整除 */
b = rand() % 9 + 2; /* 除数取 2~10 */
a = b * (rand() % 9 + 1);
answer = a / b;
} else if (op == 1 && a < b) {
int t = a; a = b; b = t; /* 交换, 保证非负 */
answer = a - b;
}
第 4 步:判分与最终评价
读入玩家答案立刻判定:对了加分,错了公布正确答案。结束后按分数给出评语——这就是最简单的"评价系统"。
int user;
scanf("%d", &user);
if (user == answer) {
printf("回答正确! +10 分\n");
score += 10;
} else {
printf("答错啦, 正确答案是 %d。\n", answer);
}
第 5 步:完整代码与编译运行
把四步拼起来,就是完整的速算问答游戏:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i, a, b, op, answer, user, score = 0;
const int TOTAL = 10;
srand((unsigned)time(NULL));
printf("======== 数学速算问答 ========\n");
printf("共 %d 题, 每题 10 分, 加油!\n\n", TOTAL);
for (i = 1; i <= TOTAL; i++) {
op = rand() % 4; /* 0 加 1 减 2 乘 3 除 */
if (op == 3) { /* 除法保证整除 */
b = rand() % 9 + 2;
a = b * (rand() % 9 + 1);
answer = a / b;
} else {
a = rand() % 20 + 1;
b = rand() % 20 + 1;
if (op == 0) {
answer = a + b;
} else if (op == 1) {
if (a < b) { int t = a; a = b; b = t; }
answer = a - b;
} else {
answer = a * b;
}
}
switch (op) {
case 0: printf("第 %2d 题: %d + %d = ", i, a, b); break;
case 1: printf("第 %2d 题: %d - %d = ", i, a, b); break;
case 2: printf("第 %2d 题: %d × %d = ", i, a, b); break;
case 3: printf("第 %2d 题: %d ÷ %d = ", i, a, b); break;
}
scanf("%d", &user);
if (user == answer) {
printf("回答正确! +10 分\n");
score += 10;
} else {
printf("答错啦, 正确答案是 %d。\n", answer);
}
}
printf("\n==== 游戏结束 ====\n");
printf("你的得分: %d / %d\n", score, TOTAL * 10);
if (score >= 90) printf("评价: 心算大师!\n");
else if (score >= 60) printf("评价: 不错, 继续练习!\n");
else printf("评价: 别灰心, 多练几次!\n");
return 0;
}
编译运行:
gcc -o mathquiz mathquiz.c
./mathquiz
💡 改进方向:用 time(NULL) 计时,加入"限时答题"模式;设置难度分档;把答错的题存进数组,结束时集中重考;把最高分写进文件,做成排行榜。