在经过初阶段c语言的学习,我们可以利用代码写一些简单的小游戏,就比如说猜数字,猜数字这个游戏中,我们只需要用一些函数,循环,分支语句,便可实现。

我们首先假定进入到小游戏的界面

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

这里我们写一个菜单函数,到时候只需要引用就好了。

之后我们可以输入0或1来选择开始或者退出游戏,这里我们用switch语句来进行,switch本身是个分支语句,所以我们可以用case :1或者0来表示分支

int n = 0;
scanf("%d",&n);

switch (n)
		{
		case 1:
			fun();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}

当我们输入一个数字,1则进入case 1中,这里注意,我们既然选择了开始游戏,这个游戏就要开始运行,所以我们需要在case 1中写出这个游戏的主要执行代码,可是,在这里全写的话,明显不会很美观,所以我们在此处用fun()函数来表示主要功能。而当我们输入0或者其他数字则就会进入case 0或者default语句,这里每个分支语句我们都加了break,如果不加的话可能会俩俩语句或者三条语句一起执行,因为没有东西将case1和case 0和default隔离起来.如果我们输入1想玩一把之后再来一把,我们可以将这个分支语句加入循环当中,很明显,我们运行要先打印出菜单函数,所以我们这里使用do while语句。

int n = 0;
	do
	{
		menu();
		printf("输入数字\n");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			fun();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (n);

现在我们正式开始游戏,首先电脑会生成一个随机数字给我们,当然,以现阶段来说我们还没有学习这样的代码,生成随机数算是这个代码里较难理解的点,我们可以使用ranf()函数,它是无返回类型crt语句生成器,我们在cplusplus中可以找到

它生成的数字最大是但是我们不能直接使用这个函数,我们如果直接使用这个函数crt语句生成器,在第一次运行和第2次运行后,你会发现俩次运行产生的随机数是一样的,我们把这个函数用错了。在使用它前,我们还需要先调用srand函数,srand是一个叫做初始化随机数的生成器srand()括号里如果是一个数字rand生成的随机数就会一直是第一次所产生的值。所以我们需要往括号里加一个随机数字,可是,总不能写成srand(rand),这样的表达式吧。

这是我们需要再了解一个叫做时间戳的概念。我们可以上网搜一下。

任何时间可以转换成一个数字,这样的数字我们可以叫做时间戳。数字就是当前时间和1970年1月1日的差值,时间戳在代码中可以使用time函数表示,它会返回一个时间戳。

time的返回类型是time_t但是srand里的返回类型是int,这里其实本质上都是整型,所以可以使用,或者可以使用类型强制转换srand((unsigned int)time(NULL));这样写time中需要指针形参,但我们没有,可以采用空指针NULL来表示,但这条语句不可以频繁的调用,因为在括号time里的返回的是时间戳,当俩次快速点击时,生成的随机数会一样,或者玩完一次很快又想玩了,俩个谁技术会给的差距非常小,这就是srand中括号的时间戳决定rand起点的原因,当连续俩次快速进行游戏的话,它们的起点会一致或者接近,导致数字的随机性不行,我们可以将其放在主函数的循环外。并且由于rand的给的随机数范围过大是0~32767所以运气不好的可能会试上很多次,我们可以将其进一步的缩小范围。int ret = rand() % 100 + 1;这样就将范围限制在了0~100.

如果输入的数字和随机数比小,我们可以打印出猜小了然后进行输入数字,这里切记不要把rand生成的随机数放在判断大小的循环里,只能说,一个人想写bug他是拦不住的。因为当我们进入判断循环后,rand在这个循环中生成随机数,循环一次生成一次随机数,除非运气极好,不然很有可能根本猜不到这个数字。time函数调用time头文件,rand和srand调用stdlib头文件。

下列代码就是实现部分。

#define _CRT_SECURE_NO_WARNINGS 0
//猜数字
#include
#include
#include 
void fun()
{
	printf("开始游戏:\n");
	int ret = rand() % 100 + 1;
	while (1)
	{
		int m = 0;
		scanf("%d", &m);
		if (m < ret)
		{
			printf("猜小了\n");
		}
		if (m > ret)
		{
			printf("猜大了\n");
		}
		if (m == ret)
		{
			printf("正确\n");
			break;
		}
	}
}
void menu()
{
	printf("****************************\n");
	printf("******1->play***0->exit*****\n");
	printf("****************************\n");
}
int main()
{
	int n = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("输入数字\n");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			fun();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (n);
	return 0;
}