Unity基础实践小项目

项目流程:

需求分析

开始界面

选择角色面板

排行榜面板

设置面板

游戏面板

确定退出面板

死亡面板

UML类图

准备工作

1.导入资源

2.创建需要的文件夹

3.创建好面板基类

开始场景

开始界面

1.拼面板

2.写脚本

注意事项:注意先设置NGUI的分辨率大小,注意控件的分辨率自适应,注意 Draw Calls!

设置界面 —— 拼面板和基础逻辑

1.拼面板

2.逻辑

BegingPael 里打开设置面板

设置界面——音效数据

1.创建音效数据类

2.创建游戏数据管理类

3.SettingPanel 关联逻辑

实现了音效数据的在设置面板中的获取和修改

设置界面——背景音乐对象

1.创建音乐对象和音乐控制脚本

音乐对象

音乐控制脚本

2.设置面板 调用

排行榜界面——排行榜数据

1.排行榜数据类

2.GameDataMgr 中调用

排行榜界面——拼面板

排行榜界面——逻辑处理

1.单个排行榜控件类——RankItem

2.创建排行榜面板类

选择角色界面 —— 拼面板

选择角色界面——数据准备

1.创建数据集合

2.创建Xml配置文件

3.GameDataMgr 中调用初始化

选择角色界面——逻辑处理

1.创建 ChoosePanel 类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class ChoosePanel : BasePanel<ChoosePanel>
{//各按钮public UIButton btnClose;public UIButton btnLeft;public UIButton btnRight;public UIButton btnStart;//模型父对象public Transform heroPos;//下方属性相关对象public List<GameObject> hpObjs;public List<GameObject> speedObjs;public List<GameObject> volumeObjs;//当前显示的飞机模型对象private GameObject airPlaneObj;public override void Init(){//选择角色后 点击开始 切换场景btnStart.onClick.Add(new EventDelegate(() =>{SceneManager.LoadScene("GameScene");}));btnLeft.onClick.Add(new EventDelegate(() =>{//左按钮 减我们设定的索引--GameDataMgr.Instance.nowSelHeroIndex;//如果 小于最小的索引 直接让其等于 最后一个索引if (GameDataMgr.Instance.nowSelHeroIndex < 0)GameDataMgr.Instance.nowSelHeroIndex = GameDataMgr.Instance.roleData.roleList.Count - 1;ChangeNowHero();}));btnRight.onClick.Add(new EventDelegate(() =>{//右按钮 加我们设定的索引++GameDataMgr.Instance.nowSelHeroIndex;//如果大于了最大索引 就置0if (GameDataMgr.Instance.nowSelHeroIndex > GameDataMgr.Instance.roleData.roleList.Count - 1)GameDataMgr.Instance.nowSelHeroIndex = 0;ChangeNowHero();}));btnClose.onClick.Add(new EventDelegate(() =>{//关闭自己HideMe();//显示开始面板BeginPanel.Instance.ShowMe();}));HideMe();}public override void ShowMe(){base.ShowMe();//每次显示的时候都从第一个开始GameDataMgr.Instance.nowSelHeroIndex = 0;ChangeNowHero();}public override void HideMe(){base.HideMe();//删除当前模型DestroyObj();}//切换当前的选择private void ChangeNowHero(){//得到当前选择的 玩家游戏数据RoleInfo info = GameDataMgr.Instance.GetNowSelHeroInfo();//更新模型//先删除上一次的飞机模型DestroyObj();//再创建当前的飞机模型airPlaneObj = Instantiate(Resources.Load<GameObject>(info.resName));//设置父对象airPlaneObj.transform.SetParent(heroPos);//设置角度和位置 缩放airPlaneObj.transform.localPosition = Vector3.zero;airPlaneObj.transform.localRotation = Quaternion.identity;airPlaneObj.transform.localScale = Vector3.one * info.scale;//修改层级airPlaneObj.layer = LayerMask.NameToLayer("UI");//更新属性for (int i = 0; i < 10; i++){hpObjs[i].SetActive(i < info.hp);speedObjs[i].SetActive(i < info.speed);volumeObjs[i].SetActive(i < info.volume);}}/// <summary>/// 用于删除上一次显示的模型对象/// </summary>private void DestroyObj(){if(airPlaneObj != null){//移除场景的模型Destroy(airPlaneObj);//置空airPlaneObj = null;}}private float time;//是否鼠标选中 模型private bool isSel;// Update is called once per framevoid Update(){//让飞机 上下浮动time += Time.deltaTime;heroPos.Translate(Vector3.up * Mathf.Sin(time) * 0.0001f, Space.World);//射线检测 让飞机 可以左右转动if (Input.GetMouseButtonDown(0)){//如果点击了 UI层碰撞器 认为需要开始 拖动 飞机了if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),1000,1 << LayerMask.NameToLayer("UI"))){isSel = true;}}//抬起 取消选中if (Input.GetMouseButtonUp(0))isSel = false;//旋转对象if (Input.GetMouseButton(0) && isSel){heroPos.rotation *= Quaternion.AngleAxis(Input.GetAxis("Mouse X") * 20, Vector3.up);}}
}

