刚学编程面对着黑框框的界面,面对做不完的编程题,是不是觉得枯燥无味,你敲得每一个代码都有用,都在给自己打好基础,建一栋高楼大厦,最开始就要耐心打好地基,今天来点有趣的,让我们来用c语言基础知识实现一个猜数字小游戏吧~

猜数字游戏

  • 猜数字游戏思路↓↓
    • 猜数字游戏实现思路
      • 猜数字游戏要用到的知识点
  • 猜数字游戏整体实现↓↓↓
  • 1.构建游戏运行框架
    • 2.游戏选择菜单实现
      • 3.游戏过程具体实现
  • 游戏优化
  • 猜数字游戏源代码展示

猜数字游戏思路↓↓

猜数字游戏实现思路

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示猜大了(“Too big”),还是猜小了(“Too small”),相等表示猜到了。 如果猜到,则结束程序。 程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。

猜数字游戏要用到的知识点

实现猜数字游戏需要掌握 while、do–while循环结构,Switch–case 和if–else分支结构、(对于结构不熟悉的可以看我上一篇博客,坐稳扶好单击右方传送门)→传送门,库函数(rand、srand)、自定义函数,这里简单提到函数章节,在下一篇博客会详细讲解函数。

猜数字游戏整体实现↓↓↓

1.构建游戏运行框架

游戏没有运行框架是没有灵魂的,它就像树没有皮,人没有好看的衣服~游戏也是需要包装的,这样看起来高端上档次。
所谓框架就是用户第一次运行时能弹出可视化菜单,供玩家选择是否玩游戏,如果选择玩游戏,则开始运行游戏,如果选择不玩则结束程序,而玩家玩完一次不过瘾,应再提供一次菜单选择,供玩家继续选择玩还是不玩游戏。

#include<stdio.h>

void menu()
{
	
}
void game()
{
	
	
}

	

int main()
{
	
	
	int input = 0;          //定义一个选项变量 

	do
	{    menu();               //打印菜单
	printf("输入数字选择对应功能\n");            
		scanf("%d", &input);             //输入数字选项选择
		switch (input)             
		{
		case 1:                    //当为1时运行自定义游戏函数
			
			game();
			break;              //结束分支

		case 0:
			printf("退出游戏\n");        //为0时退出游戏
			break;
		default :
			printf("无效选择请重新输入\n");      //选项以外的选择提示错误重新输入
			break;
		}
	
	
	
	} while (input==1||input!=0);        //当为表达式里选项为1或者不为0时 会重新进入循环
	
	return 0;
}

上面框架使用了do—while循环,特点是不用判断表达式直接先进入一次循环 此时出现了菜单函数,为了便于维护和提高可视化效果,菜单列标封装在了函数里,通过运行menu()实现菜单功能,同样游戏功能也被封装在game()函数里实现运行游戏的功能。

2.游戏选择菜单实现

菜单就像门面,可以给用户选择,实现人性化操作~下面看代码

在menu函数里用两个printf()函数实现向终端屏幕输出字符 达到输出菜单的效果,实现效果展示↓↓

此时达到了输出菜单的效果,然后供用户选择。

3.游戏过程具体实现

打起精神,重点来了!!!
首先我们要使系统内部产生一个1-100的正整数,我们要用到rand()库函数,使用库函数我们得了解这个函数的用法!

这个函数返回类型是int,参数为空,表示运行该函数会生成一个伪随机整数,
首先我们要设置返回值在1-100间

通过转定义发现该函数最后返回的数是在0-32767之间,所以我们可以通过运行此函数得到该区间的数再模上100加1最后得到1-100间的数字。
此时实现了 电脑内部生成一个1-100的数字↑

通过while(1)表达式为真一直循环玩家输入数字然后使两数比较↑↑ 当最后相等则游戏结束下面看运行代码

通过此思路实现了要达到的效果,但是再进行玩一次游戏时又得到了个不好的效果

每次程序启动第一个猜的数一直是42,这游戏就有bug了,此时进行一个简单的测试

发现虽然是随机了,但是每次运行程序都是42开始然后根据规律随机的一系列数字都是一样的,用户每次玩游戏只要记住了这一串数字就不用猜了,所以这种伪随机达不到想要的结果。
因此,我们还需要一个srand()函数 用来设置rand()函数随机数的起点值,

此函数实现是通过传递的参数 将其作为rand的起点值即rand()第一次生成的数字,因此使用这个函数先用常数1作为参数测试一下↓

发现该函数srand(1)使得rand的起点数设置为了42 但每次运行时都给其设置的42 又没有了随机的效果,那我们想使srand()里面的参数为一个随机数,然后才使rand生成的数是一个随机数要怎么做呢,此时我们可以用时间戳作为参数放到srand中,因为时间的不断变化的,因此每次运行srand得到的值都是不同的使得rand里面的数也不同,达到随机的效果,而使用时间戳要用到time库函数。

