本文面向C语言初学者,通过实现一个完整的猜数字游戏,带你掌握随机数生成、循环、条件判断等核心概念
在很多游戏中,随机元素让游戏更有趣、更具挑战性。比如:
int rand(void);rand() 不需要任何参数
#include <stdlib.h>
int num = rand();让我们实际测试一下rand函数,多次调用生成5个随机数:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("随机数测试:\n");
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}随机数测试:
1804289383
846930886
1681692777🔍(>﹏<) 发现问题:每次运行程序生成的"随机数"序列完全相同!
rand() 生成的是伪随机数
void srand(unsigned int seed); // 设置随机数种子seed 是随机数种子
time_t time(time_t* timer);#include <time.h>
time_t current_time = time(NULL); // 获取当前时间戳现实生活中不同地区存在时差,时间戳为计算机界提供了统一的时间标准,让全球的计算机系统能够基于同一时间参照进行运作,确保日志系统、文件时间戳、网络通信等不会因为时区差异而混乱。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
// 设置随机种子为当前时间
srand((unsigned int)time(NULL));
printf("真正的随机数:\n");
for(int i = 0; i < 5; i++)
{
printf("%d\n", rand());
}
return 0;
}需求 | 公式 | 示例 |
|---|---|---|
0~99 | rand() % 100 | rand() % 100 |
1~100 | rand() % 100 + 1 | rand() % 100 + 1 |
100~200 | 100 + rand() % 101 | 100 + rand() % 101 |
a~b | a + rand() % (b-a+1) | 10 + rand() % 21 (10~30) |
rand() % N 产生 0 到 N-1 的随机数
int random_number = (rand() % 100 + 1;#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int random_num = 0;
int guess = 0;
// 初始化随机数种子
srand((unsigned int)time(NULL));
// 生成1~100的随机数
random_num = rand() % 100 + 1;
printf("=== 猜数字游戏 ===\n");
printf("我已经想好了1-100之间的一个数字,请开始猜吧!\n\n");
while (1)
{
printf("请输入你猜的数字: ");
scanf("%d", &guess);
if (guess > random_num)
{
printf("太大了!再小一点试试\n\n");
}
else if (guess < random_num)
{
printf("太小了!再大一点试试\n\n");
}
else
{
printf("恭喜你!猜对了!\n");
break;
}
}
return 0;
}#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int random_num = 0;
int guess = 0;
int count = 0;
const int max_attempts = 5; // 最大尝试次数
// 初始化随机数种子
srand((unsigned int)time(NULL));
// 生成1~100的随机数
random_num = rand() % 100 + 1;
printf("=== 猜数字游戏 ===\n");
printf("数字范围:1-100\n");
printf("你有%d次机会!\n\n", max_attempts);
for (count = 1; count <= max_attempts; count++)
{
printf("第%d次尝试: ", count);
scanf("%d", &guess);
if (guess > random_num)
{
printf("太大了!");
}
else if (guess < random_num)
{
printf("太小了!");
}
else
{
printf("恭喜你!第%d次猜对了!\n", count);
break;
}
// 显示剩余次数
int remaining = max_attempts - count;
if (remaining > 0)
{
printf("还有%d次机会\n\n", remaining);
}
}
// 检查是否失败
if (count > max_attempts)
{
printf("\n很遗憾,机会用完了!\n");
printf正确答案是: %d\n", random_num);
}
return 0;
}#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 跨平台的头文件包含
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h> `
#endif
void delay(int);
void showLoadingBar();
void printWelcome();
int getDifficulty();
void showThinkingAnimation();
void giveHint(int, int, int, int);
void showVictoryAnimation(int);
void showDefeatAnimation();
int main()
{
// 显示欢迎信息和加载进度
printWelcome();
showLoadingBar();
// 选择难度
int max_attempts = getDifficulty();
// 显示思考动画
showThinkingAnimation();
// 游戏初始化
srand((unsigned int)time(NULL));
int target = rand() % 100 + 1;
int guess, attempts = 0;
printf("游戏开始!我已经想好了一个1~100之间的神秘数字 <( ̄︶ ̄)↗[GO!]\n");
printf("让我们看看你能不能猜中它! ψ(`▽′)ψ\n\n");
// 游戏主循环
while(attempts < max_attempts)
{
attempts++;
printf("第%d次猜测: ", attempts);
if(scanf("%d", &guess) != 1)
{
printf("(; ̄Д ̄) 请输入有效的数字!\n");
while(getchar() != '\n'); // 清空输入缓冲区
attempts--; // 不计算这次无效输入
continue;
}
// 检查输入范围
if(guess < 1 || guess > 100)
{
printf(" 请输入1~100之间的数字!\n\n");
attempts--;
continue;
}
// 判断猜测结果
if(guess == target)
{
showVictoryAnimation(attempts);
printf("第%d次猜中!数字就是 %d!\n", attempts, target);
// 根据表现给出评价
if(attempts == 1)
{
printf("(/≧▽≦)/ 一击必中!你是预言家吗?\n");
}
else if(attempts <= max_attempts / 3)
{
printf("q(≧▽≦q) 太厉害了!直觉很准!\n");
}
else if(attempts <= max_attempts * 2 / 3)
{
printf("(^_-)db(-_^) 表现不错!很有潜力!\n");
}
else
{
printf("( ̄▽ ̄)~* 险胜!但还是很棒!\n");
}
break;
}
else if(guess > target)
{
printf(" (;′Д`)太大了!");
giveHint(guess, target, attempts, max_attempts);
}
else
{
printf(" (⊙﹏⊙∥)太小了!");
giveHint(guess, target, attempts, max_attempts);
}
// 显示进度
int remaining = max_attempts - attempts;
if(remaining > 0)
{
printf("还有%d次机会 ヾ( ̄□ ̄)o\n\n", remaining);
}
}
// 游戏结束处理
if(guess != target)
{
showDefeatAnimation();
printf("正确答案是: %d\n", target);
// 根据接近程度给出安慰
int difference = abs(guess - target);
if(difference <= 5)
{
printf(" 只差一点点了!下次一定能行!o(*^▽^*)┛\n");
}
else if(difference <= 15)
{
printf("已经很接近了,继续努力!(~ ̄▽ ̄)~\n");
}
else
{
printf("不要气馁,再来一次!ヾ(°Д°`)o\n");
}
}
// 结束动画
printf("\n");
printf("感谢游玩");
fflush(stdout);
for(int i = 0; i < 3; i++)
{
delay(200);
printf(".");
fflush(stdout);
}
printf(" (*^▽^*)\n");
return 0;
}
// 跨平台的延迟函数
void delay(int milliseconds)
{
#ifdef _WIN32
Sleep(milliseconds);
#else
usleep(milliseconds * 1000);
#endif
}
void showLoadingBar()
{
printf("游戏初始化中");
fflush(stdout); // 刷新输出缓冲区
for(int i = 0; i < 3; i++)
{
delay(300); // 延迟300毫秒
printf(".");
fflush(stdout);
}
printf("\n");
printf("[");
// 进度条动画
for(int i = 0; i <= 50; i++)
{
printf("=");
fflush(stdout);
delay(50); // 延迟50毫秒
// 在特定进度显示提示信息
if(i == 10)
{
printf("] 生成随机数...\n[");
fflush(stdout);
}
else if(i == 30)
{
printf("] 设置游戏参数...\n[");
fflush(stdout);
}
}
printf("] 完成!\n\n");
}
// 显示欢迎信息
void printWelcome()
{
// 游戏界面加载动画
printf("界面初始化中 ");
fflush(stdout); // 刷新输出缓冲区
char spinner[] = "|/-\\";
for(int i = 0; i < 20; i++)
{
printf("\b%c", spinner[i % 4]); // \b 退格字符
fflush(stdout);
delay(100);
}
printf("\b[完成!]\n");
// 游戏界面
printf("=====================================\n");
printf("############ 猜数字游戏 #############\n");
printf("=====================================\n");
printf("游戏规则:\n");
printf("* 电脑生成 1~100 的随机数\n");
printf("* 你有多次机会猜中它\n");
printf("* 每次猜测后我会给你提示\n");
printf("=====================================\n\n");
}
// 选择难度
int getDifficulty()
{
int choice;
printf("请选择难度:(oˇvˇ)ノ\n");
printf("1. 简单模式 (8次机会) ( ̄▽ ̄)\n");
printf("2. 普通模式 (5次机会) ( ̄ω ̄;)\n");
printf("3. 困难模式 (3次机会) (;一_一)\n");
printf("4. 地狱模式 (1次机会) (╯°□°)╯\n");
printf("请选择(1-4): ");
scanf("%d", &choice);
switch(choice)
{
case 1:
printf("已选择简单模式 ( ̄▽ ̄)\n");
return 8;
case 2:
printf("已选择普通模式 ( ̄ω ̄;)\n");
return 5;
case 3:
printf("已选择困难模式 (;一_一)\n");
return 3;
case 4:
printf("已选择地狱模式 (╯°□°)╯\n");
return 1;
default:
printf("(X﹏X) 无效选择,使用普通模式\n");
return 5;
}
}
// 显示思考动画
void showThinkingAnimation()
{
printf("\n我正在想一个神秘数字");
fflush(stdout);
for(int i = 0; i < 5; i++)
{
delay(200);
printf(".");
fflush(stdout);
}
printf(" 想好了! ヾ(≧▽≦*)o\n\n");
}
// 给出智能提示
void giveHint(int guess, int target, int attempt, int max_attempts)
{
int difference = abs(guess - target);
if(attempt == 1 && difference > 40)
{
printf(" ╮( ╯-╰ ) ╭提示:和目标相差很远哦!\n");
}
else if(difference <= 3)
{
printf(" (☆▽☆) 超级接近!就差一点点了!\n");
}
else if(difference <= 8)
{
printf(" ╰(°▽°) ╯很接近了,继续加油!\n");
}
else if(difference <= 15)
{
printf(" <( ̄︶ ̄)ノ有点接近了!\n");
}
// 根据剩余机会给出策略提示
int remaining = max_attempts - attempt;
if(remaining == 1)
{
printf(" (っ °Д °;)っ最后一次机会了,要谨慎选择!\n");
}
else if(remaining <= 3)
{
printf(" ╮(╯_╰ ) ╭剩余机会不多了,好好思考!\n");
}
}
// 显示胜利动画
void showVictoryAnimation(int attempts)
{
printf("\n");
for(int i = 0; i < 3; i++)
{
printf("★");
fflush(stdout);
delay(200);
}
printf(" (〃 ̄︶ ̄)人( ̄︶ ̄〃) 恭喜你! ");
for(int i = 0; i < 3; i++)
{
printf("★");
fflush(stdout);
delay(200);
}
printf("\n");
}
// 显示失败动画
void showDefeatAnimation()
{
printf("\n");
for(int i = 0; i < 3; i++)
{
printf("@");
fflush(stdout);
delay(300);
}
printf(" /(ㄒoㄒ)/~~ 游戏结束! ");
for(int i = 0; i < 3; i++)
{
printf("@");
fflush(stdout);
delay(300);
}
printf("\n");
}srand((unsigned int)time(NULL)); // 用当前时间设置种子
int target = rand() % 100 + 1; // 生成1~100的随机数(◕‿◕✿) 重要提示:
srand()只需要在程序开始调用一次,多次调用反而会影响随机性
while(attempts < max_attempts)
{
// 1. 获取用户输入
// 2. 验证输入有效性
// 3. 判断大小关系
// 4. 给出反馈提示
// 5. 检查游戏结束条件
}if(scanf("%d", &guess) != 1) {
printf("(; ̄Д ̄) 请输入有效的数字!\n");
while(getchar() != '\n'); // 清空错误输入
continue;
}void showLoadingBar()
{
printf("加载中[");
for(int i = 0; i < 20; i++)
{
printf("#");
fflush(stdout); // 立即显示输出
delay(100); // 延迟100毫秒
}
printf("] 完成!\n");
}void segmentedLoadingBar()
{
printf("初始化系统");
delay(500);
printf("...[完成]\n");
printf("生成随机数");
delay(500);
printf("...[完成]\n");
printf("准备游戏界面");
delay(500);
printf("...[完成]\n");
}void dynamicLoadingBar()
{
char spinner[] = "|/-\\";
printf("处理中 ");
for(int i = 0; i < 20; i++)
{
printf("\b%c", spinner[i % 4]); // \b 退格字符
fflush(stdout);
delay(100);
}
printf("\b完成!\n");
}usleep(微秒)
Sleep(毫秒)
想要进一步提升?试试这些挑战:
根据猜测次数给予分数:
保存玩家的最佳成绩,显示历史记录。
让玩家可以选择数字范围。
一个玩家设置数字,另一个玩家来猜。
A: 忘记调用srand((unsigned int)time(NULL))来设置变化种子。ヽ(;▽;)ノ
A: 使用公式:最小值 + rand() % (最大值 - 最小值 + 1) (•̀ᴗ•́)و
A: 使用scanf()返回值检查输入是否成功,失败时清空输入缓冲区。
A: 在外层添加一个循环,询问玩家是否再来一局。
通过这个猜数字游戏,我们学会了:
(✓) 随机数生成:rand(), srand(), time()的配合使用
(✓) 循环结构:while循环控制游戏流程
(✓) 条件判断:if-else进行大小比较
(✓) 用户交互:输入输出和提示信息
(✓) 调试技巧:分段测试和错误处理
(✓) 用户体验:进度条和动画效果设计
(◕‿◕✿) 编程心法:从简单版本开始,逐步添加功能,每步都测试确保正确性。
这个项目虽然简单,但包含了完整程序的骨架。掌握了这些基础,你就能迈向更复杂的C语言项目了!
动手实践是学习编程的唯一捷径! 现在就开始编写你的第一个游戏吧! ヾ(≧▽≦*)o
如果有任何问题,欢迎在评论区留言讨论~ (´• ω •`)ノ