2.GameDataMgr 中逻辑关联

3.BeginPanel 中显隐设置

注意:模型旋转时,发射射线检测的摄像机要是主摄像机,或者就自己指定摄像机发射。

游戏场景

游戏界面

1.拼面板

2.逻辑面板

确定退出界面

1.拼面板

2.写逻辑

3.调用

GamePanel 中调用

结束界面

1.拼面板

2.写逻辑

游戏主逻辑——主玩家相关

1.加一个相加来渲染

一个专门渲染特效

一个专门渲染UI

一个专门渲染其他

2.玩家逻辑

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerObject : MonoBehaviour
{//血量public int nowHp;public int maxHp;//速度public int speed;//旋转速度public int roundSpeed;//目标四元数角度private Quaternion targetQ;//是否死亡public bool isDead;//当前世界坐标系转屏幕上的点private Vector3 nowPos;//上一次玩家的位置 就是在位移前 玩家的位置private Vector3 frontPos;public void Dead(){isDead = true;//显示游戏结束面板GameOverPanel.Instance.ShowMe();}public void Wound(){if (isDead)return;//减血this.nowHp -= 1;//更新游戏面板上的血量显示GamePanel.Instance.ChangeHp(this.nowHp);//是否死亡了if (this.nowHp <= 0)this.Dead();}private float hValue;private float vValue;// Update is called once per framevoid Update(){//如果死亡了 就没有必要移动了if (isDead)return;//移动 旋转逻辑//旋转hValue = Input.GetAxisRaw("Horizontal");vValue = Input.GetAxisRaw("Vertical");//如果没有按我们的AD键 那么目标角度 就是(0,0,0)度if (hValue == 0)targetQ = Quaternion.identity;//如果按AD键 就是(0,0,20)或者 (0,0,-20) 根据按的左右决定elsetargetQ = hValue < 0 ? Quaternion.AngleAxis(20, Vector3.forward) : Quaternion.AngleAxis(-20, Vector3.forward);//让飞机朝着 这个目标四元数 去旋转this.transform.rotation = Quaternion.Slerp(this.transform.rotation, targetQ, roundSpeed * Time.deltaTime);//在位移之前 记录 之前的位置frontPos = this.transform.position;//移动this.transform.Translate(Vector3.forward * vValue * speed * Time.deltaTime);this.transform.Translate(Vector3.right * hValue * speed * Time.deltaTime, Space.World);//进行极限判断nowPos = Camera.main.WorldToScreenPoint(this.transform.position);//左右 溢出判断if(nowPos.x < 0 || nowPos.x >= Screen.width){this.transform.position = new Vector3(frontPos.x, this.transform.position.y, this.transform.position.z);}//上下 溢出判断if(nowPos.y < 0 || nowPos.y >= Screen.height){this.transform.position = new Vector3(this.transform.position.x, this.transform.position.y, frontPos.z);}}
}

