超好玩又简单-猜数字游戏(有手就行)

news2024/11/28 14:34:24

云边有个稻草人-CSDN博客

我的个人主页

目录

云边有个稻草人-CSDN博客

前言

猜数字游戏的游戏要求

1. 随机数的生成

1.1 rand

1.2 srand

1.3 time

1.4 设置随机数的范围

2. 猜数字游戏实现

2.1 游戏实现基本思路

2.2 代码实现

Relaxing Time!

——————————————《My type》——————————————


正文开始——

前言

前面我们学习了C语言常见概念数据类型和变量以及分支与循环,现在我们就可以整合这些知识写一个 interesting 的小游戏啦,此刻展现我们学习成果的时候到了!今天我们尝试猜数字游戏代码的编写。

猜数字游戏的游戏要求

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

唉,有个疑问,想要完成猜数字游戏,第一步那肯定是先产生一个随机数,那么该如何产生一个随机数呢?

1. 随机数的生成

1.1 rand

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

int rand (void);

rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767;同时使用 rand函数 需要包含头文件,stdlib.h

那我们就来试用一下rand函数,多调用几次看看产生的随机数

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

 我们对这个代码多次运行,发现前后几次产生的随机数都是相同的,这就说明这种产生随机数的方式有点问题,咋回事捏?

如果我们再深入了解一下,其实 rand函数 生成的随机数是伪随机的,伪随机数并不是真正的随机数,是通过某种算法生成的随机数。真正的随机数是无法预测下一个值是多少的。而 rand函数 是对一个叫“种子”的基准值进行运算生成的随机数。之所以前面每次运行程序产生的随机数序列是一样的,那是因为 rand函数 生成随机数的默认种子是1。如果要生成不同的随机数,就要让种子是变化的。

那如何让种子是变化的呢?那我们来学习srand就知道啦

1.2 srand

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

void srand (unsigned int seed);

程序中在调用 rand函数 之前先调用 srand函数,通过srand函数的参数seed来设置rand函数生成随机数时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。BUT!想一想,此时我们还得给 srand 的参数传一个随机数,这,这,就,想想何必呢,本来一开始就是想要一个随机数,结果现在折腾半天还需要一个随机数才能产生另一个随机数,看来这种方法不可行呀,换一条路吧。(这让我想起了,“你已偏离路线,已为你重新规划路线,请在合适的地方掉头”) 

在程序中我们一般是使用程序运行的时间作为种子的,因为时间是时刻在发生变化。下面来学习time函数

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.h

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

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

那么我们再尝试改写生成随机数的代码见下:

#include<stdio.h>
#include<stdlib.h>
#include<time.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~100之间的随机数,可是上面我们生成的数字是在0~32767之间的数字,那么我们该如何生成1~100之间的数字呢?

1.4 设置随机数的范围

如果我们要生成0~99之间的数字,方法见下:

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

如果我们要生成1~100之间的随机数,方法见下:

rand () % 100+1;//在原余数的基础上+1,那么余数范围就变成了1~100

如果要生成100~200之间的随机数,方法见下:

rand () % 101+100;

挺简单。这样就可以生成1~100之间的随机数了,见下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
	//使用time函数的返回值来设置种子
	//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换一下
	srand((unsigned int)time(NULL));
	printf("%d\n", rand() % 100 + 1);
	printf("%d\n", rand() % 100 + 1);
	printf("%d\n", rand() % 100 + 1);
	printf("%d\n", rand() % 100 + 1);
	printf("%d\n", rand() % 100 + 1);

	return 0;
}

2. 猜数字游戏实现

2.1 游戏实现基本思路

基本的外部框架借助 do-while循环 来实现,实现循环的条件还挺妙的我赶脚,下一次进入循环可以借助上一次的选择,仔细品一品。首先上来就先打印菜单,我们可以把菜单(以及后面的游戏逻辑)封装成一个函数,没有冗杂的函数这样main函数里面更显逻辑清晰,然后根据我们的选择展开后续;如果我们选择进入游戏,需要先产生一个随机数,注意不要把产生随机数的环节加入到while循环里面,不然每次猜都会生成一个随机数可能永远都猜不到,因为rand函数的种子是以time函数的返回值为参数的,时间戳在随时变化,那么如果放到循环里面每次判断一轮产生的rand的返回值都不一样随机数也就在变化,除非你好运爆棚一次就中,记得买个彩票哦;再接着我们就可以猜数字了,判断我们猜大了还是猜小了直到猜对为止,或者我们可以限制猜的次数,正如下面代码实现的那样,然后就没有然后了......快试一试吧

