【C语言】分支和循环详解(下)猜数字游戏

在这里插入图片描述
与诸君共进步!!!!!

文章目录

  • 1. 随机数的生成
  • 2. 猜数字小游戏的实现

1. 随机数的生成

掌握了前⾯学习的这些知识,我们就可以写⼀些稍微有趣的代码了,⽐如:
写⼀个猜数字游戏

游戏要求:

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

1.1 随机数的生成

C语⾔提供了⼀个函数叫rand,这函数是可以⽣成随机数的。
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。

rand函数的使⽤需要包含⼀个头⽂件是:stdlib.h

 #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,⽤来初始化随机数的⽣成器的,srand的原型如下:

void srand (unsigned int seed);

程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随
机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。

那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随
机数,这就⽭盾了。

1.3 time

在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。
在C语⾔中有⼀个函数叫time,就可以获得这个时间,time函数原型如下:

time_t time (time_t* timer);

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

time函数的参数timer如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存
中带回去。

如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
time函数的时候需要包含头⽂件:time.h

#ifndef _CRT_NO_TIME_T
	#ifdef _USE_32BIT_TIME_T
		typedef __time32_t time_t;
	#else
	typedef __time64_t time_t;
	#endif
#endif
	
	typedef long   __time32_t;
	typedef __int64   __time64_t;

如果只是让time函数返回时间戳,我们就可以这样写

time(NULL);// 调⽤ time 函数返回时间戳,这⾥没有接收返回值

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

 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
int main()
{
  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;//余数的范围是0-99

如果要⽣成1~100之间的随机数,⽅法如下:

rand()%100+1;//%100 的余数是 0~99,0~99 的数字 +1, 范围是 1~100

如果要⽣成100~200的随机数,⽅法如下:

 100 + rand()%(200-100+1);// 余数的范围是 0~100 ,加 100 后就是 100~200

所以如果要⽣成a~b的随机数,⽅法如下:

 a + rand()%(b-a+1)

2. 猜数字小游戏的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


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

void game()
{
	int num = 0;
	//1.先生成随机数
	int ret = rand() % 100 + 1;//生成 1~100 的随机数
	//2.开始猜数字


	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了,请重新猜\n");
		}
		else if (num > 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;
		}
	} while (input);

	return 0;
}

这个就是这一串代码的效果图

在这里插入图片描述

还可以加上猜数字的次数限制,如果5次猜不出来,就算失败

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

void game()
{
	int num = 0;
	//1.先生成随机数
	int ret = rand() % 100 + 1;//生成 1~100 的随机数
	//2.开始猜数字
	int count = 5;

	while (count)
	{
		printf("\n 你还有 %d 次机会 \n", count);
		printf("请猜数字:>");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了,请重新猜\n");
		}
		else if (num > ret)
		{
			printf("猜大了,请重新猜\n");
		}
		else
		{
			printf("恭喜您,猜对了\n");
			break;
		}

		count--;
	}

	if (count == 0)
	{
		printf("你失败了,正确值是: % d\n", ret);
	}
}

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;
}

在这里插入图片描述

这里就是结合前面所学知识的总结,其中的函数调用后面会学到,所以不用担心,希望大家下来能够多度体会,收获一些东西!!加油!!!

后面的路还很长,继续加油!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/910787.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS灵动岛动画小组件怎么播放动画

这个灵动岛相关的展示位置分几个地方&#xff1a; 紧凑型&#xff0c;最小化&#xff0c;扩展型&#xff0c;还有锁屏位置 我们先来看一下我这边实现的动画效果 demo下载&#xff1a; iOS灵动岛GIF动画 灵动岛样式 灵动岛有三种渲染模式&#xff1a; 第一种是 紧凑型&…

西门子KTP系列HMI用户自定义弹窗-多弹窗共用

接上一个文章内容《西门子KTP系列HMI用户自定义弹窗》西门子KTP系列HMI用户自定义弹窗-CSDN博客 当我需要别的操作并且需要弹窗时&#xff0c;整个弹窗的内容和变量都需要重复重新绑定&#xff1b;如下图所示&#xff1a; 由上图可看出当前的自定义弹窗有以下缺点&#xff1a; …

Unity使用Spine导致设备发烫

spine制作过程中&#xff0c;美术同学使用裁剪技术 将一个特效文件做固定范围显示&#xff0c;实际上非常消耗CPU算力。 解决办法&#xff1a; 交给程序来实现裁剪&#xff0c;只要加Mask组件即可

您与此网站之间建立的连接不安全解决方法

如果你打开网站&#xff0c;地址栏有警告&#xff0c;点进去是这样的提示&#xff1a;您与此网站之间建立的连接不安全&#xff0c;了解详细信息。 请勿在此网站上输入任何敏感信息&#xff08;例如密码或信用卡信息&#xff09;&#xff0c;因为攻击者可能会盗取这些信息。 …

【flask开启进程,前端内容图片化并转pdf-会议签到补充】

flask开启进程,前端内容图片化并转pdf-会议签到补充 flask及flask-socketio开启threading页面内容转图片转pdf流程前端主js代码内容转图片-browser端browser端的同步编程flask的主要功能route,def 总结 用到了pdf,来回数据转发和合成,担心flask卡顿,响应差,于是刚好看到threadi…

R7:糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 探索本案例是否还有进一步优化的空间 二、实验环境&#xff1a; 语言环境&#xff1a;python 3.8编译器&#xff1a;Jupyter notebo…

张氏宗谱序言白话文翻译

