猜数字游戏实现(详解)

目录

前言

一、打印游戏菜单

二、循环条件补充

三、实现猜数字

                1、生成随机数

                2、猜数字

四、源码


前言

        学了这么久的C语言,目前就可以通过我们曾经所学的知识来写一个猜数字游戏。怎么实现的呢?跟着我的脚步往下看吧!

思路:

一、打印游戏菜单

为了可以让游戏反复玩,则需要菜单来提醒玩家是否继续或退出,那么该如何实现菜单呢?让我们看看下面的代码(部分)。

#include <stdio.h>
void menu()
{
	printf("*************************\n");
	printf("******   1.play  ********\n");
	printf("******   0.exit  ********\n");
	printf("*************************\n");
}
int main()
{
	int input = 0; 
	do
	{
		//打印菜单
		menu();
		printf("请选择(1/0):");
		//输入
		scanf("%d", &input);
	} while();
}

        代码详解:想反复玩游戏,肯定需要循环,这里我们采用do while循环。接下来打印菜单,这非常简单,不就是几行代码打印吗,所以我们封装一个函数menu(菜单的意思),它不需要返回任何值所以是void类型。这里需要注意一下,input是一个变量,所以前面要加取地址符号,到目前为止,只有数组名前不需要加取地址符。 

二、循环条件补充