2.2 代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

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

void game()
{
	int count = 5;
	//产生一个1~100之间的随机数
	int r = rand() % 100 + 1;
	int guess = 0;
	while (count)
	{
		printf("请猜数字>: ");
		scanf("%d", &guess);
		if (guess > r)
		{
			printf("猜大了\n");
		}
		else if (guess < r)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
		count--;
		printf("还剩余%d次机会\n", count);
	}
    
    //跳出while循环有2种可能,一种是猜对了,一种是count==0结束循环
	printf("很遗憾,没有机会了,正确的数字是 %d ,再接再厉\n", r);

}

int main()
{
	//设立一个变量存放菜单选择
	int input = 0;

	//用time函数的返回值来设置种子,注意要进行强制类型转换
	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\n");
			break;
		}

	} while (input);

	return 0;
}

新手入门必学的猜数字游戏,还挺简单的吧,后面我还会继续出各种有趣小游戏的实现,一起加油!


Relaxing Time!

《My type》

【My Type_The Chainsmokers、Emily Warren_高音质在线试听_My Type歌词|歌曲下载_酷狗音乐】

云边有个稻草人

期待与你的下一次相遇!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序25__实现卡片变换

先看效果图 实现代码如下&#xff1a; <view class"page" style"filter:hue-rotate({{rotation}}deg)"><view class"prev" catchtap"toPrev">《《《</view><view class"next" catchtap"toNext&q…

git下载和配置

git是什么&#xff1f; Git是一种分布式版本控制系统&#xff0c;用于跟踪文件的变化&#xff0c;尤其是源代码。它允许多个开发者在同一项目上进行协作&#xff0c;同时保持代码的历史记录。Git的主要特点包括&#xff1a; 分布式&#xff1a;每个开发者都有项目的完整副本&a…

前端自学资料(笔记八股)分享—CSS(4)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…

无人机避障——4D毫米波雷达Octomap从点云建立三维栅格地图

Octomap安装 sudo apt-get install ros-melodic-octomap-ros sudo apt-get install ros-melodic-octomap-msgs sudo apt-get install ros-melodic-octomap-server sudo apt-get install ros-melodic-octomap-rviz-plugins # map_server安装 sudo apt-get install ros-melodic-…

SLAM|2. 差异与统一:坐标系变换与外参标定

本章主要内容 1.坐标系变换 2.相机外参标定 上一章我们了解了相机内参的概念&#xff0c;内参主要解决三维世界与二维图像之间的映射关系。有了内参我们可以一定程度上还原相机看到了什么&#xff08;但缺乏尺度&#xff09;。但相机看到的数据只是处于相机坐标系&#xff0c;为…

Solidworks二次开发 获取装配体里面组件列表以及名称

******************************************************************************从装配体里面获取组件******************************************************************************Option Explicit 强制在模块级别显式声明所有变量 *********************定义SOLIDWOR…

《链表篇》---环形链表II(返回节点)

题目传送门 方法一&#xff1a;哈希表&#xff08;与环形链表类似&#xff09; 很容易就可以找到链表的相交位置。 public class Solution {public ListNode detectCycle(ListNode head) {if(head null || head.next null){return null;}Set<ListNode> visited new Ha…

2024 年 MathorCup 数学应用挑战赛——大数据竞赛-赛道 A:台风的分类与预测

2024年MathorCup大数据挑战赛-赛道A初赛-第四版论文.ziphttps://download.csdn.net/download/qq_52590045/89930645 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ …

解决Github下载速度慢的问题

1. 方式一 先把hosts文件先复制一份到其他文件夹下&#xff0c;以免造成不小心改动出现的后果在C盘的C:\Windows\System32\drivers\etc 下的hosts文件 用编辑器打开后&#xff0c;在末尾处添加访问如下的两个网站所返回的两个IP https://github.com.ipaddress.com/ http://gi…

基于SSM大学生互动交流网站设计与实现

前言 随着社会的发展&#xff0c;系统的管理形势越来越严峻。越来越多的用户利用互联网获得信息&#xff0c;但各种信息鱼龙混杂&#xff0c;信息真假难以辨别。为了方便用户更好的获得信息&#xff0c;因此&#xff0c;设计一种安全高效的大学生互动交流网站极为重要。 开发…

