猜数字只能练"比较",这一篇我们做一个真正会随机出题的小游戏:数学速算问答。程序自动生成加减乘除四则运算,你口算作答、答对加分,最后给出总分和评价。

玩法介绍

游戏共 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 除),ab 是操作数。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) 计时,加入"限时答题"模式;设置难度分档;把答错的题存进数组,结束时集中重考;把最高分写进文件,做成排行榜。