#include <stdio.h>
void menu()
{
	printf("*************************\n");
	printf("******   1.play  ********\n");
	printf("******   0.exit  ********\n");
	printf("*************************\n");
}
int main()
{
	int input = 0; 
	do
	{
		//打印菜单
		menu();
		printf("请选择(1/0):");
		//输入
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("猜数字\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

}

        代码详解:这里可以输入任何值,输入“1”开始游戏,输入“0”则退出游戏,但万一玩家不小心输入其他值时,我们是不是要提醒玩家“输入错误,重新选择”,这时switch语句就派上用场了。最后循环条件是input,大家想想,假如input为“0”,判断为假,则结束循环,这不就和退出游戏相互匹配上了。0为假,非0为真。

        最后我们调试来看看结果,这里不要一直写下去,写一步要看看结果是否符合预期,不然写到最后出现n条错误,那就尴尬了。(显然下面结果是符合我们预期的)

 三、实现猜数字

#include <stdio.h>
void menu()
{
	printf("*************************\n");
	printf("******   1.play  ********\n");
	printf("******   0.exit  ********\n");
	printf("*************************\n");
}

void game()
{

}

int main()
{
	int input = 0; 
	do
	{
		//打印菜单
		menu();
		printf("请选择(1/0):");
		//输入
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

}

        代码详解:这里我们需要把case 1中的printf换成game函数(是猜数字的整个路基),这里game函数也不需要返回任何值,所以还是void类型。

1、生成随机数

#include <stdio.h>
#include <stdlib.h>
void menu()
{
	printf("*************************\n");
	printf("******   1.play  ********\n");
	printf("******   0.exit  ********\n");
	printf("*************************\n");
}

void game()
{
	//生成随机数
	int ret = rand();
	printf("%d\n", ret);
}

int main()
{
	int input = 0; 
	do
	{
		//打印菜单
		menu();
		printf("请选择(1/0):");
		//输入
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

}

        代码详解:C语言中有个rand函数,是专门用来生成随机数的。可以通过后面的网站来加深对rand函数的了解(https://legacy.cplusplus.com/reference/cstdlib/rand/?kw=rand),这里我简单的解释一下,rand函数返回的是0~RAND_MAX(它的值是32767)之间的一个随机数,同时还需要引用头文件<stdlib.h>

程序运行结果:

         上面是我两次运行的结果,大家有没有发现,我第一次运行的生成数据和第二次一模一样,如果这是一款游戏,两次数据都一样,那还有啥可玩的。

        那么问题肯定出现在rand函数上。其实使用rand之前还需要调用另外一个函数srand来设置随机数的生成器。(https://legacy.cplusplus.com/reference/cstdlib/srand/

 它需要接收一个整数值。

下面是加入函数srand代码:

#include <stdio.h>
#include <stdlib.h>
void menu()
{
	printf("*************************\n");
	printf("******   1.play  ********\n");
	printf("******   0.exit  ********\n");
	printf("*************************\n");
}

void game()
{
	srand(0); //假设接收的整数是0
	//生成随机数
	int ret = rand();
	printf("%d\n", ret);
}

int main()
{
	int input = 0; 
	do
	{
		//打印菜单
		menu();
		printf("请选择(1/0):");
		//输入
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

}

 接下来我们Ctrl + F5看看运行结果:

         有没有发现还是出问题了,每次猜数字的数字都是一样的,这猜起来还是没有什么意义。有没有可能把srand接收的整数值换一下,值就变了呢?让我们来实践一下。

         值果然变了,所以我们需要接收一个可以变化的值,那怎么换呢?有没有发现,在我们电脑上,时间一直都在发生变化,所以我们能不能接收时间的某一个值?这里给大家引入一个词叫时间戳。这是时间戳转换工具网址https://tool.lu/timestamp/

        所以我们可以把时间戳传给srand函数,那怎么传时间戳呢?在C语言中,time函数会返回时间戳。(https://legacy.cplusplus.com/reference/ctime/time/?kw=time

time函数会返回time_t,其实就是返回一个整型(知道就行了),而后面的参数是一个指针。同样地,它还需要包含一个头文件<time.h>。

接下来我们来看看代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("*************************\n");
	printf("******   1.play  ********\n");
	printf("******   0.exit  ********\n");
	printf("*************************\n");
}

void game()
{
	srand((unsigned int)time(NULL)); 
	//生成随机数
	int ret = rand();
	printf("%d\n", ret);
}

int main()
{
	int input = 0; 
	do
	{
		//打印菜单
		menu();
		printf("请选择(1/0):");
		//输入
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

}

        代码详解:首先我在time函数前加了unsigned int是因为time函数会返回一个整型,我把它强制转换类型了,而NULL是空指针,它的值是0。(目前就知道这么多就行了)

运行结果:

         那么问题又来了,这些随机数之间相邻太近了,这说明还不够随机,在这里,我想说的是函数srand在程序中只要调用一次就行,不需要频繁调用,所以我们只需要放到main函数中,因为我们知道,main是程序的入口且只会执行一次。

来看看改之后的结果:

         你以为到这就结束了吗?其实并没有,回过头来看,这些随机数的值是不是太大了,而题目要求是1~100之间啊,那我们应该怎么做呢?先看看下面的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("*************************\n");
	printf("******   1.play  ********\n");
	printf("******   0.exit  ********\n");
	printf("*************************\n");
}

void game()
{
	//生成随机数
	int ret = rand()%100+1;
	printf("%d\n", ret);
}

int main()
{
	int input = 0; 
	srand((unsigned int)time(NULL));
	do
	{
		//打印菜单
		menu();
		printf("请选择(1/0):");
		//输入
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

}

        代码解析:为什么要在rand后面%100+1呢?原因是:任何一个数字,只要%100,它的结果取值范围就是0~99 ,而现在要生成1~100的数字,所以再+1,它的取值范围就变成了1~100了。

运行结果:

2、猜数字 

 部分代码如下:

void game()
{
	int num = 0;
	//生成随机数
	int ret = rand() % 100 + 1;
	//printf("%d\n", ret);
	//猜数字(循环)
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &num);
		//判断
		if (num < ret)
		{
			printf("猜小了\n");
		}
		else if (num > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;//直到猜对跳出循环
		}
	}
}

        看到这,读者们大概理解了思路了吧。最后我再优化一个效果(在源码里),就是猜对数字后有一个清屏的效果,这里我用到了system,想了解其用法可以来到我这篇博客(https://blog.csdn.net/Weraphael/article/details/127750890

四、源码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("*************************\n");
	printf("******   1.play  ********\n");
	printf("******   0.exit  ********\n");
	printf("*************************\n");
}

void game()
{
	int num = 0;
	//生成随机数
	int ret = rand()%100+1;
	//猜数字(循环)
	while (1) 
	{
		printf("请猜数字:");
		scanf("%d", &num);
		//判断
		if (num < ret)
			printf("猜小了\n");
		else if (num > ret)
			printf("猜大了\n");
		else
		{
			printf("恭喜你,猜对了\n");
			break;//直到猜对跳出循环
		}
	}
}

int main()
{
	int input = 0; 
	srand((unsigned int)time(NULL));
	do
	{
		//打印菜单
		menu();
		printf("请选择(1/0):");
		//输入
		scanf("%d", &input);
        system("cls");
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);

}

 感兴趣的小伙伴可以玩玩哦!

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值