C语言初阶:简单的猜数游戏(12.11重置详解版)

一.猜数游戏的整体框架

 1.理解猜数游戏

        想要实现猜数游戏,我们先要建立正确的逻辑,可从结果入手,也就是说我们想要让玩家看到怎样的画面,从结果入手可以让我们对项目有大致的理解,以便后续构建程序。

2.猜数游戏的实现步骤

        a.第一步:打印菜单

        

void manu()
{
	printf("******************\n");
	printf("*** 输入1:START***\n");
	printf("*** 输入0:EXIT ***\n");
	printf("******************\n");
}

        首先,我们想让玩家选择是否进行游戏,这时候需要呈现选择菜单以便玩家选择。此时我们就需要考虑选择什么结构更加简便。

        b.第二步:游戏核心结构

        为了结构的简洁明了,这里选择将游戏主体内容写成函数。可以先声明函数,等将main函数大致框架构建完成后再实现函数的具体功能。

void game();

定义game()函数来实现游戏核心。

二.猜数游戏的具体结构

1.随机数rand和srand函数

        1.rand()函数

        猜数游戏要求给出要猜的数字的大概范围,这是我们就要用到rand()函数。当为int型时,随机数的范围为0~32767。但是要注意,rand()函数生成的并非是真正的随机数,而是伪随机数。rand生成随机数和种子有关,在一般情况下,种子默认为1,通俗来讲就是当种子为1时,rand每次生成的随机数都一样,而只有种子改变的情况下,随机数才会不断变化,这样就大大增加了程序的可玩性。

        2.利用srand()和时间戳改变种子

        

       srand()用来设置rand()产生随机数时的随机数种子(seed)。参数seed是整数,当改变seed值时,产生的伪随机数序列就会发生改变。使用srand()函数,改变seed数值,可以改变伪随机数的序列。每次要想生成不同的伪随机数序列,就要手动改变seed值,也不是很方便。所以,最好的办法是每次运行程序,seed值都可以自动改变。通常可以利用time(NULL)或getpid()的返回值作为seed。

        3.srand搭配time(NULL)改变种子

        我们主要介绍time(NULL),包含在头文件<time.h>。time(NULL)的返回值为当前时间的时间戳(以秒为单位),比如2023-8-2 17:19:04对应的时间戳数值为1690967944。所以每次运行时间不一样,通过srand()函数给rand()函数设定的seed的值也不一样,因此产生的随机数序列也就不一样了。time(NULL)获取的是时间戳值,所以与程序的进程无关,无论进程相同还是不同,只要调取函数的时间不一样,那么生成的seed值就不一样。

srand((unsigned)time(NULL));
        4.game()的定义
void game() //因为不需要函数返回值,用void定义
{
	int guess = 0;
	int sum = rand() % 100 + 1; //生成1-100的随机数
	while (1)
	{
		printf("请输入要猜的数字:");
		scanf("%d", &guess);
		if (guess < sum)
			printf("猜小了\n");
		else if (guess > sum)
			printf("猜大了\n");
		else 
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}
        5.主体main()函数
int main()
{
	int input = 0;
	srand((unsigned)time(NULL)); //改变种子,生成不同的伪随机数列
	do 
	{
		manu(); //打印菜单
		printf("请选择:");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game(); //玩家输入1游戏开始
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
			
	} while (input); //使用do-while循环使游戏多次运行
	return 0;
}

三.总结

        1.最终代码如下
#include <stdio.h>
#include <time.h>
void manu()
{
	printf("******************\n");
	printf("*** 输入1:START***\n");
	printf("*** 输入0:EXIT ***\n");
	printf("******************\n");
}
void game();
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do 
	{
		manu();
		printf("请选择:");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
			
	} while (input);
	return 0;
}

void game()
{
	int guess = 0;
	int sum = rand() % 100 + 1;
	while (1)
	{
		printf("请输入要猜的数字:");
		scanf("%d", &guess);
		if (guess < sum)
			printf("猜小了\n");
		else if (guess > sum)
			printf("猜大了\n");
		else 
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}
        2.改进

        为了增加游戏的趣味性,我们可以添加次数上限,对game函数进行小小的修改(以上限5次为例)。

void game()
{
	int guess = 0;
	int i = 5;
	int sum = rand() % 100 + 1;
	while (1)
	{
		printf("你一共有5次机会\n");
		printf("请输入要猜的数字:");
		scanf("%d", &guess);
		if (guess < sum)
			printf("猜小了\n");
		else if (guess > sum)
			printf("猜大了\n");
		else 
		{
			printf("恭喜你,猜对了\n");
			break;
		}
		i--;
		printf("你还有%d次机会\n", i);
		if (i == 0)
		{
			printf("很遗憾,你失败了\n");
			printf("正确的数是%d\n", sum);
			break;
		}
	}
}

本篇尚有许多不足,望各位同仁多多包涵。(完结)

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深情秋刀鱼@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值