学完 C 语言的基础语法,很多人会陷入"什么都会、却什么都不会做"的尴尬。破解方法只有一个:动手做小项目。本文的猜数字是入门游戏里最经典的一个——程序随机想一个数,你在终端里猜,它告诉你"太大"还是"太小"。它把随机数、输入、判断、循环这几块基础知识全部串了起来,全程不到 40 行代码。

玩法介绍

程序在 1~100 之间随机挑一个"秘密数字"。你每次输入一个猜测,程序提示"太大了"或"太小了",直到猜中为止,最后公布你一共用了多少次。规则虽然简单,但"程序与用户交互"的完整流程都在里面,是练习 scanf 与循环的最佳入口。

第 1 步:搭好骨架,播下随机种子

新建 guess.c,先引入三个头文件:stdio.h 负责输入输出,stdlib.h 提供 rand(),time.h 提供当前时间。关键是 srand():它给随机数生成器"播种"。如果不播种,每次运行程序生成的"随机数"其实一模一样;用当前时间做种子,才能保证每次运行都不同。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand((unsigned)time(NULL));   /* 用当前时间做随机种子 */
    return 0;
}

第 2 步:生成 1~100 的秘密数字

rand() 返回 0 到 RAND_MAX 之间的整数。rand() % 100 把它压缩到 0~99,再加 1 就得到 1~100。调试阶段可以先把它打印出来,确认随机数真的在变化;正式玩的时候再删掉这行。

int secret = rand() % 100 + 1;   /* 1~100 的秘密数字 */
printf("调试: 秘密数字是 %d\n", secret);

第 3 步:读入猜测,判断大小

scanf("%d", &guess) 读入玩家输入,注意变量前的 & 是取地址符,scanf 必须靠它才能把值写进变量。随后用 if / else if 比较大小、给出提示。

int guess;
printf("请输入你的猜测: ");
scanf("%d", &guess);

if (guess > secret) {
    printf("太大了! 再小一点。\n");
} else if (guess < secret) {
    printf("太小了! 再大一点。\n");
}

第 4 步:循环直到猜中,顺便计数

猜一次肯定不够。用 do...while 把"读入 → 判断"包起来:do 保证至少执行一次,while (guess != secret) 表示没猜中就继续。再用计数器 count 统计次数,猜中后连同答案一起输出。

int count = 0;
do {
    printf("请输入你的猜测: ");
    scanf("%d", &guess);
    count++;
    /* ...第 3 步的判断代码... */
} while (guess != secret);

printf("恭喜! 你用了 %d 次猜中, 答案是 %d。\n", count, secret);

第 5 步:完整代码与编译运行

把上面的零件拼起来,就是完整可运行的程序:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    int secret, guess, count = 0;

    srand((unsigned)time(NULL));
    secret = rand() % 100 + 1;

    printf("我已经想好了一个 1~100 之间的数字, 快来猜!\n");

    do {
        printf("请输入你的猜测: ");
        scanf("%d", &guess);
        count++;

        if (guess > secret) {
            printf("太大了! 再小一点。\n");
        } else if (guess < secret) {
            printf("太小了! 再大一点。\n");
        }
    } while (guess != secret);

    printf("恭喜! 你用了 %d 次就猜中了, 答案是 %d。\n", count, secret);
    return 0;
}

在终端里编译运行,就能开始游戏了:

gcc -o guess guess.c
./guess
💡 改进方向:给游戏加上"次数上限",超过就算输;按难度切换范围(猜 1~1000 更刺激);把猜过的数字存进数组,猜重复数字时给出提醒;甚至可以反过来——让电脑用二分法猜你心里想的数。