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

相关推荐
月光技术杂谈1 小时前
实战:C驱动框架嵌入Rust模块的互操作机制与完整流程
c语言·开发语言·rust·ffi·跨语言·bindgen·互操作
合作小小程序员小小店2 小时前
游戏开发,桌面%小游戏,贪吃蛇%demo,基于vs2022,c语言,easyX,无数据库
c语言·开发语言
AA陈超2 小时前
从0开始学习 **Lyra Starter Game** 项目
c++·笔记·学习·游戏·ue5·lyra
q***T5833 小时前
C++在游戏中的Unreal Engine
c++·游戏·虚幻
WongKyunban6 小时前
Linux中的线程是什么?
c语言
LaoZhangGong1237 小时前
以太网HTTP数据包格式分析
c语言·stm32·网络协议·http·tcp·arp
lingggggaaaa8 小时前
免杀对抗——C2远控篇&PowerShell&有无文件落地&C#参数调用&绕AMSI&ETW&去混淆特征
c语言·开发语言·笔记·学习·安全·microsoft·c#
口袋物联8 小时前
设计模式之建造者模式在 C 语言中的应用(含 Linux 内核实例)
c语言·设计模式·建造者模式
切糕师学AI9 小时前
位带操作(Bit-Banding)是什么?
c语言·arm·嵌入式开发·cortex-m·位带操作