C讲坛之猜数字游戏的实现

大家好,这次博主将一步步教大家如何用C语言实现简单的猜数字游戏

目标:猜数字游戏 要求:随机生成一个1~100的值
输入猜测值后,如果猜测值大于随机值,会提醒“猜大了”,如果小于测试值,会提醒“猜小了”,如果猜测正确,提醒“恭喜你,猜对了”,此时游戏结束,新的一轮游戏开始。

一.首先我们先设定一个基本框架

#define _CRT_SECURE_NO_WARNINGS 1
//vs编译器使用scanf函数防报错
#include <stdio.h>
int main()
{
    
    
     int input=0;
     do
     {
    
    
       menu();//设定一个生成菜单的函数
       printf("请选择:>");
       scanf("%d",&input);
       switch(input)
       {
    
    
         case 1: game(); break;//设定game函数进行游戏
         //输入1开始游戏
         case 0: printf("退出游戏");break;
         //输入0退出游戏
         default:printf("选择错误");break; 
         //输入其他的值会提醒选择错误 
       }
     }while(input);//用dowhile语句可以跳过判断语句直接生成菜单
      return 0;    
}
 

二. 设定菜单menu函数和游戏game函数

1. 游戏的开始生成一个菜单menu 用以让玩家选择是否开始游戏

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

2. 猜数字游戏主体

C语言中使用rand函数生成随机数,关于rand函数的具体使用方法,我们可以借助MSDN上查询一下
在这里插入图片描述
在这里插入图片描述
由此我们可知rand函数的作用是生成一个随机数,并且调用这个函数需要头文件#include <stdlib.h>。并且从Remarks(注意)可得知,这个随机值的取值范围为0到RAND_MAX,那么问题来了,RAND_MAX的值又是多少呢?
在这里插入图片描述
我们在编译器上输入这个值然后按照上图所示的方法点击转到定义
在这里插入图片描述
可以看到#define定义的标识符常量RAND_MAX的值为0x7fff,这是一个十六进制的值,通过计算器转化为十进制的值为32767,所以rand函数的最大值为32767。再来看后半句话可知在调用rand之前,需要使用srand函数为伪随机数生成器设置种子,也就是说在使用rand函数之前需要使用srand函数。再次借助MSDN查找srand函数。
在这里插入图片描述
也就是说我们要给定srand函数一个值以让rand函数生成一个随机值,这时候似乎变的离谱了起来,我们想要生成一个随机值但又要每次给它设定一个随机值?那要怎么实现我们想要达到的效果呢?我们知道时间是无时无刻变化的,因此我们可以利用“时间”这个随机值,来充当srand函数里的seed。在这里我们需要引入“时间戳”这个概念

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
在这里插入图片描述

任何一个时间都可以转换成一个时间戳,而想要调用时间戳需要使用time函数,我们再次借助MSDN查询time函数。
在这里插入图片描述
由此我们可以得知使用time函数需要加上头文件#include <time.h>
于是我们可以得到猜数字游戏的主体game()

void game()
{
    
    
	int guess = 0;
	int r = rand()%100+1;
	//任何大于100的值%上100后的范围为0~99
	//+1以后的范围为1~100
	while (1)
	{
    
    
		printf("请输入:>");
		scanf("%d", &guess);
		if (guess > r)
		{
    
    
			printf("猜大了\n");
		}
		else if (guess < r)
		{
    
    
			printf("猜小了\n");
		}
		else
		{
    
    
			printf("恭喜你 猜对了\n");
			break;
		}
	}
}

三.猜数字游戏的最终实现

#define _CRT_SECURE_NO_WARNINGS 1
#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 guess = 0;
	int r = rand()%100+1;
	while (1)
	{
    
    
		printf("请输入:>");
		scanf("%d", &guess);
		if (guess > r)
		{
    
    
			printf("猜大了\n");
		}
		else if (guess < r)
		{
    
    
			printf("猜小了\n");
		}
		else
		{
    
    
			printf("恭喜你 猜对了\n");
			break;
		}
	}
}
int main()

{
    
    
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
    
    
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
    
    
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误");
			break;
		}
	} while (input);
	return 0;
}

(注意:要将srand((unsigned int)time(NULL))放到主函数里,如果放到game函数里可能会因为生成随机数过快导致不够随机即连续生成相同的随机值)

到这里,猜数字游戏就跟大家分享完啦,谢谢大家的支持呀!
(顺带一提,可以尝试再增加一个菜单来选择猜数字游戏的难度,自行设置猜数字的范围)

おすすめ

転載: blog.csdn.net/weixin_62274638/article/details/121345874