当前位置: 首页 > news >正文

【C++游戏引擎Easy2D】Random随机数,不同于Rand,做游戏必备

在这里插入图片描述


iecne


🧛‍♂️iecne个人主页:iecne的学习日志
💡每天关注iecne的作品,一起进步
💪学C++必看iecne
本文专栏【C++游戏引擎】.
🐳希望大家多多支持🥰一起进步呀!
iecne


✨前言

哈喽大家好,我是iecne,本期为大家带来的是CPP/C++【C++游戏引擎Easy2D】Random随机数,不同于Rand,做游戏必备包教包会,快来看看吧!
引擎支持 Visual Studio 2013 及以上版本,如果你使用的是较低版本的 VS,那么你需要考虑一下更新你的编译器了

任务描述

如何根据据Button制作鼠标控制按钮类
本实践旨在通过多个代码的案列,让大家理解和掌握如何使用【C++游戏引擎Easy2D】Random随机数,不同于Rand,做游戏必备
随机数


文章目录

  • ✨前言
    • 任务描述
  • Easy2D导读
  • 安装 Easy2D
  • 一.随机数的使用
    • 1.随机数的应用
    • 2.温故rand函数
      • ①rand的使用
      • ②随机数的生成
      • ③处理相同问题
    • 3.random函数
  • 二.random随机数实例
  • 关于命名
  • 总结


Easy2D导读

对于编程而言,初学者最需要的不是技能,而是成就感。
如果你喜欢用 C/C++ 编写自己的小游戏,那么 Easy2D 将是个不错的选择,它大大简化了游戏制作过程,可以帮助你快速开发 Windows 上的 2D 小游戏。
它的特点和它的名字一样,Everything is Easy!


安装 Easy2D

使用简易安装器
运行里面的 install.bat 文件进行安装。
点击此链接进行下载(纯免费,给官方搞成了VIP)
点击下载
安装程序会检测您已经安装的 Visual Studio 版本,并根据您的选择将对应库文件解压至 VS 库目录下。
Easy2D 不支持 VS2012 及以下的版本(包括 VC6.0),如果你使用的是低版本的 VS,那你需要尝试一下新版的 Visual Studio 了。

安装环境:
操作系统:Windows 7 及以上操作系统。
编译环境:Visual Studio 2013 (x86 & x64) 及以上版本。


一.随机数的使用

1.随机数的应用

对于我们初学者来说,在做游戏的时候,经常会遇到概率问题,例如一个东西有30%的概率
那我们在怎么写呢?
很多人就纳闷了,因此我们可以使用随机数


2.温故rand函数

①rand的使用

(1)rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数
(2)如果你要产生0~99这100个整数中的一个随机整数,可以表达为:int num = rand() % 100;

这样,num的值就是一个0~99中的一个随机数了


②随机数的生成

(1)0~100的生成
如果要产生0~100,则是这样:

int num = rand() % 100;

实际如下:

int main()
{   
    int rand_test;
    rand_test = rand()%100;
    cout << rand_test << endl;
    return 0;
}

(2)1~100的生成
由于我们经常会以1为开头,所以普通的rand还是无法绝对做到我们的目的
如果要产生1~100,则是这样:

int num = rand() % 100 +1;

(3)a~b的生成
一般情况下,rand() % (b-a+1)+ a 就表示 a~b 之间的一个随机整数

int main()
{
    int a, b;
    cin >> a >> b;
    int rand_test;
    rand_test = rand() % (b - a + 1) + a;
    cout << rand_test << endl;
    return 0;
}

③处理相同问题

我们看下以下代码:

#include<iostream>
using namespace std;
int main()
{
    int a, b;
    a = 10;
    b = 100;
    int rand_test;
    for (int i = 1; i <= 10; i++)
    {
        rand_test = rand() % (b - a + 1) + a;
        cout << rand_test << endl;
    }
    return 0;
}

指的是10~100中取10个不同的随机数

结果如下:
在这里插入图片描述

效果非常棒,但是我们再次执行一次

在这里插入图片描述

结果相同 ,所以rand()函数生成的随机数每次都一样
其实,函数rand是一个伪随机数,从固定的初始种子计算得出。所以每次运行获取到的随机数序列是相同的。要解决这一问题,需要设置一个随机数种子,一般用当前时间作为种子

所以我们还需要用到srand

srand((unsigned)time(NULL));

在随机数的前面加上此函数,调用时间作为种子,就可以实现真正的随机数

但是,切记:千万不要把此代码放入循环中,否则没用

rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数

因为默认情况下随机数种子为1,而相同的随机数种子产生的随机数是一样的,失去了随机性的意义,所以为使每次得到的随机数不一样,用函数srand()初始化随机数种子。srand()的参数,用time函数值(即当前时间),因为两次调用rand()函数的时间通常是不同的,这样就可以保证随机性了

完整代码:

#include<iostream>
using namespace std;
int main()
{
    int a, b;
    a = 10;
    b = 100;
    int rand_test;
    srand((unsigned)time(NULL));
    for (int i = 1; i <= 10; i++)
    {
        rand_test = rand() % (b - a + 1) + a;
        cout << rand_test << endl;
    }
    return 0;
}

3.random函数

Random 类用于获取随机数,Random::range函数可以获取任意数值类型在任意范围内的随机数,如下所示

// 获得一个 [1, 3] 范围内的整形随机数
int num1 = Random::range(1, 3);
// 获得一个 [1, 3] 范围内的浮点型随机数
float num2 = Random::range(1.0f, 3.0f);

这样子是不是方便多了
但是切记:这个是Easy2D游戏引擎里的内容,千万不能不能加命名空间和头文件就盲目使用


二.random随机数实例

例如我们来写一个随机数10个

首先头文件和命名空间

#include <iostream>
#include <easy2d/easy2d.h>

using namespace std;
using namespace easy2d;

接下来我们定义一个变量rand
循环设定随机数

int main()
{
	int rand;
	for (int i = 1; i <= 10; i++)
	{
		rand = Random::range(1, 100);
		cout << rand << endl;
	}
	return 0;
}

综合起来:

#include <iostream>
#include <easy2d/easy2d.h>

using namespace std;
using namespace easy2d;

int main()
{
	int rand;
	for (int i = 1; i <= 10; i++)
	{
		rand = Random::range(1, 100);
		cout << rand << endl;
	}
	return 0;
}

iecne
第一次如上

在这里插入图片描述
第二次如上

效果不同,说明random不需要strand定义!!!


你学会了吗?


关于命名

Easy2D 按照以下规律命名函数:

小驼峰式命名法则,第一个单词小写,后面的单词首字母大写,如Window::setTitle
所有函数均按照动词+名语形式命名,如Logger::showConsole
获取对象的属性值:get+属性名,如Node::getWidth
修改对象的属性值:set+属性名,如Node::setPos
获取对象的状态(bool值):is+状态名,如Node::isVisiable


总结

本节课主要是讲解了Easy2D引擎实现的教程,至此该课示例的思想博主已经真真切切彻彻底底分享完了,相信大家对这个逻辑有了一定的理解,大家可以自己动手敲敲代码,感受一下,包教包会。若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!

帅的人已然点赞收藏关注,而丑的人还在犹豫,被犹豫了,快三连吧!
原创不易,还希望各位大佬支持一下
点赞,你的认可是我创作的动力!
收藏,你的青睐是我努力的方向!
评论,你的意见是我进步的财富!
iecne


感谢每一个观看本篇文章的朋友,更多精彩敬请期待~( ̄▽ ̄~)~:
iecne的博客
若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!

iecne

相关文章:

  • 【小程序入门】App函数注册小程序实例
  • 【Linux从0到1】第十七篇:高级IO
  • 一起来做个CH347的项目(应用于FPGA、CPLD、MCU)
  • 特征筛选还在用XGB的Feature Importance?试试Permutation Importance
  • 06-ServletRequest
  • Spring Cloud Alibaba系列之nacos:(4)配置管理
  • 一篇五分生信临床模型预测文章代码复现——Figure 3. 基因富集分析(二)
  • 深度学习——day34 读论文:深度 ReLU 网络在特征提取和泛化中的深度选择(2022 Q1)
  • STM32G474产生一个锯齿波
  • 蓝队视角下的防御体系怎样进行突破
  • 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数
  • [平台运维、Hadoop]kafka streams概述
  • 【祝福伟大的祖国】Java Web 9.2 Request 对象 9.2.5 请求参数中文乱码问题
  • 《When you are old》一如苇中的风,轻柔却难忘
  • JavaFX实战:模拟电子琴弹奏效果,鼠标弹奏一曲piano送给大家
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JavaScript设计模式系列一:工厂模式
  • Linux各目录及每个目录的详细介绍
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • node.js
  • python学习笔记-类对象的信息
  • Rancher-k8s加速安装文档
  • vue-cli3搭建项目
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 前端临床手札——文件上传
  • 我感觉这是史上最牛的防sql注入方法类
  • No resource identifier found for attribute,RxJava之zip操作符
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (4)(4.6) Triducer
  • (4)logging(日志模块)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (LeetCode) T14. Longest Common Prefix
  • (动态规划)5. 最长回文子串 java解决
  • (多级缓存)多级缓存
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (十八)SpringBoot之发送QQ邮件
  • (十一)手动添加用户和文件的特殊权限
  • (算法)求1到1亿间的质数或素数
  • (状压dp)uva 10817 Headmaster's Headache
  • .bat文件调用java类的main方法
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • @AliasFor注解
  • @Controller和@RestController的区别?
  • @test注解_Spring 自定义注解你了解过吗?
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [<死锁专题>]
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [20190113]四校联考
  • [2023年]-hadoop面试真题(一)
  • [Android] Upload package to device fails #2720
  • [android] 手机卫士黑名单功能(ListView优化)
  • [Android实例] 保持屏幕长亮的两种方法 [转]