游戏主逻辑——子弹相关

数据准备

1.制作子弹 和 子弹爆炸特效

2.子弹数据类

3.Xml文件配置

4. GameDataMgr 管理初始化

写逻辑

1.创建 BullteObject 脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class BulletObject : MonoBehaviour
{//子弹使用的数据private BulletInfo info;//用于曲线移动的 计时变量private float time;//初始化子弹数据的方法public void InitInfo(BulletInfo info){this.info = info;//根据生命周期函数 决定自己什么时候 延迟移除//Destroy(this.gameObject, info.lifeTime);//两种方式来移除 Destroy和延迟函数 看看哪种方法更合适Invoke("DealyDestroy", info.lifeTime);}private void DealyDestroy(){Destroy(this.gameObject);}//销毁场景上的子弹public void Dead(){//创建死亡特效GameObject eff = Instantiate(Resources.Load<GameObject>(this.info.deadEffRes));//设置特效的位置 创建在当前子弹的位置eff.transform.position = this.transform.position;//1秒后延迟移除特效Destroy(eff, 1f);//销毁子弹对象Destroy(this.gameObject);}//和对象碰撞时 (触发)private void OnTriggerEnter(Collider other){if (other.gameObject.CompareTag("Player")){//得到玩家脚本PlayerObject obj = other.GetComponent<PlayerObject>();//玩家受伤减血obj.Wound();//销毁自己 就是直接调用 Dead方法Dead();}}// Update is called once per framevoid Update(){//所有移动的共同特点 都是朝自己的面朝向动this.transform.Translate(Vector3.forward * info.forwardSpeed * Time.deltaTime);//接着再来处理 其他的移动逻辑//1 代表 只朝自己面朝向移动 直线移动//2 代表 曲线运动//3 代表 右抛物线//4 代表 左抛物线//5 代表 跟踪移动switch (info.type){case 2:time += Time.deltaTime;//sin里面值变化的快慢 决定了 左右变化的频率//乘以的速度 变化的大小 决定了 左右位移的多少this.transform.Translate(Vector3.right * info.rightSpeed * Time.deltaTime * Mathf.Sin(time * info.roundSpeed));break;case 3://右抛物线 无非 就是 去改变 旋转角度this.transform.rotation *= Quaternion.AngleAxis(info.roundSpeed * Time.deltaTime, Vector3.up);break;case 4://左抛物线 无非 就是 去改变 旋转角度this.transform.rotation *= Quaternion.AngleAxis(-info.roundSpeed * Time.deltaTime, Vector3.up);break;case 5://跟踪移动 不停的计算 玩家和我之间的方向向量 得到四元数 然后自己的角度 不停的 变化为这个目标四元数this.transform.rotation = Quaternion.Slerp(this.transform.rotation,Quaternion.LookRotation(PlayerObject.Instance.transform.position - this.transform.position), info.roundSpeed * Time.deltaTime);break;}}
}

2.测试

游戏主逻辑——开火点相关

数据准备

1.创建开火点数据 —— FireData

2.配置Xml文件

3. GameDataMgr 中初始化

逻辑处理一