序言&#xff1a; 回想千家有赤松子的传承&#xff0c;张家有 “百忍” 的风范。感慨因迁徙和战乱、水灾之苦&#xff0c;远居他乡而失去了家族秩序。想起自从从泗州来到淮安&#xff0c;安家在安东县东北乡众湖荡之地。&#xff08;这里可能在回忆家族的迁徙历史&#xff09;…

从0开始学习Linux——Yum工具

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 上一个章节我们简单了解了Linux中常用的一些文本编辑器&#xff0c;本次教程我们将学习yum工具。 一、Yum简介 Yum&#xff08;全名…

推荐一款基于Flash的交互式园林设计工具:Garden Planner

Garden Planner是一款由Artifact Interactive开发的基于Flash的交互式园林设计工具。它允许用户以拖放的方式安排植物、树木、建筑物和各种对象&#xff0c;使园林规划变得简单直观。此外&#xff0c;Garden Planner提供工具来快速创建铺路、路径和围栏&#xff0c;帮助用户设计…

WinForms 中使用 MVVM 模式构建应用:实现登录页面、页面导航及 SQLite 数据库连接完整框架搭建过程

前言 在传统的 WinForms 应用程序开发中&#xff0c;很多开发者使用事件驱动的设计模式&#xff0c;直接将业务逻辑编写在界面代码中。然而&#xff0c;随着应用程序的复杂性增加&#xff0c;单一的界面文件变得臃肿&#xff0c;难以测试和维护。借鉴 WPF 中 MVVM&#xff08;…

诗林工作室(编号:mb0003)分享:Finbiz自适应响应式网页设计模版,适用于前端设计、博客、官网等多类型开发模版

本设计模版来自外网&#xff0c;为HTML类型的模版&#xff0c;色彩多样&#xff0c;适合Web开发人员做前端站点设计参考使用。全站模版倾向于官网设计、自主博客等多行业的平台模版开发&#xff0c;适合各大CMS的主题模版开发参考&#xff0c;如常见的Wordpress主题开发、Z-Blo…

在python中解析命令行参数,并做一个命令行程序

命令行参数 加密程序 考虑这样一个加密程序&#xff0c;其中一个功能&#xff0c;是对一段字符串进行base64加密&#xff0c;另一个功能&#xff0c;是对一段base64字符串解密&#xff1a; import base64def encrypt_to_base64(input_string):byte_data input_string.encod…

ESP8266 自定义固件烧录-Tcpsocket固件

一、固件介绍 固件为自定义开发的一个适配物联网项目的开源固件&#xff0c;支持网页配网、支持网页tcpsocket服务器配置、支持串口波特率设置。 方便、快捷、稳定&#xff01; 二、烧录说明 固件及工具打包下载地址&#xff1a; https://download.csdn.net/download/flyai…

I.MX6U 裸机开发3. GPIO操作控制LED灯

I.MX6U 裸机开发3. GPIO操作控制LED灯 一、创建项目目录及源文件1. 新建目录2. 远程开发环境3. 创建源文件 二、代码编写1. 打开时钟2. 配置端口复用功能为GPIO3. 配置端口电气属性4. 设置GPIO方向&#xff08;GDIR寄存器&#xff09;5. 输出6. 死循环等待 三、编译程序1. 整体…

「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现

自定义动画让开发者可以设计更加个性化和复杂的动画效果&#xff0c;适合表现独特的界面元素。鸿蒙提供了丰富的工具&#xff0c;支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。 关键词 自定义动画动画路径贝塞尔曲…

FLUX 推出 Ultra 和 Raw 模式,仅10秒生成2K高清图!

大家好&#xff0c;我是渔夫。 就在 2024年11月6日&#xff0c;BlackForestLabs 团队升级了他们最新的文生图模型 FLUX1.1 [pro]。 推出 Ultra 和 Raw 模式&#xff0c;仅10秒就能生成2K高清图片&#xff0c;速度非常惊人。 Ultra 模式&#xff1a;可生成超高分辨率图像&#x…

24/11/6 算法笔记 SVD

SVD&#xff0c;即奇异值分解&#xff08;Singular Value Decomposition&#xff09;&#xff0c;是线性代数中一种重要的矩阵分解方法。 定义 对于任何给定的 mnmn 的实数矩阵 AA&#xff08;其中 mm 是行数&#xff0c;nn 是列数&#xff09;&#xff0c;SVD分解可以表示为…

开发笔记 | 快速上手基于Dify等第三方大模型平台接口实现AI智能聊天

前置&#xff1a; 1.部署Dify&#xff0c;见官方教程及介绍https://docs.dify.ai/zh-hans&#xff0c;本文主要讲基于部署完之后的java实现的调用它的接口实现AI智能聊天&#xff0c;其他AI功能后续有用到再补充&#xff0c;没有就看缘分 2.什么是Dify&#xff1f;可以简单理解…

数据分析:转录组差异fgsea富集分析

文章目录 介绍加载R包数据链接导入数据数据预处理DE testing: 2BP vs no-BP比较limma-voomLoad steroid dataIn No-BP patientsIn 2BP patientsCompare gene expression vs bacterial mass其他系统信息介绍 转录组差异fgsea富集分析是一种基于基因集的富集分析方法,它关注的是…

查看网路信息-ifconfig命令

1.ifconfig缺点&#xff1a; 可以查看接口的网络类型&#xff1b;部分IP和掩码以及状态是否插线&#xff0c;看不到接口下的网关&#xff0c;DNS, 要想看到接口下多个IP,使用 ip addr show 命令 要想看网关&#xff0c;使用 ip route show 命令、route -n 命令 显示路由表内…