猜数字游戏(C语言实现)

前言

在上一篇文章随机数的生成中,我们学习了rand,srand和time函数,那么这篇文章就让我们来尝试使用它们来写一个猜数字游戏,数字范围是 1 ~ 100
对随机数的生成以及相关函数还不熟悉的话,也可以点击下方文章链接再回顾一下:
C语言–随机数的生成——rand,srand,time函数
在这里插入图片描述

一、游戏设计分析

1.1 菜单页面

既然是一个游戏,那么我们可以先给它设计一个简单的菜单页面,使用函数包装起来,先放在主函数中:

void menu()
{
	printf("*************************\n");
	printf("******   0. exit   ******\n");
	printf("******   1. play   ******\n");
	printf("*************************\n");
}

1.2 建立框架

然后就可以创建变量input,使用switch语句,来根据菜单选择我们所想实现的操作:

  1. 如果input == 0,游戏结束;
  2. 如果input == 1,游戏开始;
  3. 如果输入的input既不是1也不是0,那么就说明输入错误,让玩家重新选择。
int main()
{
	int input = 0;
	menu();
	printf("请选择您的操作>\n");
	scanf("%d", &input);
	switch (input)
	{
	case 0:
		printf("游戏结束!\n");
		break;
	case 1:
		printf("游戏开始!\n");
		//游戏具体实现的函数game();
		break;
	default:
		printf("输入错误,请重新选择!\n");
		break;
	}
	return 0;
}

整个大的游戏架构设计好了,然后我们就可以设计游戏具体实现的函数,然后放在case 1语句后面

1.3 游戏具体实现

我们将游戏具体实现的代码分装在game函数中,放在主函数case 1语句中:

1.3.1 生成随机数

既然是猜测 1 ~ 100 之间生成的随机数,首先要生成随机数,那么就需要使用rand函数:
但是该函数生成的随机数是伪随机数,所以还要使用srandtime函数来不断改变rand函数的“种子”的数值。但是记得要分别包含头文件#include <stdlib.h>#include <time.h>
srand只需要执行一次,放在主函数中就行;
在game函数中,创建ret变量来接收rand函数生成的随机值。

void game()
{
	int ret = rand() % 100 + 1;
}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	menu();
	printf("请选择您的操作>\n");
	scanf("%d", &input);
	switch (input)
	{
	case 0:
		printf("游戏结束!\n");
		break;
	case 1:
		printf("游戏开始!\n");
		game();
		break;
	default:
		printf("输入错误,请重新选择!\n");
		break;
	}
	return 0;
}

1.3.2 随机数与猜测数比较

创建一个我们所输入的猜测数的变量guess,并与产生的随机数变量ret进行比较:

  1. 如果ret > guess ,说明我们的猜测数比随机数小;
  2. 如果ret < guess ,说明我们的猜测数比随机数大;
  3. 如果ret = guess, 说明我们猜对了。

我们的运气可能没有那么好,有可能一次猜不对,需要猜多次。那么就可以使用while函数进行死循环,如果没有猜中就一直猜,当猜中了就可以使用break语句来跳出循环,游戏就结束了。

void game()
{
	int ret = rand() % 100 + 1;
	int guess = 0;
	while (1)
	{
		printf("请猜测该随机数:\n");
		scanf("%d", &guess);
		if (ret > guess)
		{
			printf("猜小了!");
		}
		else if (ret < guess)
		{
			printf("猜大了!\n");
		}
		else
		{
			printf("恭喜你,猜中了!\n");
			break;
		}
	}
}

当然也可以优化一下,比如我们可以创建一个变量count,来表示猜数字的次数限制,每猜一次,机会就会少一次,count–,当机会使用完后就视为游戏失败,公布随机数的答案。

void game()
{
	int ret = rand() % 100 + 1;
	int guess = 0;
	int count = 0;
	printf("请输入您想使用的机会次数:\n");
	scanf("%d", &count);
	while (count)
	{
		printf("请猜测该随机数:\n");
		scanf("%d", &guess);
		if (ret > guess)
		{
			printf("猜小了!");
		}
		else if (ret < guess)
		{
			printf("猜大了!\n");
		}
		else
		{
			printf("恭喜你,猜中了!\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("游戏失败,随机数是:%d\n", ret);
	}
}

1.3.3 不过瘾,再来亿把!

当我们玩完一把后,有可能意犹未尽,还想接着玩,那么就需要将主函数中游戏框架作为循环语句,使用do-while循环。
为什么使用do-while循环?因为是先玩一把,然后再决定要不要继续玩。

  1. 如果不想玩了,input就可以输入0,循环结束,游戏结束;
  2. 如果还想继续玩,input既有可以接着输入1,循环一次,游戏再执行一遍;当玩完之后再进行选择。
  3. 如果输入非1非0,说明输入错误,重新选择。
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择您的操作>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("游戏结束!\n");
			break;
		case 1:
			printf("游戏开始!\n");
			game();
			break;
		default:
			printf("输入错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

二、完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void menu()
{
	printf("*************************\n");
	printf("******   0. exit   ******\n");
	printf("******   1. play   ******\n");
	printf("*************************\n");
}

void game()
{
	int ret = rand() % 100 + 1;
	int guess = 0;
	int count = 0;
	printf("请输入您想使用的机会次数:\n");
	scanf("%d", &count);
	while (count)
	{
		printf("请猜测该随机数:\n");
		scanf("%d", &guess);
		if (ret > guess)
		{
			printf("猜小了!");
		}
		else if (ret < guess)
		{
			printf("猜大了!\n");
		}
		else
		{
			printf("恭喜你,猜中了!\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("游戏失败,随机数是:%d\n", ret);
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择您的操作>\n");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("游戏结束!\n");
			break;
		case 1:
			printf("游戏开始!\n");
			game();
			break;
		default:
			printf("输入错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

结语:到这里我们的猜数字游戏(C语言实现)就学习结束了,本人才疏学浅,本文有错误和有待改进的地方欢迎大家批评和指正,感谢您的阅读!如果本文对您有帮助,可以高台贵手点点赞和关注哦!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值