C语言复习第8章 数据在内存中的存储

目录 一、数据类型1.1 数据类型介绍1.2 类型的意义1.3 类型的基本归类整形家族浮点数家族构造类型(自定义类型)指针类型空类型 二、整型在内存中的存储2.1 原反补2.2 为什么内存中要存补码?2.3 大小端介绍2.4 为什么会有大小端之分2.5 写一个程序 判断当前机器的字节序 三、练…

创业板权限开通有何要求?创业板的股票交易佣金最低是多少?

创业板 创业板又称二板市场&#xff08;Second-board Market&#xff09;即第二股票交易市场&#xff0c;是与主板市场&#xff08;Main-Board Market&#xff09;不同的一类证券市场&#xff0c;专为暂时无法在主板市场上市的创业型企业提供融资途径和成长空间的证券交易市场…

使用 FastGPT 工作流实现 AI 赛博算卦,一键生成卦象图

最近那个男人写的汉语新解火遍了全网&#xff0c;那个男人叫李继刚&#xff0c;国内玩 AI 的同学如果不知道这个名字&#xff0c;可以去面壁思过了。 这个汉语新解的神奇之处就在于它只是一段几百字的提示词&#xff0c;效果却顶得上几千行代码写出来的应用程序。 这段提示词…

【Qt】窗口——Qt窗口的概念、常用的窗口函数、菜单栏、工具栏、状态栏、浮动窗口、对话框

文章目录 Qt窗口Qt窗口的概念菜单栏工具栏状态栏浮动窗口对话框 Qt 窗口 Qt窗口的概念 QMainWindow 类概述&#xff1a; QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;它继承自 QWidget 类&#xff0c;并且提供了一个预定义的布局。 菜单栏 菜单栏常用属性&#xf…

深入解析HTTP与HTTPS的区别及实现原理

文章目录 引言HTTP协议基础HTTP响应 HTTPS协议SSL/TLS协议 总结参考资料 引言 HTTP&#xff08;HyperText Transfer Protocol&#xff09;超文本传输协议是用于从Web服务器传输超文本到本地浏览器的主要协议。随着网络安全意识的提高&#xff0c;HTTPS&#xff08;HTTP Secure…

Android 下载进度条HorizontalProgressView 基础版

一个最基础的自定义View 水平横向进度条&#xff0c;只有圆角、下载进度控制&#xff1b;可二次定制度高&#xff1b; 核心代码&#xff1a; Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW getMeasuredWidth();int mH getMeasuredHei…

服务器数据恢复—异常断电导致服务器挂载分区无法访问的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌服务器同品牌存储&#xff0c;Linux centos7EXT4文件系统。 服务器故障&#xff1a; 意外断电导致服务器操作系统不能正常启动。经过修复后系统可以正常启动&#xff0c;但是挂载的分区无法正常访问。使用fsck修复这个问题分区&#xff…

网络原理(数据链路层)->以太网帧格式解

前言 大家好我是小帅&#xff0c;今天我们来了解以太网帧格式 个人主页 文章目录 1.数据链路层1.1 认识以太⽹1.2 MAC地址&#xff08;⽹卡的硬件地址&#xff09;1.2.1 对⽐理解MAC地址和IP地址 1.3 认识MTU1.4 MTU对IP协议的影响1. 5 MTU对UDP协议的影响1.6 MTU对于TCP协议的…

隨筆 20241025 Kafka数据一致性的韭菜比喻

在Kafka中&#xff0c;数据一致性是通过Leader和Follower副本之间的协调来实现的。为了更容易理解这个复杂的概念&#xff0c;我们可以用韭菜作为比喻。 韭菜的角色 Leader韭菜&#xff1a;代表数据的主导者&#xff0c;它负责更新和维护最新的数据。Follower韭菜&#xff1a…

CNAS软件测试的好处有哪些?上海软件测试中心推荐

在进行软件测试或其他项目检测需要选择软件测试中心时&#xff0c;我们常常会把该公司有无资质认证考虑进去。那么CNAS认可作为检测机构或实验室的一项重要资质认证&#xff0c;我们可能会产生疑问&#xff1a;CNAS认可什么意思?CNAS软件测试又有什么好处呢? 1、CNAS认可是什…