2d俯视视角游戏,可以切换多种枪械
文章目录
- 一、 介绍
- 二、 人物移动、鼠标控制转向
- 三、子弹脚本
- 四、子弹随机抛壳
- 五、 爆炸特效
- 六、 发射子弹
- 七、 子弹、弹壳对象池
- 八、 散弹枪
- 九、 火箭弹、发射火箭
- 十、 下载工程文件
一、 介绍
2d俯视视角游戏。
人物视角跟随鼠标移动
多种枪械
抛壳效果
多种设计效果
对象池

二、 人物移动、鼠标控制转向
获取玩家的输入向量,设置刚体的速度,实现玩家的移动
获取鼠标位置,根据位置设置玩家的朝向
检查是否按下了 Q 或 E 键,根据按下的键切换到新的选中的枪支
using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace BulletHell
{public class PlayerMovement : MonoBehaviour {public GameObject[] guns; // 存放玩家枪支的 GameObject 数组public float speed; // 玩家的速度private Vector2 input; // 存放玩家输入的 Vector2 变量private Vector2 mousePos; // 存放鼠标位置的 Vector2 变量private Animator animator; // 存放动画组件的变量private Rigidbody2D rigidbody; // 存放刚体组件的变量private int gunNum; // 存放当前选中的枪支在数组中的索引void Start(){animator = GetComponent<Animator>(); // 获取动画组件rigidbody = GetComponent<Rigidbody2D>(); // 获取刚体组件guns[0].SetActive(true); // 激活第一个枪支}void Update(){SwitchGun(); // 检查是否切换枪支的输入input.x = Input.GetAxisRaw("Horizontal"); // 获取水平输入轴的值input.y = Input.GetAxisRaw("Vertical"); // 获取竖直输入轴的值rigidbody.velocity = input.normalized * speed; // 设置刚体的速度为标准化的输入向量与速度的乘积mousePos = Input.mousePosition; // 获取鼠标位置if (mousePos.x > transform.position.x) // 如果鼠标在玩家右侧{transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0)); // 玩家朝向右侧}else // 如果鼠标在玩家左侧{transform.rotation = Quaternion.Euler(new Vector3(0, 180, 0)); // 玩家朝向左侧}if (input != Vector2.zero) // 如果输入向量不为零(即玩家正在移动)animator.SetBool("isMoving", true); // 将动画组件中的 "isMoving" 参数设为 trueelse // 如果输入向量为零(即玩家未移动)animator.SetBool("isMoving", false); // 将动画组件中的 "isMoving" 参数设为 false}void SwitchGun(){if (Input.GetKeyDown(KeyCode.Q)) // 如果按下了 Q 键{guns[gunNum].SetActive(false); // 关闭当前选中的枪支if (--gunNum < 0) // 索引减一,如果小于零{gunNum = guns.Length - 1; // 将索引设为数组中最后一个元素的索引}guns[gunNum].SetActive(true); // 激活新的选中的枪支}if (Input.GetKeyDown(KeyCode.E)) // 如果按下了 E 键{guns[gunNum].SetActive(false); // 关闭当前选中的枪支if (++gunNum > guns.Length - 1) // 索引加一,如果大于数组中最后一个元素的索引{gunNum = 0; // 将索引设为数组中第一个元素的索引}guns[gunNum].SetActive(true); // 激活新的选中的枪支}}}
}
三、子弹脚本
这段代码实现了游戏中子弹的飞行、碰撞和销毁功能。
代码使用了 Unity 引擎提供的 MonoBehaviou 类和内置组件,如 Rigidbody2D 和 Collider2D 等。
代码中使用了对象池技术,实现了对子弹对象的回收和重复使用,提高了游戏的性能。
代码的逻辑清晰,注释详细,易于理解和维护。
代码提供了设置子弹速度的公共方法,可以方便地进行修改和调整。
子弹对象在碰撞到其他物体时,可以选择实例化爆炸效果或从对象池中获取爆炸效果对象,并将其位置设置为子弹的位置。
可以选择销毁子弹对象或将其回收到对象池中,以便重复使
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Bullet : MonoBehaviour // 继承自 MonoBehaviour 的类
{public float speed; // 子弹的速度public GameObject explosionPrefab; // 爆炸效果的预制体new private Rigidbody2D rigidbody; // 存放刚体组件的变量void Awake(){rigidbody = GetComponent<Rigidbody2D>(); // 获取刚体组件}public void SetSpeed(Vector2 direction) // 设置子弹速度的方法{rigidbody.velocity = direction * speed; // 根据方向和速度设置刚体的速度}void Update(){}private void OnTriggerEnter2D(Collider2D other) // 当子弹碰撞到其他物体时执行{// Instantiate(explosionPrefab, transform.position, Quaternion.identity); // 实例化爆炸效果// 从对象池中获取爆炸效果对象GameObject exp = ObjectPool.Instance.GetObject(explosionPrefab);exp.transform.position = transform.position; // 将爆炸效果的位置设置为子弹的位置// Destroy(gameObject); // 销毁子弹对象ObjectPool.Instance.PushObject(gameObject); // 将子弹对象回收到对象池中}
}
四、子弹随机抛壳
这段代码实现了游戏中子弹的飞行和消失功能,具体包括:
在 OnEnable() 函数中设置子弹的初始速度、透明度和重力系数,并开始协程等待子弹消失
在 Stop() 协程中等待子弹停止一段时间后,将子弹的速度和重力系数设为零,然后不断将子弹的透明度降低,直到消失为止
最后,可以选择销毁子弹对象或将其回收到对象池中,以便重复使用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BulletShell : MonoBehaviour
{public float speed;public float stopTime = .5f;public float fadeSpeed = .01f;new private Rigidbody2D rigidbody;private SpriteRenderer sprite;void Awake(){rigidbody = GetComponent<Rigidbody2D>();sprite = GetComponent<SpriteRenderer>();}private void OnEnable(){float angel = Random.Range(-30f, 30f);rigidbody.velocity = Quaternion.AngleAxis(angel, Vector3.forward) * Vector3.up * speed;sprite.color = new Color(sprite.color.r, sprite.color.g, sprite.color.b, 1);rigidbody.gravityScale = 3;StartCoroutine(Stop());}IEnumerator Stop(){yield return new WaitForSeconds(stopTime);rigidbody.velocity = Vector2.zero;rigidbody.gravityScale = 0;while (sprite.color.a > 0){sprite.color = new Color(sprite.color.r, sprite.color.g, sprite.color.g, sprite.color.a - fadeSpeed);yield return new WaitForFixedUpdate();}// Destroy(gameObject);ObjectPool.Instance.PushObject(gameObject);}
}
五、 爆炸特效
这段代码的作用是控制爆炸动画的播放和销毁,在 Update() 函数中:
获取动画组件
在 Awake() 函数中获取动画组件
获取当前动画状态信息
在 Update() 函数中获取当前动画状态信息
判断动画是否播放完毕
如果动画已经播放完毕,可以选择销毁爆炸对象或将其回收到对象池中,以便重复使用。这里可以通过调用 ObjectPool 类的 PushObject() 方法来将对象回收到对象池中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Explosion : MonoBehaviour
{private Animator animator; // 存放动画组件的变量private AnimatorStateInfo info; // 存放动画状态信息的变量void Awake(){animator = GetComponent<Animator>(); // 获取动画组件}void Update(){info = animator.GetCurrentAnimatorStateInfo(0); // 获取当前动画状态信息if (info.normalizedTime >= 1) // 如果动画已经播放完毕{// Destroy(gameObject); // 销毁爆炸对象ObjectPool.Instance.PushObject(gameObject); // 将爆炸对象回收到对象池中}}
}
六、 发射子弹
这段代码是一个游戏中的武器类,实现了武器的朝向、射击和弹壳脱落等功能。
代码使用了 Unity 引擎提供的 MonoBehaviou 类和内置组件,如 Animator 和 Transform 等。
代码中使用了对象池技术,实现了对子弹和弹壳对象的回收和重复使用,提高了游戏的性能。
代码的逻辑清晰,注释详细,易于理解和维护。
代码提供了可重写的虚函数,可以方便地扩展和修改功能。
武器在鼠标的位置朝向和翻转时,可以选择翻转武器的 Y 轴。
武器可以通过点击鼠标左键进行射击,通过设置时间间隔来控制射击频率。
射击时会播放射击动画,并从对象池中获取子弹和弹壳对象,并设置它们的位置和速度。
子弹的速度可以根据武器的朝向和一个随机的角度进行调整。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Gun : MonoBehaviour // 继承自 MonoBehaviour 的类
{public float interval; // 射击间隔时间public GameObject bulletPrefab; // 子弹预制体public GameObject shellPrefab; // 弹壳预制体protected Transform muzzlePos; // 发射口位置protected Transform shellPos; // 弹壳位置protected Vector2 mousePos; // 鼠标位置protected Vector2 direction; // 发射方向protected float timer; // 计时器protected float flipY; // Y 轴翻转参数protected Animator animator; // 动画组件protected virtual void Start() // 在 Start() 函数中初始化一些变量和组件{animator = GetComponent<Animator>(); // 获取动画组件muzzlePos = transform.Find("Muzzle"); // 获取发射口位置shellPos = transform.Find("BulletShell"); // 获取弹壳位置flipY = transform.localScale.y; // 获取 Y 轴翻转参数}protected virtual void Update() // 在 Update() 函数中进行鼠标位置朝向、射击和弹壳脱落等操作{mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 将鼠标位置从屏幕坐标系转换为世界坐标系if (mousePos.x < transform.position.x) // 如果鼠标在武器左侧transform.localScale = new Vector3(flipY, -flipY, 1); // 翻转武器的 Y 轴elsetransform.localScale = new Vector3(flipY, flipY, 1); // 不翻转武器的 Y 轴Shoot(); // 进行射击操作}protected virtual void Shoot() // 进行射击操作{direction = (mousePos - new Vector2(transform.position.x, transform.position.y)).normalized; // 计算射击方向transform.right = direction; // 设置武器的朝向if (timer != 0) // 如果计时器不为零{timer -= Time.deltaTime; // 减少计时器时间if (timer <= 0)timer = 0; // 如果计时器小于等于零,将计时器归零}if (Input.GetButton("Fire1")) // 如果按下了鼠标左键{if (timer == 0) // 如果计时器为零{timer = interval; // 重置计时器Fire(); // 进行射击}}}protected virtual void Fire() // 进行射击{animator.SetTrigger("Shoot"); // 播放射击动画// GameObject bullet = Instantiate(bulletPrefab, muzzlePos.position, Quaternion.identity); // 在发射口位置实例化子弹GameObject bullet = ObjectPool.Instance.GetObject(bulletPrefab); // 从对象池中获取子弹对象bullet.transform.position = muzzlePos.position; // 设置子弹位置float angel = Random.Range(-5f, 5f); // 随机一个角度bullet.GetComponent<Bullet>().SetSpeed(Quaternion.AngleAxis(angel, Vector3.forward) * direction); // 根据角度和方向设置子弹速度// Instantiate(shellPrefab, shellPos.position, shellPos.rotation); // 在弹壳位置实例化弹壳GameObject shell = ObjectPool.Instance.GetObject(shellPrefab); // 从对象池中获取弹壳对象shell.transform.position = shellPos.position; // 设置弹壳位置shell.transform.rotation = shellPos.rotation; // 设置弹壳旋转角度}
}
七、 子弹、弹壳对象池
使用一个字典来存储预制体,字典的键为预制体的名称,值为一个对象队列。
提供 GetObject() 函数用于从对象池中获取一个预制体,实现如下:
如果对象池中没有该预制体或者预制体的数量为0,则实例化一个新的预制体并加入对象池。
如果对象池为空,则创建一个新的空物体作为对象池的父物体。
查找该预制体的子对象池,如果不存在,则创建一个空物体作为该预制体的子对象池。
从对象池中取出一个对象,并激活该对象。
提供 PushObject() 函数用于将一个预制体放回对象池中,实现如下:
将对象放回对象池,并将对象设置为不激活状态。
注意,为了能够正确地将预制体放回对象池中,预制体的名称不能包含 (Clone),因此在 PushObject() 函数中会将名称中的 (Clone) 替换为空字符串。
提供一个静态的 Instance 属性,用于获取对象池的单例实例。如果该实例为 null,则会创建一个新的对象池实例。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ObjectPool
{private static ObjectPool instance;private Dictionary<string, Queue<GameObject>> objectPool = new Dictionary<string, Queue<GameObject>>();private GameObject pool;public static ObjectPool Instance{get{if (instance == null){instance = new ObjectPool();}return instance;}}// 从对象池中获取一个对象public GameObject GetObject(GameObject prefab){GameObject _object;// 如果对象池中没有该预制体或者预制体的数量为0,则实例化一个新的预制体并加入对象池if (!objectPool.ContainsKey(prefab.name) || objectPool[prefab.name].Count == 0){_object = GameObject.Instantiate(prefab);PushObject(_object);// 如果对象池为空,则创建一个新的空物体作为对象池的父物体if (pool == null)pool = new GameObject("ObjectPool");// 查找该预制体的子对象池,如果不存在,则创建一个空物体作为该预制体的子对象池GameObject childPool = GameObject.Find(prefab.name + "Pool");if (!childPool){childPool = new GameObject(prefab.name + "Pool");childPool.transform.SetParent(pool.transform);}_object.transform.SetParent(childPool.transform);}// 从对象池中取出一个对象,并激活该对象_object = objectPool[prefab.name].Dequeue();_object.SetActive(true);return _object;}// 将对象放回对象池public void PushObject(GameObject prefab){string _name = prefab.name.Replace("(Clone)", string.Empty);// 如果对象池中没有该预制体,则新建一个队列用于存储该预制体if (!objectPool.ContainsKey(_name))objectPool.Add(_name, new Queue<GameObject>());// 将对象放回对象池,并将对象设置为不激活状态objectPool[_name].Enqueue(prefab);prefab.SetActive(false);}
}

八、 散弹枪
根据子弹数量和夹角计算出每颗子弹的旋转方向。
播放开枪动画。
从对象池中取出子弹并设置位置和旋转。
从对象池中取出弹壳并设置位置和旋转。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Shotgun : Gun
{public int bulletNum = 3; // 发射的子弹数量public float bulletAngle = 15; // 每颗子弹之间的夹角// 重写基类的 Fire() 函数protected override void Fire(){// 播放开枪动画animator.SetTrigger("Shoot");int median = bulletNum / 2; // 子弹数量的中位数(整数除法向下取整)for (int i = 0; i < bulletNum; i++){GameObject bullet = ObjectPool.Instance.GetObject(bulletPrefab); // 从对象池中获取子弹bullet.transform.position = muzzlePos.position; // 将子弹位置设置为枪口的位置if (bulletNum % 2 == 1) // 如果子弹数量是奇数{// 计算当前子弹的旋转方向,使用 Quaternion.AngleAxis() 函数bullet.GetComponent<Bullet>().SetSpeed(Quaternion.AngleAxis(bulletAngle * (i - median), Vector3.forward) * direction);}else // 如果子弹数量是偶数{// 计算当前子弹的旋转方向,使用 Quaternion.AngleAxis() 函数bullet.GetComponent<Bullet>().SetSpeed(Quaternion.AngleAxis(bulletAngle * (i - median) + bulletAngle / 2, Vector3.forward) * direction);}}// 从对象池中获取弹壳并设置位置和旋转GameObject shell = ObjectPool.Instance.GetObject(shellPrefab);shell.transform.position = shellPos.position;shell.transform.rotation = shellPos.rotation;}
}

九、 火箭弹、发射火箭

火箭弹抛物线炸目标点
定义了 Rocket 类,用来控制火箭弹的行为。
定义了 lerp 和 speed 两个公共字段,分别表示插值系数和子弹的速度,以及 explosionPrefab 表示爆炸特效的预制体。
在 Awake() 函数中,获取子弹的刚体组件。
在 SetTarget() 函数中,设置子弹的目标点,并将到达标记重置为 false。
在 FixedUpdate() 函数中,计算子弹的移动方向,根据到达标记判断是否需要插值旋转角度和设置移动速度。如果到达目标点,就将到达标记设置为 true。
在 OnTriggerEnter2D() 函数中,从对象池中获取爆炸特效,设置特效的位置,将子弹的移动速度设置为零,然后使用协程在一定时间后将子弹推回对象池。
这段代码的作用是控制火箭弹的行为。其中,使用插值旋转角度和设置移动速度实现子弹朝着目标点飞行的效果,使用到达标记判断子弹是否到达目标点,使用对象池管理子弹和爆炸特效的创建和销毁,可以有效地减少内存的开销和对象的创建次数,同时使用协程在一定时间后将子弹推回对象池,可以让游戏的操作更加流畅和自然。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Rocket : MonoBehaviour
{public float lerp; // 插值系数public float speed = 15; // 子弹速度public GameObject explosionPrefab; // 爆炸特效预制体new private Rigidbody2D rigidbody; // 刚体组件private Vector3 targetPos; // 目标点private Vector3 direction; // 移动方向private bool arrived; // 是否到达目标点private void Awake(){rigidbody = GetComponent<Rigidbody2D>(); // 获取刚体组件}public void SetTarget(Vector2 _target){arrived = false; // 重置到达标记targetPos = _target; // 设置目标点}private void FixedUpdate(){direction = (targetPos - transform.position).normalized; // 计算移动方向if (!arrived) // 如果没有到达目标点{transform.right = Vector3.Slerp(transform.right, direction, lerp / Vector2.Distance(transform.position, targetPos)); // 插值旋转角度rigidbody.velocity = transform.right * speed; // 设置移动速度}if (Vector2.Distance(transform.position, targetPos) < 1f && !arrived) // 如果到达目标点{arrived = true; // 设置到达标记}}private void OnTriggerEnter2D(Collider2D other){GameObject exp = ObjectPool.Instance.GetObject(explosionPrefab); // 从对象池中获取爆炸特效exp.transform.position = transform.position; // 设置特效位置rigidbody.velocity = Vector2.zero; // 停止移动StartCoroutine(Push(gameObject, .3f)); // 在一定时间后将子弹推回对象池}IEnumerator Push(GameObject _object, float time){yield return new WaitForSeconds(time); // 等待一段时间ObjectPool.Instance.PushObject(_object); // 将子弹推回对象池}
}
发射火箭弹
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RocketLauncher : Gun
{public int rocketNum = 3; // 每次发射的子弹数量public float rocketAngle = 15; // 子弹之间的夹角protected override void Fire(){animator.SetTrigger("Shoot"); // 播放射击动画StartCoroutine(DelayFire(.2f)); // 延迟一定时间后发射子弹}IEnumerator DelayFire(float delay){yield return new WaitForSeconds(delay); // 等待一定时间int median = rocketNum / 2; // 计算中位数for (int i = 0; i < rocketNum; i++) // 循环生成子弹{GameObject bullet = ObjectPool.Instance.GetObject(bulletPrefab); // 从对象池中获取子弹bullet.transform.position = muzzlePos.position; // 设置子弹的初始位置if (rocketNum % 2 == 1) // 如果子弹数量是奇数{bullet.transform.right = Quaternion.AngleAxis(rocketAngle * (i - median), Vector3.forward) * direction; // 计算子弹的旋转方向}else // 如果子弹数量是偶数{bullet.transform.right = Quaternion.AngleAxis(rocketAngle * (i - median) + rocketAngle / 2, Vector3.forward) * direction; // 计算子弹的旋转方向}bullet.GetComponent<Rocket>().SetTarget(mousePos); // 设置子弹的目标点}}
}
定义了 RocketLauncher 类,用来控制火箭发射器的行为。
定义了 rocketNum 和 rocketAngle 两个公共字段,分别表示每次发射的子弹数量和子弹之间的夹角。
在 Fire() 函数中,播放射击动画并调用 DelayFire() 函数延迟一定时间后发射子弹。
在 DelayFire() 函数中,首先计算子弹数量的中位数,然后使用循环来生成子弹。在生成每个子弹时,从对象池中获取子弹,并设置子弹的初始位置和旋转方向。如果子弹数量是奇数,就使用 (i - median) * rocketAngle 计算子弹的旋转方向。如果子弹数量是偶数,就使用 (i - median) * rocketAngle + rocketAngle / 2 计算子弹的旋转方向。最后,调用 bullet.GetComponent().SetTarget(mousePos) 函数设置子弹的目标点,让子弹朝着鼠标指向的方向飞行。
这段代码的作用是控制火箭发射器的行为。其中,使用子弹数量和子弹之间的夹角来决定生成子弹的位置和旋转方向,使用对象池管理子弹的创建和销毁,可以有效地减少内存的开销和对象的创建次数,同时使用协程来实现延迟发射子弹的效果,可以让游戏的操作更加流畅和自然。
十、 下载工程文件
https://wwez.lanzoul.com/izVuU0tyzffe
相关文章:
2d俯视视角游戏,可以切换多种枪械
文章目录 一、 介绍二、 人物移动、鼠标控制转向三、子弹脚本四、子弹随机抛壳五、 爆炸特效六、 发射子弹七、 子弹、弹壳对象池八、 散弹枪九、 火箭弹、发射火箭十、 下载工程文件 一、 介绍 2d俯视视角游戏。 人物视角跟随鼠标移动 多种枪械 抛壳效果 多种设计效果 对象池…...
大四的告诫
保研/考研方向就绩点,(各种)比赛,(考研)刷题为主 工作就算法(比赛),项目,实习为主 👂 LOCK OUT - $atori Zoom/KALONO - 单曲 - 网易云音乐 &…...
滚珠螺杆在设备上的应用
滚珠螺杆跟直线导轨一样,是很多机械设备上不可或缺的重要部件,它是确保机器能够具备高加工精度的前提条件,因此本身对于精度的要求也相当地高。今天,我们就来了解一下滚珠螺杆在不同设备上的应用吧! 1、大型的加工中心…...
Day41线程同步
线程同步 案例:三个窗口卖100张票 //定义一个类SellTicket实现Runnable接口,定义成员变量100张票 public class SellTicket implements Runnable{private int tickets 100;//重写run方法Overridepublic void run(){while (true){ //没有票后&…...
设计模式之享元模式
参考资料 曾探《JavaScript设计模式与开发实践》;「设计模式 JavaScript 描述」享元模式设计模式之享元模式Javascript 设计模式 - 享元模式 定义 享元模式的英文叫:Flyweight Design Pattern。享元设计模式是用于性能优化的模式,这种设计…...
【GAMES101】05 Rasterization(Triangles)
光栅化过程:将一系列变换后的三角形转换为像素的过程。 三角形在图形学中得到很多的应用。 最基础的多边形(边数最少)。任何多边形都可以拆成三角形。性质:三角形内部一定是平面的。三角形内外部定义非常清楚。定义三个顶点后&a…...
13. Pod 从入门到深入理解(二)
本章讲解知识点 Pod 容器共享 VolumeConfigMapSecretDownward APIEmptyDir VolumeHostPath Volume1. Pod 容器共享 Volume 1.1. Volume 的背景及需要解决的问题 存储是必不可少的,对于服务运行产生的日志、数据,必须有一个地方进行保存,但是我们的容器每一次重启都是“恢复…...
ORBBEC(奥比中光)AstraPro相机在ROS2下的标定与D2C(标定与配准)
文章目录 1.rgb、depth相机标定矫正1.1.标定rgb相机1.2.标定depth相机1.3.rgb、depth相机一起标定(效果重复了,但是推荐使用)1.4.取得标定结果1.4.1.得到的标定结果的意义 1.5.IR、RGB相机分别应用标定结果1.5.1.openCV应用标定结果1.5.2.ros…...
常量与变量:编程中重要的两种数据类型
常量与变量 在编程中,我们常常需要存储一些数据。这些数据有些是恒定不变的,有些却是可以随时变化的。对于恒定不变的数据,我们称之为常量;对于可以变化的数据,我们则称之为变量。这两种数据类型在程序中非常重要&…...
( 数组和矩阵) 287. 寻找重复数 ——【Leetcode每日一题】
❓287. 寻找重复数 难度:中等 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 你…...
【学习笔记】「JOISC 2022 Day2」复制粘贴 3
看了正解。我觉得很厉害。虽然用减枝水过去了。 区间 d p dp dp。但是这个转移怎么看都不是 O ( 1 ) O(1) O(1)的。 border \text{border} border 那么 trick \text{trick} trick应该都能看出来。能进行剪切操作当且仅当 s [ l , p ] s [ q , r ] s_{[l,p]}s_{[q,r]} s[l,p]…...
武忠祥老师每日一题||定积分基础训练(三)
常用的基本不等式: sin x < x < t a n x , x ∈ ( 0 , π 2 ) \sin x<x<\ tan x,x\in(0,\frac{\pi}{2}) sinx<x< tanx,x∈(0,2π) e x ≥ 1 x , x ∈ ( − ∞ , ∞ ) e^x\ge1x,x\in(-\infty,\infty) ex≥1x,x∈(−∞,∞) x 1 x ≤ ln …...
Docker安装常用软件-Apollo(有问题)
零:apollo概念介绍 官网网站:GitHub - apolloconfig/apollo: Apollo is a reliable configuration management system suitable for microservice configuration management scenarios. gitee网址:mirrors / ctripcorp / apollo GitCode …...
f(x)与|f(x)|,f ‘ (x),F(x)常见关系。
1.f(x)与|f(x)|关系。 1.连续关系。(f(x)在"[a,b]上连续" > |f(x)|在"[a,b]连续") ①如果f(x)在[a,b]上连续。则|f(x)|在[a,b]上连续. (因为f(x)在x0的连续点>x0必为|f(x)|的连续点) 注:”[a,b]连续“包括&#…...
今天面了一个来字节要求月薪23K,明显感觉他背了很多面试题...
最近有朋友去字节面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…...
如何使用二元三次回归分析建立预测模型?(分析、原理、代码示例)
二元三次回归是一种用于建立两个自变量与一个因变量之间关系的回归模型,常用于数据分析和预测。下面我会更详细地解释一下二元三次回归的原理、分析和示例代码。 1、原理 二元三次回归分析用多项式回归建立预测模型,其中包括两个自变量(通常…...
面向万物智联的应用框架的思考和探索(上)
原文:面向万物智联的应用框架的思考和探索(上),点击链接查看更多技术内容。 应用框架,是操作系统连接开发者生态,实现用户体验的关键基础设施。其中,开发效率和运行体验是永恒的诉求,…...
《Python机器学习基础教程》第1章学习笔记
目录 第1章 引言 1.1 为何选择机器学习 1.1.1 机器学习能够解决的问题 第1章 引言 机器学习又称为预测分析或统计学习,是一个交叉学科,是从数据中提取知识。 1.1 为何选择机器学习 智能应用早期,使用专家设计的规则体系来设计。 缺点&…...
ClickHouse 内存管理是如何实现的
概述 本文介绍Clickhouse内存管理的实现原理。通过本文的分析,可以对Clickhouse的内存管理有一个概要的理解。 Clickouse内存管理组成 ClickHouse 使用内存管理系统来控制内存资源的分配和释放。内存管理系统的主要组成部分是: 内存池:Cl…...
docker容器技术
什么是docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
