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 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独…...
设计模式七大设计原则
文章目录 1、什么是设计模式2、单一职责原则3、开闭原则4、接口隔离原则5、依赖倒置原则6、迪米特法则(最少知道原则)7、里式替换原则8、组合优于继承 设计模式主要是为了满足一个字 变,这个字,可能是需求变更、可能是场景变更&a…...
【Hello Network】TCP协议相关理解
作者:小萌新 专栏:网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:补充下对于TCP协议的各种理解 TCP协议相关实验 TCP相关试验理解CLOSE_WAIT状态理解TIME_WAIT状态解决TIME_WAIT状态引起的bind失败的方法理解listen的…...
实施CRM目标有哪几步?如何制定CRM目标?
在当今竞争激烈的商业环境中,与客户建立持久的关系是企业重要的工作。CRM客户管理系统能有效帮助企业管理优化流程、管理客户,提高销售成功率,推动收入增长。那么您了解如何实施CRM吗?下面说说实施CRM目标是什么,如何设…...
船舶建造概论(船舶建造工艺任务与现代造船模式)
船舶建造概论 1 船舶建造概论1.1 船舶建造工艺主要任务1.2 船舶建造流程(1)钢材料预处理(2) 钢材料加工(3)分段制作(4)总段制作(5)船台合拢(6&…...
项目内训(2023.5.6)
目录 Nacos是什么? 领域模型是什么? domain模块一般是干什么的? 在小乌龟中合并其他分支的作用是什么? nacos的配置文件 服务集群、服务提供、服务更加灵活庞大、消费服务、访问比较麻烦,A和B服务一起访问 系统结…...
【操作系统OS】学习笔记第二章 进程与线程(下)【哈工大李治军老师】
基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享。 特此鸣谢李治军老师,操作系统的神作! 如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡>𖥦<)!! 主页专栏有更多࿰…...
Linux命令集(Linux文件管理命令--rmdir指令篇)
Linux命令集(Linux文件管理命令--rmdir指令篇) Linux文件管理命令集(rmdir指令篇)5. rmdir(remove directory)1. 删除空的目录 folder12. 强制删除目录 folder1(包括非空目录)3. 递归删除目录及其目录下所有…...
在技术圈超卷的当下,学历到底是敲门砖还是枷锁?
前言 最近,突然之间被“孔乙己文学”刷屏了,短时间内“孔乙己文学”迅速走红,孔乙己是中国文学中的一位经典人物,他的长衫被认为是他的象征之一,孔乙己的长衫折射出很多现象,既有社会的,也有教育…...
Linux cgroup
前言 Cgroup和namespace类似,也是将进程进程分组,但是目的与namespace不一样,namespace是为了隔离进程组之前的资源,而Cgroup是为了对一组进程进行统一的资源监控和限制。 Cgroup的组成 subsystem 一个subsystem就是一个内核模…...
PID整定二:基于Ziegler-Nichols的频域响应
PID整定二:基于Ziegler-Nichols的频域响应 1参考2连续Ziegler-Nichols方法的PID整定2.1整定方法2.2仿真示例 1参考 1.1根轨迹图的绘制及分析 1.2计算机控制技术01-3.4离散系统的根轨迹分析法 1.3PID控制算法学习笔记 2连续Ziegler-Nichols方法的PID整定 2.1整定…...
wordpress主题 外贸网站/黑帽seo联系方式
本说明是以Git为托管工具发布SpringBoot的Jar包,SVN的请参考Linux环境利用SVNMavenTomcat自动发布项目工程 直接上代码 start.sh 文件 #!/bin/bash# ################################### # # # # 定义变量 …...
wordpress 网络验证/今天的新闻有哪些
读书-程序员的自我修养-链接、封装与库(10: 第四章:静态链接(3)--C问题,ABI,静态库libc.a,printf .o,hello.c 整个编译链接过程)1. C相关问题1.1 C的两个问题1.2 c 与 ABI1.2.1 ABI 定义1.2.2 ABI 和 API 的…...
网站建设 专家/优化大师软件大全
物联网技术发展趋势是LPWAN,其中尤其以NB-IoT和eMTC最为代表。NB-IoT和eMTC各有优劣,使用场景互有不同。 低功耗可以说是物联网技术的核心,本着关注低功耗的方向,适当了解NB IoT在整个LTE中的位置,NB-IoT的协议&#x…...
做农产品的网站名称/产品推广ppt范例
点击上方“蓝色字”可关注我们!暴走时评:尽管存在许多不明确法规和相应限制,但印度的大型企业和银行仍然采用加密货币 - 或至少是支持加密货币的一些技术 - 作为一种更可靠的方式来协调账户、付款、保存适当的记录和管理内部资金。根据“印度…...
网上做调查赚钱的网站/营销型网站建设套餐
Android开发之调用外部应用打开指定文件 Android应用打开另一个应用程序 Android app中调用启动其他应用(系统应用和第三方应用)2016.10.25新增android 6.0打电话api Android调用另一个App界面 Android中通过外部程序启动App的三种方法...
南京做网站公司 雷仁/西安百度推广开户运营
每一种计算机语言都有自己的自动垃圾回收机制,让程序员不必过分关心程序内存分配,php也不例外,但是在面向对象编程(OOP)编程中,有些对象需要显式的销毁;防止程序执行内存溢出。 一、PHP 垃圾回收机制(Garbage Collector 简称GC) 在…...