嵌入式 C 语言猜大小游戏设计与实现

前言

在嵌入式系统开发中,基础编程能力的夯实与趣味实践的结合,是提升开发效率与学习积极性的关键。猜大小游戏作为经典的互动类程序,不仅涵盖了 C 语言核心语法的应用,更融合了随机数生成、用户交互、逻辑判断等嵌入式开发中高频使用的技术点。本次实践以 "最小可行产品" 为设计理念,从 V1.0 能跑版入手,基于time()时间戳实现随机数种子初始化,借助srand()rand()函数构建伪随机数生成机制,最终完成一款逻辑清晰、交互简洁的猜大小游戏。通过本项目的开发,可深入理解伪随机数在嵌入式场景中的应用原理,熟练掌握输入输出处理、条件判断等基础编程技能,为后续更复杂的嵌入式应用开发奠定坚实基础。

能跑版

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

void menu();
void game();
void mode_handle();

int main() 
{
	srand((unsigned int)time(NULL));  // 设置随机数种子
	
	while ( 1 ) {
		menu();
		mode_handle();
	}

	return 0;
}

// 显示菜单
void menu() 
{
	
	printf("+---------------+\n");
	printf(" Guess (1 ~ 100)\n");
	printf("[p] 开玩\n");
	printf("[Q] 退出 \n");
	printf("+---------------+\n");
}

// 模式处理
void mode_handle() 
{
	int key = 0;
	
	printf("请选择>:");
	key = getch();
	printf("\n");
	
	switch (key) {
	case 'p':
		game();  // 开始游戏
		break;
	case 'q':
		printf("Bye Bye!\n");
		break;
	default:
		printf("输入有误!\n");
		break;
	}
}


// 猜大小游戏
void game() 
{
	int random_num = rand() % 100 + 1;  // 生成 1 到 100 之间的随机数
	int input = 0;
	
	while (1) {
		printf("Guess Guess>: ");
		scanf("%d", &input);
		if (input > random_num) {
			printf("// ----猜大了!---- //\n");
		} else if (input < random_num) {
			printf("// ----猜小了!---- //\n");
		} else {
			system("cls");
			printf("   ^_^ 有脑子!  \n");
			break;  // 猜对后跳出循环
		}
	}
}

time() 时间戳

复制代码
time_t time(time_t *timer);

// @timer
NULL: 返回自 1970 年 1 月 1 日 00:00:00 UTC(协调世界时)以来经过的秒数,
      通常被称为时间戳。

不为NULL:将当前时间存储在这个指针所指向的内存位置;

// @返回值
time_t类型的值,表示自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数。

使用示例:

复制代码
#include <stdio.h>
#include <time.h>

int main() 
{
    time_t cur_sec;	// 当前秒数
    
    cur_sec = time(NULL);
    printf("当前时间戳:%ld\n", currentTime);
    
    return 0;
}

srand() / rand()

复制代码
// randomly
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() 
{
	//设置伪随机数生成器的种子
	srand((unsigned int)time(NULL));
	
	for (int i = 0; i < 5; i++) {
		printf("%d ", rand() % 100);
	}
	printf("\n");
	return 0;
}

// srand
void srand(unsigned int seed);

// @seed
这个值将决定随机数生成器的起始状态,不同的种子会产生不同的随机数序列。

如果不调用srand()设置种子,
每次运行程序时,rand()函数生成的随机数序列将是相同的。

通过调用srand(设置不同的种子),可以使得每次程序运行时生成不同的随机数序列,增加随机性。

// rand
int rand(void);

// @返回值
返回一个伪随机整数。

所谓伪随机,是指在给定相同的种子(通过srand函数设置)的情况下,
            每次调用rand()都会生成相同的随机数序列。
            
通常在使用rand()之前,
    会先调用srand()函数设置随机数生成器的种子,
    以确保每次运行程序时生成不同的随机数序列;

结尾

本次嵌入式 C 语言猜大小游戏 V1.0 版本的设计与实现,成功将基础语法知识与实际应用场景相结合,完成了从随机数生成到用户交互的全流程开发。项目通过time()函数获取系统时间戳作为种子,确保了每次程序运行时随机数序列的唯一性,再经srand()rand()函数的协同工作,实现了游戏核心的随机数生成功能,最终达成了 "能跑、好用" 的核心目标。

通过本次实践,不仅巩固了嵌入式 C 语言的基础语法应用,更深入理解了伪随机数的生成原理及在嵌入式开发中的实践要点。后续可基于该版本进行功能扩展,例如增加游戏难度分级、积分统计、历史记录查询等功能,进一步提升程序的交互性与实用性。本项目的开发过程充分体现了 "从简到繁、逐步迭代" 的嵌入式开发思路,为后续更复杂的嵌入式应用开发提供了可参考的实践范式。

相关推荐
番茄灭世神2 小时前
汇顶模拟前端GH3220使用备忘录
c语言·单片机·传感器·模拟芯片·电生理信号处理
码流怪侠5 小时前
Sunshine 深度拆解:当 NVIDIA GameStream 闭源后,如何用 4 万颗 Star 重建自托管云游戏
游戏·github·nvidia
RoboWizard5 小时前
游戏电脑不装固态硬盘会怎么样?
游戏·电脑
Brilliantwxx5 小时前
【STM32 】把 printf 搬到串口上 —— C 标准 IO 函数重定向与多文件工程搭建(实战串口电灯)
c语言·开发语言·stm32·单片机·嵌入式硬件·架构·ecmascript
wuminyu5 小时前
Kafka利用sendfile与Page Cache实现高性能传输剖析
java·linux·c语言·jvm·c++
亮_一个嵌入式新手6 小时前
C语言Day21
c语言·开发语言
驱动小百科7 小时前
英伟达GeForce Game Ready 616.92驱动发布:支持《007 First Light》等游戏
人工智能·游戏·英伟达616.92驱动·geforce game·nvidia显卡驱动
职场的momo9 小时前
用户讨论:算法开发Offer决赛:大疆纯后端Agent与网易游戏测试,对内AI跳槽难?
人工智能·游戏·跳槽
djarmy15 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
李永奉16 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