首页 > 其他分享 >C语言分支和循环相关游戏

C语言分支和循环相关游戏

时间:2024-11-19 21:46:25浏览次数:3  
标签:rand 函数 int time C语言 游戏 随机数 printf 分支

文章目录


猜数字游戏

游戏要求

  1. 电脑自动生成1~100的随机数
  2. 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束

1 随机数生成

如何产生随机数,一共有三种函数 rand srand time

1.1 rand

C语言中提供了一个函数叫rand,可以生成随机数的,函数原型如下所示:

#include<stdlib.h>
int rand (void);//rand函数会返回一个伪随机数,这个数的范围为0~RAND_MAX之间,这个RAND_MAX大小是依赖编译器上实现的,但大部分编译器上是32767.

rand函数的使用需要包含一个头文件:stdlib.h

下面我们测试一下rand函数,这里产生5个随机数:

#include<stdio.h>
#include<stdlib.h>
int main()
{
  printf("%d\n",rand());
  printf("%d\n",rand());
  printf("%d\n",rand());
  printf("%d\n",rand());
  printf("%d\n",rand());
  return 0;
}
//两次运行结果显示

在这里插入图片描述
这里我们发现产生的5个随机数是相对随机,但是第一次和第二次运行结果产生的随机数是随机的。
因为rand函数生成的随机数是伪随机的,而rand函数是对一个叫“种子”的基准值进行运算生成的随机数。
之所以产生的随机序列是一样的,那是因为rand函数的默认种子是1

1.2 srand

C语言中又提供一个函数叫srand,用来初始化随机数的生成器的,原型如下:

void srand(unsigned int seed);

srand函数需要接收一个无符号整形作为参数,其没有返回值,只用来执行设置rand函数“种子”的功能。程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的“种子”,只要“种子”在变化,每次生成的随机数序列也就变化起来了.

int main()
{
  srand(5);
  printf("%d\n",rand());  //54
  printf("%d\n",rand());  //28693
  printf("%d\n",rand());  //12255
  printf("%d\n",rand());  //24449
  printf("%d\n",rand());  //27660
  return 0;
}
int main()
{
  srand(4);
  printf("%d\n",rand());  //51
  printf("%d\n",rand());  //17945
  printf("%d\n",rand());  //27159
  printf("%d\n",rand());  //386
  printf("%d\n",rand());  //17345
  return 0;
}

这里我们看出srand函数对“种子”的设置,rand函数确实随机了起来,但是srand函数的参数不是一个随机值rand函数就不可能随机。
所以这两种函数都存在缺陷。那么如何让srand函数的参数随机起来呢?

1.3 time

在程序中我们一般使用程序运行的时间作为种子的,因为时间时刻在变化。
在C语言中有一个函数叫time,就可以获得这个时间,time函数原型如下:

#include<time.h>
time_t time(time_* timer);

使用此函数需要包含头文件time.h

time函数会返回当前的日历时间,其实是返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型,本质是其实就是32位或则64位的整型类型

  • 如果time的参数timer如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
  • 如果timer是NULL,就会返回这个时间的差值。rime函数返回的这个时间差也被叫做:时间戳。
    如果只是time函数返回时间戳,我们可以这样写
time(NULL);

我们就可以让生成随机数的代码改写成如下:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main
{
  //使用time函数的返回值设置种子
  //因为srand的参数是unsigned int 类型,我们将time函数的返回值强制类型转换
  srand((unsigned int)time(NULL));
  printf("%d\n",rand());
  printf("%d\n",rand());
  printf("%d\n",rand());
  printf("%d\n",rand());
  printf("%d\n",rand());
  return 0;

多次运行几次看看,每次的运行就有差异了。
在这里插入图片描述
srand函数是不需频繁调用的,一次运行的程序中调用一次就够了。

1.4 设置随机数的范围

  • 生成0~99之间的随机数,方法如下:
rand()% 100;
  • 生成1~100之间的随机数,方法如下:
rand()% 100 + 1;
  • 生成100~200之间的随机数,方法如下:
100 + rand()% (200 - 100 + 1)
  • 所以如果要生成a~b的随机数,方法如下:
a + rand( ) % (b-a+1)

2.猜数字游戏实现

参考代码:

//定义函数 封装
void menu() //封装
{
	printf("---------------------\n");
	printf("------1. 玩游戏------\n");
	printf("------0. 退出游戏----\n");
	printf("---------------------\n");
}

void game()
{
	int guess = 0;
	int r = rand() % 100 + 1;
	while (1)
	{
		printf("猜数字\n");
		scanf("%d", &guess);
		if (r < guess)
			printf("猜大了\n");
		else if (r > guess)
			printf("猜小了\n");
		else
		{
			printf("猜对了,数字为%d\n", r);
			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;
			}
		} while (input);
	return 0;
}

我们还可以加以改造,增加次数限制,如果5次猜不出来,就算失败。

void menu() //封装
{
	printf("---------------------\n");
	printf("------1. 玩游戏------\n");
	printf("------0. 退出游戏----\n");
	printf("---------------------\n");
}

void game()
{
	int guess = 0;
	int r = rand() % 100 + 1;
	int count = 5;
	while (count)
	{
		printf("剩余%d机会,", count);
		printf("猜数字\n");
		scanf("%d", &guess);
		if (r < guess)
			printf("猜大了\n");
		else if (r > guess)
			printf("猜小了\n");
		else
		{
			printf("猜对了,数字为%d\n", r);
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("5次机会使用完,猜数字失败\n");
	}
}

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;
		}
	} while (input);

	return 0;
}

