猜数字游戏实现

目录

1.游戏的整个逻辑

2.提供一个菜单(可以随时玩)

3.当输入1时,并不是为了让它打印“猜函数”。而需写一个函数,完成猜函数的这个逻辑。

第一步:让电脑产生随机数

 第二步:让生成随机数的范围是0-100

 4.猜数字

//4_17 01:03:44
//猜数字游戏实现
//电脑产生一个随机数(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");
}
//生成随机值的范围时0-RAND_MAX(32767)
//0~RAND_MAX(32767)
void game()
{          //强制类型转换
	//需要传一个值并且这个值时刻在变化————时间戳

	//time()可以返回一个时间戳,包含头文件 #include<time.h>
	//RAND_MAX;//要引用头文件 #include<stdlib.h>
	//1.生成随机数
	int guess = 0;
	int ret = rand()%100+1;//生成随机数的函数
	//在调用rand之前,先使用srand函数来建立随机数生成器。
	//产生一个随机数(1-100)
	//0-99   1-100
	//printf("%d\n", ret);
	
	while (1)
	{
		printf("请猜数字:>");
	    scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			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:
		    //printf("猜数字\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;//这个break只是跳出switch循环,并不能跳出while循环
		}
	} while(input);//input为0时,退出while循环,为1和输入错误时,能继续循环,逻辑正确
	return 0;
}
#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 ret = rand()%100+1;
	while (1)
	{
		printf("请猜数字:>");
	    scanf("%d", &guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			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("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;//这个break只是跳出switch循环,并不能跳出while循环
		}
	} while(input);
	return 0;
}

1.游戏的整个逻辑

让电脑产生随机数(1-100)

猜数字——如果输入的数字大于产生的随机数,反馈“猜大了”

猜数字——如果输入的数字小于产生的随机数,反馈“猜小了”

2.提供一个菜单(可以随时玩)

用do……while循环提供一个菜单,因为do无论如何都要执行一次循环。

首先打印一个菜单,并写出输入1则表示玩游戏,输入0则表示退出游戏。

#include<stdio.h>
void menu()
{
	printf("********************************\n");
	printf("***********  1.paly  ***********\n");
	printf("***********  0.exit  ***********\n");
	printf("********************************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("猜数字\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);//输入1则执行while循环,输入0则退出while循环,逻辑正确

	return 0;
}

3.当输入1时,并不是为了让它打印“猜函数”。而需写一个函数,完成猜函数的这个逻辑。

故printf("猜数字\n");  ——>   game();

第一步:让电脑产生随机数

用rand()函数,rand()函数是生成随机数的函数。

 //0-RAND_MAX(32767)
void game()
{
    //BAND_MAX;
    //1.生成随机数
    int ret = rand();//生成随机数的函数
    printf("%d\n", ret);
}

运行的程序结果是:

 所以,我们在调用rand函数之前,还需调用srand函数去设置随机数字生成器。

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

程序运行的结果是:

 

 生成的随机数数值不变,当将 srand(100)——>srand(200),运行的结果是:

 所以,只要srand( )括号里面的数发生变化,就可以生成随机数,那怎样才可以让srand( )括号里面的数随时发生变化呢?

时间是随时发生变化的。这里引进时间戳的概念:

 时间在变,时间戳在变,而时间戳是整数,可以传给srand()这个函数。

那么,如何生成时间戳呢?引进time函数,time函数的返回值就是时间戳。

 time_t是C语言规定的一个类型。

 代码如下,用time函数生成的时间戳作为srand( )函数随机数字生成的起点,再用rand调用生的随机数字。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("********************************\n");
	printf("***********  1.paly  ***********\n");
	printf("***********  0.exit  ***********\n");
	printf("********************************\n");
}
//time_t 本质上,time_t的类型是一个整数,所以把time函数的返回值传给srand函数
void game()
{
	srand((unsigned int)time(NULL));
    //time函数的返回值是time_t,而srand函数的返回值是unsigned int,所以需要类型转换
	//1.生成随机数
	int ret = rand();//生成随机数的函数
	printf("%d\n", ret);
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);

	return 0;
}

 程序运行结果是:

 原因:我们确实在rand()函数使用之前调用srand(),但是不是每一次生成随机数的时候都设置这个起点,而是在整个工程里面设置一个起点就可以了。

所以 srand((unsigned int)time(NULL)); 不应该放在game( )函数里,而是把它放在主函数里面。

修改后的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("********************************\n");
	printf("***********  1.paly  ***********\n");
	printf("***********  0.exit  ***********\n");
	printf("********************************\n");
}
//0-RAND_MAX(32767)
//time_t //本质time_t的类型是一个整数,所以把time函数的返回值传给srand函数
void game()
{
	
	//1.生成随机数
	int ret = rand();//生成随机数的函数
	printf("%d\n", ret);
}
int main()
{
	srand((unsigned int)time(NULL));
    //time函数的返回值是time_t,而srand函数的返回值是unsigned int,所以需要类型转换
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);

	return 0;
}

运行结果是:

 第二步:让生成随机数的范围是0-100

只需将int ret = rand();——> int ret = rand()%100+1;

void game()
{
	
	//1.生成随机数
	int ret = rand()%100+1;//生成随机数的函数
    //因为rand生成的随机数是0~32767,所以ret%100=0~99
	//而0+1~99+1就变成1~100
	printf("%d\n", ret);
	
}

这样就可以生成1~100之间的随机数了!

 4.猜数字

void game()
{
	int guess = 0;
	//1.生成随机数
	int ret = rand()%100+1;//生成随机数的函数
    //因为rand生成的随机数是0~32767,所以ret%100=0~99
	//而0+1~99+1就变成1~100
	//printf("%d\n", ret);//如果这行代码没有注释掉的话,会打印出生成的随机数
	//2.猜数字
	while (1)
	{
		printf("请猜数字:>");
	    scanf("%d", &guess);
		if (guess < ret)
		{
		    printf("猜小了\n");
		}
		else if (guess > ret)
		{
		    printf("猜大了\n");
		}
	    else
	    {
		    printf("恭喜你,猜对了!\n");
            break;
	    }
	}
	
}

最终的代码是:

//猜数字游戏(复习)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("********************************\n");
	printf("***********  1.paly  ***********\n");
	printf("***********  0.exit  ***********\n");
	printf("********************************\n");
}
//0-RAND_MAX(32767)
//time_t //本质上:time_t的类型是一个整数,所以把time函数的返回值传给srand函数
void game()
{
	int guess = 0;
	//1.生成随机数
	int ret = rand()%100+1;//生成随机数的函数
    //因为rand生成的随机数是0~32767,所以ret%100=0~99
	//而0+1~99+1就变成1~100
	//printf("%d\n", ret);
	//2.猜数字
	while (1)
	{
		printf("请猜数字:>");
	    scanf("%d", &guess);
		if (guess < ret)
		{
		    printf("猜小了\n");
		}
		else if (guess > ret)
		{
		    printf("猜大了\n");
		}
	    else
	    {
		    printf("恭喜你,猜对了!\n");
			break;
	    }
	}
	
}
int main()
{
	srand((unsigned int)time(NULL));//time函数的返回值是time_t,而srand函数的返回值是unsigned int,所以需要类型转换
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);

	return 0;
}

运行结果是:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值