最简单、最经典的C语言游戏程序,非 猜数字 莫属,它几乎只用到了C语言最基础的语法,但包含了游戏的核心要素:输入、判断、反馈和循环。

(图片来源网络,侵删)
下面我将为你提供一个非常详细的“猜数字”游戏程序,并逐步解释每一行代码的含义。
最简单的C语言游戏:猜数字
这个游戏的目标是:程序随机生成一个1到100之间的数字,然后玩家通过输入数字来猜测,程序会提示玩家猜的数字是“太大”、“太小”还是“猜对了”。
完整代码
#include <stdio.h> // 标准输入输出库,用于 printf 和 scanf
#include <stdlib.h> // 标准库,用于 rand 和 srand
#include <time.h> // 时间库,用于 time
int main() {
int secretNumber; // 用来存储程序随机生成的秘密数字
int guess; // 用来存储玩家猜测的数字
int tries = 0; // 记录玩家猜测的次数
// 1. 初始化随机数种子
// 如果不设置种子,每次运行程序时 rand() 生成的随机数序列都是一样的
// time(NULL) 返回当前时间,作为种子,确保每次运行结果都不同
srand(time(NULL));
// 2. 生成一个1到100之间的随机数
// rand() % 100 会生成一个 0 到 99 的数
// +1 之后,范围就变成了 1 到 100
secretNumber = rand() % 100 + 1;
// 3. 游戏主循环
printf("欢迎来到猜数字游戏!我已经想好了一个1到100之间的数字,\n");
// 使用 while(1) 创建一个无限循环,直到玩家猜对才会用 break 退出
while (1) {
printf("请输入你的猜测: ");
// 4. 获取玩家输入
// scanf("%d", &guess) 会读取用户输入的一个整数,并存储在 guess 变量中
scanf("%d", &guess);
// 5. 增加猜测次数
tries++;
// 6. 判断玩家的猜测
if (guess > secretNumber) {
printf("太大了!\n");
} else if (guess < secretNumber) {
printf("太小了!\n");
} else {
// 如果既不大也不小,那就猜对了
printf("恭喜你!猜对了!\n");
printf("你一共猜了 %d 次,\n", tries);
// 7. 猜对后,用 break 退出循环,游戏结束
break;
}
}
return 0; // 程序正常结束
}
如何运行这个程序
- 保存代码:将上面的代码复制并粘贴到一个文本编辑器中,保存为
guess_game.c。 - 编译代码:打开你的终端(Windows上是CMD或PowerShell,macOS或Linux上是Terminal),进入到你保存文件的目录,然后输入以下命令进行编译:
gcc guess_game.c -o guess_game
gcc是C语言的编译器。guess_game.c是你的源文件名。-o guess_game指定输出的可执行文件名为guess_game。
- 运行程序:编译成功后,在同一目录下运行生成的程序:
- 在 Windows 上:
guess_game.exe
- 在 macOS 或 Linux 上:
./guess_game
- 在 Windows 上:
代码逐行详解
-
#include <stdio.h>- 这是一个“预处理器指令”,告诉编译器在编译前要包含
stdio.h文件。 stdio.h是“标准输入输出头文件”,里面定义了我们程序中用到的printf(打印信息到屏幕)和scanf(从键盘读取输入)等函数。
- 这是一个“预处理器指令”,告诉编译器在编译前要包含
-
#include <stdlib.h>
(图片来源网络,侵删)- 包含
stdlib.h文件,因为它提供了rand(生成随机数)和srand(设置随机数种子)函数。
- 包含
-
#include <time.h>- 包含
time.h文件,因为它提供了time函数,用来获取当前时间。
- 包含
-
int main() { ... }这是所有C程序的入口点,程序执行时,会从这里开始。
-
srand(time(NULL));
(图片来源网络,侵删)- 这是让游戏每次都不同的关键!
rand()函数本身并不是真正的随机,它是一个“伪随机数生成器”,如果没有给它一个初始的“种子”,它每次生成的数字序列都是固定的。time(NULL)会返回从1970年1月1日到现在经过的秒数,这个数是时刻变化的。srand()就用这个变化的秒数作为种子,确保rand()每次运行时都能产生不同的随机数序列。
-
secretNumber = rand() % 100 + 1;rand():生成一个很大的随机整数。rand() % 100:取这个随机数除以100的余数,结果的范围是0到99。+ 1:将结果的范围调整为1到100,这个数字就被赋值给了secretNumber。
-
while(1) { ... }- 这是一个无限循环,循环体 里的代码会一直重复执行,直到遇到
break语句才会退出,这非常适合游戏的主逻辑。
- 这是一个无限循环,循环体 里的代码会一直重复执行,直到遇到
-
scanf("%d", &guess);- 从标准输入(也就是键盘)读取一个整数。
%d是一个格式说明符,表示要读取一个十进制整数。&guess是变量guess的内存地址。scanf需要知道把读到的数字存放在哪里,所以需要地址。
-
if-else if-else- 这是条件判断语句。
guess > secretNumber,打印“太大了!”。- 否则如果
guess < secretNumber,打印“太小了!”。 - 如果以上两个条件都不满足(说明
guess等于secretNumber),就执行else部分,打印恭喜信息,并用break退出while循环,游戏结束。
如何让它变得更“好玩”一点?
你可以在这个简单的基础上进行扩展,
-
限制猜测次数:增加一个
max_tries变量,当tries超过max_tries时,游戏失败。int max_tries = 7; // 在循环里判断 if (tries >= max_tries) { printf("很遗憾,你没有在 %d 次内猜中,游戏结束!\n", max_tries); break; } -
增加难度选择:让玩家选择数字的范围(比如1到1000)。
int max_range; printf("请选择游戏难度(输入数字范围上限,例如100或1000): "); scanf("%d", &max_range); secretNumber = rand() % max_range + 1; -
增加“再来一局”功能:在游戏结束后,询问玩家是否想再玩一次。
char play_again; printf("想再玩一局吗?(y/n): "); scanf(" %c", &play_again); // 注意 %c 前面的空格,它会跳过之前输入留下的换行符 if (play_again == 'y' || play_again == 'Y') { // 重置游戏状态,tries = 0,然后重新生成 secretNumber // 然后继续主循环 } else { printf("游戏结束,再见!\n"); break; }
希望这个最简单的游戏程序能帮助你开启C语言游戏编程的大门!