此讲难度系数较大,也是分支和循环的综合应用,新手需要多加练习。

标签:rand,函数,int,time,C语言,游戏,随机数,printf,分支
From: https://blog.csdn.net/weixin_64957584/article/details/143894691

相关文章

  • 经典C语言代码——part 2
    【程序4】题目:输入某年某月某日,判断这一天是这一年的第几天?1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。2.程序源代码:main(){intday,month,year,sum,leap;printf("\nplease......
  • SQL——512.游戏玩法分析Ⅱ
    题目来源:https://leetcode.cn/problems/game-play-analysis-ii/description/?envType=study-plan-v2&envId=sql-premium-50题目描述:题目示例:解题代码:```sql#法一:窗口函数SELECTplayer_id,device_idfrom(SELECTplayer_id, device_id, event_date, MIN(......
  • 童年游戏——用Python写一个天天酷跑(附源码)
    写出来的效果图就是这样了下面就更新一下全部的代码吧还是老样子先定义importpygame,sysimportrandom写一下游戏配置width=1200#窗口宽度height=508#窗口高度size=width,heightscore=None#分数myFont=myFont......
  • 实时多人游戏同步方案:不同架构的对比
    探讨Unity实时多人游戏的现状,不同游戏类型中的不同网络架构。网络架构模式游戏开发者使用各种网络架构模式来确保多人游戏中玩家之间可靠且快速的互动。每种模式都有其自身的优缺点,选择合适的模式取决于您正在使用的特定游戏类型和互动场景。在本节中,我们将讨论以下模式:锁步......
  • 【C语言】用代码绘制线性函数包围图
    题目:绘制左边图的输出图像,函数已给出。原因分析:提示:这里填写问题的分析:例如:Handler发送消息有两种方式,分别是Handler.obtainMessage()和Handler.sendMessage(),其中obtainMessage方式当数据量过大时,由于MessageQuene大小也有限,所以当message处理不及时时,会......
  • 解锁C++第二大特性,代码也玩“父子”游戏——继承
    解锁C++第二大特性,代码也玩“父子”游戏——继承文章目录解锁C++第二大特性,代码也玩“父子”游戏——继承前言——封装封装的本质是什么?封装的总结一、继承的基本概念1.1继承的定义二、继承的三种方式2.1私有不可见2.2公有、保护的继承2.3基类和派生类对象赋值......
  • Java子类继承父类哪些内容 C语言初阶指针数组末
    1.publicclasstest18{/*publicstaticvoidmain(String[]args){Ziz1=newZi();Ziz2=newZi("zhangsan",15);}}classFu{Stringname;intage;publicFu(){}publicFu(Stringname,intage)......
  • 【C语言的奥秘2】分支语句、循环语句、转向语句(1)
    一、控制语句及其分类控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。可分成以下三类:1.条件判断语句也叫分支语句:if语句、switch语句;2.循环执行语句:dowhile语句......
  • 学习c语言——进阶
    学习c语言——进阶指针的学习1.使用指针交换数字voidswop(int*a,int*b){intt=*a;printf("%p\n",&t); printf("%p\n",&a); printf("%p\n",a);*a=*b;*b=t;}/*其中,前三行分别输出变量t、指针变量a和指针变量a所指向的......
  • C语言 | 指针 | 野指针 | 数组指针 | 指针数组 | 二级指针 | 函数指针 | 指针函数
    文章目录1.指针的定义2.指针的加减运算3.野指针4.指针&数组&传参&字符数组5.数组指针&指针数组6.二级指针7.指针函数&函数指针&回调函数8.函数指针数组&指向函数指针数组的指针1.指针的定义指针是内存中一个最小单元的编号,也就是地址。平常口语中所......