主要实现了绘制开火点位置

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 表示 开火点位置的 类型
/// </summary>
public enum E_Pos_Type
{TopLeft,Top,TopRight,Left,Right,BottonLeft,Botton,BottonRight,
}public class FireObject : MonoBehaviour
{public E_Pos_Type type;//表示屏幕上的点private Vector3 screenPos;//初始发射子弹的方向 主要用于作为散弹的初始方向 用于计算private Vector3 initDir;// Update is called once per framevoid Update(){//用于测试玩家转屏幕坐标后 横截面的 z轴值//print(Camera.main.WorldToScreenPoint(PlayerObject.Instance.transform.position));//更新 开火点位置 达到分辨率自适应UpdatePos();}//根据点的类型 来更新它的位置private void UpdatePos(){//这里设置z轴 是为了和主玩家位置转屏幕坐标后的 z位置一样 目的是 让点和玩家 所在的 横截面是一致的screenPos.z = 150.6f;switch (type){case E_Pos_Type.TopLeft:screenPos.x = 0;screenPos.y = Screen.height;initDir = Vector3.right;break;case E_Pos_Type.Top:screenPos.x = Screen.width / 2;screenPos.y = Screen.height;initDir = Vector3.right;break;case E_Pos_Type.TopRight:screenPos.x = Screen.width;screenPos.y = Screen.height;initDir = Vector3.left;break;case E_Pos_Type.Left:screenPos.x = 0;screenPos.y = Screen.height / 2;initDir = Vector3.up;break;case E_Pos_Type.Right:screenPos.x = Screen.width;screenPos.y = Screen.height / 2;initDir = Vector3.up;break;case E_Pos_Type.BottonLeft:screenPos.x = 0;screenPos.y = 0;initDir = Vector3.right;break;case E_Pos_Type.Botton:screenPos.x = Screen.width / 2;screenPos.y = 0;initDir = Vector3.right;break;case E_Pos_Type.BottonRight:screenPos.x = Screen.width;screenPos.y = 0;initDir = Vector3.left;break;}//再把屏幕点 转换为 世界坐标点 那得到的 就是我们想要的坐标点this.transform.position = Camera.main.ScreenToWorldPoint(screenPos);}
}

逻辑处理二