通过这个描述我们可以简单设置这个函数实现为(unsigned) time(NULL),因为参数需要指针此时可以设一个空指针使其得到当前时间,而为了防止得到的数字是负数将其强制类型转化为无符号整数,使其为一个正数。

简单测试后发现确实每个数都随机了,但是随机的数之间间隔都太短了,检查发现是因为每次进行游戏都运行了srand使得改变了rand随机起点数而srand每次是根据时间戳变化,猜数字时间间隔断导致每次生成的数字都太相近,此时我们只要将srand函数移至运行程序进入do–while循环前即可,表示运行此游戏以当前时间戳设置rand随机起点值,然后rand每次运行都会得到不同的数并且数字间隔不会太小。

此时程序已经整体达到了游戏实现的效果~
注意:警告显示time srand rand 未定义 ,这是因为引用这三个库函数要包含对应的头文件
time的头文件为 time.h srand 和rand的头文件为 stdlib.h

游戏优化

光猜随机数一直猜下去总会猜到,我们可以做一个小小优化,比如猜中后显示猜数字花了几次,并且可以增加难度当猜数字猜了5次还没猜中则游戏失败重新生成一个随机数,这样使得游戏更有趣~

此设置给 猜中数字后显示猜数字次数提高人性化,猜10次数字没猜中游戏失败给游戏增加了难度。

当我再进行游戏测试时发现,此设置是输入数字选择功能,但是输入一个字母会使得直接出现意想不到的结果,秉着做到最好,不写bug的习惯,我打算将这种情况优化了。以下优化仅供参考,因为以后这个游戏设计不会有输数字给你数字母的情况。

此设计将输入选项设置为字符型,将对应的case入口 设置为字符常量 ,当读取到第一个字符时 此时缓冲区还有其他字符或者\n存在 此时用while循环 表达式里用getchar()函数将输入缓冲区内的无效字符都读取掉,并当读取的第一个字符开始不是回车字符时 将input里的值设为0表示 表示此时input里的值不能调用 开始游戏和退出游戏入口 只能进入默认选项。
作者水平有限,优化暂时到这里了~
最后,将输出系统生成的随机数那行代码删除,否则玩这个游戏每次都可以显示系统数字就跟开挂一样,毕竟这只是后台设置时为了方便调试而写的,真正运行起来,玩家是不能看到该数字的

猜数字游戏源代码展示

猜数字源代码已公布↓↓↓ 快去自己电脑上试试吧

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("**********1.play***********\n");
	printf("**********0.exit***********\n");
}
void game()
{
	int count = 1;
	int cp = rand()%100 + 1;            // 得到一个1-100间的整数数 存储在一个变量中  此变量为电脑内部生成的数字
	/*printf("%d", cp);*/              //显示系统生成的数字
	int num = 0;
	
	while (count<=10)                         //一个while循环  使 输入的数字和电脑系统生成的数字比较,大了提示猜大了,小了提示猜小了,重新循环输入数字比较,直到相等提示猜对了
	{
		printf("输入你要猜的数字:");
		scanf("%d", &num);             //此变量存储的值为自己输入的值 为玩家要输入的数字
		if (num > cp)
		{
			printf("数字猜大了\n");
			count++;
		}
		else if (num < cp)
		{
			printf("数字猜小了\n");
			count++;
		}
		else
		{
			printf("猜对了!你花了%d次猜中该数字\n",count);
			count = 0;
			break;
		}
	}
	if (count == 11)
	{
		printf("您猜了10次还没猜中,游戏失败\n");
		getchar();             //读取回车字符
	}
}

	
	
	

int main()
{
	
	srand((unsigned)time(NULL));
	char input = 0;


	do
	{    menu();
	printf("输入数字选择对应功能\n");
		scanf("%c", &input);  
		while (getchar() != '\n')
		{
			if(input=='1'||input=='0')
			input = 0;
		}
		
		switch (input)             
		{
		case '1':
			
			game();
			break;

		case '0':
			printf("退出游戏\n");
			break;
		default :
			printf("无效选择请重新输入\n");
			break;
		}
	
	
	
	} while (input == '1' || input != '0');           //input里的结果为字符1 或者不为字符0时表达式为真进入循环
	
	return 0;
}

作者水平有限,有什么不对的地方,还请大佬指正,我定当虚心采纳,第一时间更正

制作不易,给个一键三连吧~~~

更多推荐

赶紧进来!!!用c语言基础知识几十行代码写一个猜数字小游戏