1.实现了重置开火点数据 和 检测开火逻辑 (代码量较多 要好好了解)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 表示 开火点位置的 类型
/// </summary>
public enum E_Pos_Type
{TopLeft,Top,TopRight,Left,Right,BottonLeft,Botton,BottonRight,
}public class FireObject : MonoBehaviour
{public E_Pos_Type type;//表示屏幕上的点private Vector3 screenPos;//初始发射子弹的方向 主要用于作为散弹的初始方向 用于计算private Vector3 initDir;//当前开火点的数据信息private FireInfo fireInfo;private int nowNum;private float nowCD;private float nowDelay;//当前组开火点 使用的子弹信息private BulletInfo nowBulletInfo;//散弹时 每颗子弹的间隔角度private float changeAngle;//用于发射散弹时 记录上一次的方向private Vector3 nowDir;// Update is called once per framevoid Update(){//用于测试玩家转屏幕坐标后 横截面的 z轴值//print(Camera.main.WorldToScreenPoint(PlayerObject.Instance.transform.position));//更新 开火点位置 达到分辨率自适应UpdatePos();//每次 都检测 是否需要 重置 开火点数据ResetFireInfo();//发射子弹UpdateFire();}//根据点的类型 来更新它的位置private void UpdatePos(){//这里设置z轴 是为了和主玩家位置转屏幕坐标后的 z位置一样 目的是 让点和玩家 所在的 横截面是一致的screenPos.z = 150.6f;switch (type){case E_Pos_Type.TopLeft:screenPos.x = 0;screenPos.y = Screen.height;initDir = Vector3.right;break;case E_Pos_Type.Top:screenPos.x = Screen.width / 2;screenPos.y = Screen.height;initDir = Vector3.right;break;case E_Pos_Type.TopRight:screenPos.x = Screen.width;screenPos.y = Screen.height;initDir = Vector3.left;break;case E_Pos_Type.Left:screenPos.x = 0;screenPos.y = Screen.height / 2;initDir = Vector3.up;break;case E_Pos_Type.Right:screenPos.x = Screen.width;screenPos.y = Screen.height / 2;initDir = Vector3.up;break;case E_Pos_Type.BottonLeft:screenPos.x = 0;screenPos.y = 0;initDir = Vector3.right;break;case E_Pos_Type.Botton:screenPos.x = Screen.width / 2;screenPos.y = 0;initDir = Vector3.right;break;case E_Pos_Type.BottonRight:screenPos.x = Screen.width;screenPos.y = 0;initDir = Vector3.left;break;}//再把屏幕点 转换为 世界坐标点 那得到的 就是我们想要的坐标点this.transform.position = Camera.main.ScreenToWorldPoint(screenPos);}//重置当前要发射的炮台数据private void ResetFireInfo(){//自己定一个规则 只有当cd和数量都为0时 才认为需要重新获取 发射点数据if (nowCD != 0 && nowNum != 0)return;//组间休息时间判断if (fireInfo != null){nowDelay -= Time.deltaTime;//还在组间休息if (nowDelay > 0)return;}//从数据中随机取出一条 来按照规则 发射子弹List<FireInfo> list = GameDataMgr.Instance.fireData.fireInfoList;fireInfo = list[Random.Range(0, list.Count)];//我们不能直接改变数据当中的内容 我们应该拿变量 临时存储下来 这样就不会影响我们数据本身nowNum = fireInfo.num;nowCD = fireInfo.cd;nowDelay = fireInfo.delay;//通过 开火点数据 取出 当前要使用的子弹数据信息//得到开始id 和 结束id 用于随机取子弹信息string[] strs = fireInfo.ids.Split(',');int beginID = int.Parse(strs[0]);int endID = int.Parse(strs[1]);int randomBulletID = Random.Range(beginID, endID + 1);nowBulletInfo = GameDataMgr.Instance.bulletData.bulletInfoList[randomBulletID - 1];//如果是散弹 就需要计算 间隔角度if (fireInfo.type == 2){switch (type){case E_Pos_Type.TopLeft:case E_Pos_Type.TopRight:case E_Pos_Type.BottonLeft:case E_Pos_Type.BottonRight:changeAngle = 90f / (nowNum + 1);break;case E_Pos_Type.Top:case E_Pos_Type.Left:case E_Pos_Type.Right:case E_Pos_Type.Botton:changeAngle = 180f / (nowNum + 1);break;}}}//检测开火private void UpdateFire(){//当前状态 是不需要发射子弹的if (nowCD == 0 && nowNum == 0)return;//cd更新nowCD -= Time.deltaTime;if (nowCD > 0)return;GameObject bullet;BulletObject bulletObj;switch (fireInfo.type){//一颗一颗的发射子弹 朝向玩家case 1://动态创建 子弹对象bullet = Instantiate(Resources.Load<GameObject>(nowBulletInfo.resName));//动态添加 子弹脚本bulletObj = bullet.AddComponent<BulletObject>();//把当前的子弹数据传入子弹脚本 进行初始化bulletObj.InitInfo(nowBulletInfo);//设置子弹的位置 和朝向bullet.transform.position = this.transform.position;bullet.transform.rotation = Quaternion.LookRotation(PlayerObject.Instance.transform.position - bullet.transform.position);//表示已经发射一颗子弹--nowNum;//重置cdnowCD = nowNum == 0 ? 0 : fireInfo.cd;break;//发射散弹case 2://无CD 一瞬间 发射所有的散弹if(nowCD == 0){for (int i = 0; i < nowNum; i++){//动态创建 子弹对象bullet = Instantiate(Resources.Load<GameObject>(nowBulletInfo.resName));//动态添加 子弹脚本bulletObj = bullet.AddComponent<BulletObject>();//把当前的子弹数据传入子弹脚本 进行初始化bulletObj.InitInfo(nowBulletInfo);//设置子弹的位置 和朝向bullet.transform.position = this.transform.position;//每次都会旋转一个角度 得到一个新的方向nowDir = Quaternion.AngleAxis(changeAngle * i, Vector3.up) * initDir;bullet.transform.rotation = Quaternion.LookRotation(nowDir);}//因为是瞬间创建完所有子弹 所以 重置数据nowCD = nowNum = 0;}else{//动态创建 子弹对象bullet = Instantiate(Resources.Load<GameObject>(nowBulletInfo.resName));//动态添加 子弹脚本bulletObj = bullet.AddComponent<BulletObject>();//把当前的子弹数据传入子弹脚本 进行初始化bulletObj.InitInfo(nowBulletInfo);//设置子弹的位置 和朝向bullet.transform.position = this.transform.position;//每次都会旋转一个角度 得到一个新的方向nowDir = Quaternion.AngleAxis(changeAngle * (fireInfo.num - nowNum), Vector3.up) * initDir;bullet.transform.rotation = Quaternion.LookRotation(nowDir);//表示已经发射一颗子弹--nowNum;//重置cdnowCD = nowNum == 0 ? 0 : fireInfo.cd;}break;}}}

2.串联 开始面板和游戏面板

创建 Main 类 用于创建玩家飞机

逻辑功能完善

1.子弹自动销毁

2.不隐藏光标

3.射线检测销毁子弹

游戏展示:

暂时无法上传!

总结

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

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

相关文章

问题:律师会见委托人的方式包括团体会见和( )。 #职场发展#笔记#学习方法

问题&#xff1a;律师会见委托人的方式包括团体会见和&#xff08; &#xff09;。 参考答案如图所示

【Python报错】已解决TypeError: can only concatenate str (not “int“) to str

成功解决“TypeError: can only concatenate str (not “int”) to str”错误的全面指南 一、引言 在Python编程中&#xff0c;字符串&#xff08;str&#xff09;和整数&#xff08;int&#xff09;是两种基本的数据类型。然而&#xff0c;当我们尝试将这两种类型的对象进行连…

[matlab]折线图之多条折线如何绘制实心圆作为标记点

使用MarkerFaceColor是标记点填充的颜色&#xff0c;b&#xff0c;表示blue&#xff0c;蓝色 plot(x, a, d--, MarkerFaceColor, b); % 绘制仿真结果的曲线如果一张图多条曲线那么每条曲线需要单独调用一次plot&#xff0c;每个plot间用hold on 连接 plot(x, a, d--, MarkerF…

通配符SSL证书快速申请攻略

一、什么是通配符SSL证书 通配符SSL证书又叫泛域名SSL证书&#xff0c;可以保护一个主域名及其所有二级子域名&#xff0c;并对该级子域名数量无限制&#xff0c;且添加新的该级子域名无须另外付费。 二、通配符SSL证书有哪些优势 1.节省时间和金钱&#xff1a;与购买和安装…

Spring Boot + URule 实现可视化规则引擎,太优雅了!

Spring Boot URule 实现可视化规则引擎&#xff0c;太优雅了&#xff01; 一、背景二、介绍三、安装使用四、基础概念整体介绍库文件变量库文件常量库文件参数库文件动作库文件规则集向导式规则集脚本式规则集 决策表其他 五、运用场景六、总结 一、背景 前段时间&#xff0c…

2、Tomcat 线程模型详解

2、Tomcat 线程模型详解 Tomcat I/O模型详解Linux I/O模型详解I/O要解决什么问题Linux的I/O模型分类 Tomcat支持的 I/O 模型Tomcat I/O 模型如何选型 网络编程模型Reactor线程模型单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 Tomcat NIO实现Tomcat 异步IO实现 Tomc…

CentOs7 JDK21 安装

CentOs7 JDK21 安装 准备工作 先检查系统是否之前已经安装了jdk 。如果已经安装的话需要卸载。 方式一&#xff1a;使用压缩包的方式 下载jdk21的压缩包 https://www.oracle.com/java/technologies/downloads/ 将下载的gz压缩包上传到服务器并解压 # 创建文件夹 (你可以自…

java web如何调用py脚本文件

Controller public class IndexController {RequestMapping("/pythonTest")ResponseBodypublic String pythonTest(){// 假设你的Python脚本名为script.pyString pythonScriptPath "D:\\project\\c1\\hello.py";ProcessBuilder processBuilder new Proce…

C51学习归纳6 --- UART串口数据通信

这一部分我认为是十分重要的&#xff0c;没有了数据的传输&#xff0c;我们做的很多事情将是没有意义的。我们一般利用串口做两件事&#xff0c;一是单片机向电脑发送信息&#xff0c;二是单片机接收电脑的信息。 一、UART原理 TXD:发送信息通道,RXD: 接收信息通道。我发送你接…

Nginx之初识

1.Nginx概述 Nginx是一个高性能的反向代理和Web服务器软件&#xff0c;因其系统资源消耗低、运行稳定且具有高性能的并发处理能力等特性&#xff0c;在互联网企业中得到广泛的应用。 2.Nginx特性 1.访问路由 现今大型网站的请求量早已不是单一Web服务器可以支撑的了。单一入口…

微服务+分库分表的自增主键ID该如何设计?

一. 前言 分布式ID 是分布式系统里面非常重要的一个组成部分&#xff0c;那么我们在设计分布式ID的时候&#xff0c;需要考虑什么问题呢&#xff1f; ❓简单结构下是怎么实现 ID 的控制的&#xff1f; 单实例系统 &#xff1a;通过时间戳&#xff0c;系统内自增&#xff0c;上…

[Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解

目录 1.正则表达式匹配1.题目链接2.算法原理详解3.代码实现 2.交错字符串1.题目链接2.算法原理详解3.代码实现 3.两个字符串的最小ASCII删除和1.题目链接2.算法原理详解3.代码实现 4.最长重复子数组1.题目链接2.算法原理详解3.代码实现 1.正则表达式匹配 1.题目链接 正则表达…

《令狐带你阅读JDK源码之简单集合ArrayList》

文章目录 Java简单集合ArrayList继承体系源码解析 总结 大家好哈&#xff0c;欢迎来到令狐小哥本期专栏&#xff0c;这期专栏主要是带着大家阅读JDK源码&#xff0c;我会分几期篇幅来介绍这个jdk源码、会进行剖析、梳理&#xff0c;欢迎大家指正阅读。后面我会配套自己的视频进…

计算机网络 期末复习(谢希仁版本)第2章

物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。4 个特性&#xff1a; 机械特性&#xff1a;指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等。 电气特性&#xff1a;指明在接口电缆的各条线上出现…

【python进阶】python图形化编程之美--tkinter模块初探

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

白酒:茅台镇白酒的地域特色与环境优势

茅台镇&#xff0c;位于中国贵州省仁怀市&#xff0c;因其与众不同的自然环境和酿酒工艺而成为世界著名的白酒产区。作为茅台镇的品牌&#xff0c;云仓酒庄豪迈白酒以其卓着的品质和口感赢得了广大消费者的喜爱。而这一切&#xff0c;都离不开茅台镇的地域特色和环境优势。 茅台…

Python 知识图谱补全,Knowledge Graph Completion,基于大模型的知识图谱补全,基于LLMs的KGC任务

今天讲一篇文章《Exploring Large Language Models for Knowledge Graph Completion》 &#xff0c;这篇文章主题&#xff1a;基于大模型做知识图谱补全 1.文章主要思想&#xff1a; 本章描述知识图谱补全中的三个任务&#xff1a;三元组分类、关系预测和实体(链接)预测&…

C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点

前言&#xff1a; 在前面&#xff0c;我们已经学习了STL中的string和vector&#xff0c;现在就来讲解STL中的最后一个部分——list的使用及其相关知识点&#xff0c;先说明一点&#xff0c;因为我们之前已经讲过了string和vector的接口函数等用法&#xff0c;list的这些用法与它…

python_将二维列表转换成HTML格式_邮件相关

python_将二维列表转换成HTML_邮件相关 data[["理想","2"],["理想2","3"]]def list_to_html_table(data):"""将二维列表转换为HTML表格格式的字符串。参数:data -- 二维列表&#xff0c;表示表格的数据。返回:一个字符…

美财长耶伦警告:金融行业广泛应用AI带来潜在“重大风险”

内容概述 耶伦承认&#xff0c;人工智能用在金融领域可降低交易成本、提高效率、检测欺诈和增加服务可及性&#xff0c;但也伴随风险。AI模型的复杂性和不透明度、供应商高度集中、产生数据缺陷或偏见等AI相关风险&#xff0c;已成为美国金融监管机构的首要议题。 6月6日周四&…