fc坦克大战游戏完美复刻

文章目录

  • 一、 介绍
  • 二、 制作基本物体
  • 三、 控制玩家坦克移动、转向
  • 四、 子弹脚本、爆炸脚本
  • 五、 敌人AI寻路算法
  • 六、 坦克生成点脚本
  • 七、 用链表实例化地图
  • 八、 玩家游戏控制器脚本
  • 九、 添加音效
  • 十、 资源包


一、 介绍

儿时经典游戏《坦克大战》完整复刻
发射子弹、生成敌人、消灭敌人、保护老巢、记录生命值。

在这里插入图片描述

在这里插入图片描述


二、 制作基本物体

制作玩家坦克
制作敌人坦克
制作玩家心脏
制作玩家保护罩
制作河流
制作砖头墙
制作铁墙
制作出生位置
制作出生动画

在这里插入图片描述


三、 控制玩家坦克移动、转向

wsad移动
数组控制转向
定义子弹发射时间间隔
发射子弹
坦克死亡效果

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

  //定义坦克的移动速度属性
public float moveSpeed=3;

//定义子弹的旋转角度
private Vector3 bullectEulerAngles;

//定义攻击CD时间
private float timeVal;

//定义无敌状态持续时间
private float defendTimeVal=3;

//定义是否处于无敌状态
private bool isDefended=true;

//引用组件
private SpriteRenderer sr; //获取坦克的SpriteRenderer组件
public Sprite[] tankSprite; //存储坦克的四个方向的图片
public GameObject bullectPrefab; //存储子弹的预制体
public GameObject explosionPrefab; //存储爆炸特效的预制体
public GameObject defendEffectPrefab; //存储无敌特效的预制体
public AudioSource moveAudio; //获取坦克的AudioSource组件
public AudioClip[] tankAudio; //存储坦克的音效

    private void Awake()
    {
        sr = GetComponent<SpriteRenderer>();
    }

    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        //是否处于无敌状态
        if (isDefended)
        {
            defendEffectPrefab.SetActive(true);
            defendTimeVal -= Time.deltaTime;
            if (defendTimeVal<=0)
            {
                isDefended = false;
                defendEffectPrefab.SetActive(false);
            }
        }

        
       
    }

    private void FixedUpdate()
    {
        if (PlayerManager.Instance.isDefeat)
        {
            return;
        }
        Move();
        //攻击的CD
        if (timeVal >= 0.4f)
        {
            Attack();
        }
        else
        {
            timeVal += Time.fixedDeltaTime;
        }


    }

    //坦克的攻击方法
    private void Attack()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {

            //子弹产生的角度:当前坦克的角度+子弹应该旋转的角度。
            Instantiate(bullectPrefab, transform.position,Quaternion.Euler(transform.eulerAngles+bullectEulerAngles));
            timeVal = 0;
        }
    }


    //坦克的移动方法
    private void Move()
    {
        float v = Input.GetAxisRaw("Vertical");


        transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);

        if (v < 0)
        {
            sr.sprite = tankSprite[2];
            bullectEulerAngles = new Vector3(0, 0, -180);
        }

        else if (v > 0)
        {
            sr.sprite = tankSprite[0];
            bullectEulerAngles = new Vector3(0, 0, 0);
        }

        if (Mathf.Abs(v)>0.05f)
        {
            moveAudio.clip = tankAudio[1];
            
            if (!moveAudio.isPlaying)
            {
                moveAudio.Play();
            }
        }

        if (v != 0)
        {
            return;
        }

        float h = Input.GetAxisRaw("Horizontal");
        transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);
        if (h < 0)
        {
            sr.sprite = tankSprite[3];
            bullectEulerAngles = new Vector3(0, 0, 90);
        }

        else if (h > 0)
        {
            sr.sprite = tankSprite[1];
            bullectEulerAngles = new Vector3(0, 0, -90);
        }

        if (Mathf.Abs(h) > 0.05f)
        {
            moveAudio.clip = tankAudio[1];

            if (!moveAudio.isPlaying)
            {
                moveAudio.Play();
            }
        }
        else
        {
            moveAudio.clip = tankAudio[0];

            if (!moveAudio.isPlaying)
            {
                moveAudio.Play();
            }
        }
    }

    //坦克的死亡方法
    private void Die()
    {
        if (isDefended)
        {
            return;
        }

        PlayerManager.Instance.isDead = true;

        //产生爆炸特效
        Instantiate(explosionPrefab, transform.position, transform.rotation);
        //死亡
        Destroy(gameObject);
    }	
}





四、 子弹脚本、爆炸脚本

子弹撞击不同的物体,会有不同的效果
播放爆炸动画效果
设置子弹移动速度
检测是否为玩家子弹
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullect : MonoBehaviour {

    public float moveSpeed = 10;

    public bool isPlayerBullect;


	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        transform.Translate(transform.up * moveSpeed * Time.deltaTime, Space.World);
	}


    private void OnTriggerEnter2D(Collider2D collision)
    {
        switch (collision.tag)
        {
            case "Tank":
                if (!isPlayerBullect)
                {
                    collision.SendMessage("Die");
                    Destroy(gameObject);
                }
                break;
            case "Heart":
                collision.SendMessage("Die");
                Destroy(gameObject);
                break;
            case "Enemy":
                if (isPlayerBullect)
                {
                    collision.SendMessage("Die");
                    Destroy(gameObject);
                }
                
                break;
            case "Wall":
                Destroy(collision.gameObject);
                Destroy(gameObject);
                break;
            case "Barrier":
                if (isPlayerBullect)
                {
                    collision.SendMessage("PlayAudio");
                }
                Destroy(gameObject);
                break;
            default:
                break;
        }
    }

}

爆炸效果
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Explosion : MonoBehaviour {

	// Use this for initialization
	void Start () {
        Destroy(gameObject, 0.167f);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}


五、 敌人AI寻路算法

敌人在上面有三个刷新点
出生后每三秒发射一枚子弹
敌人走动的方向,是random随机值,往下走的概率最大
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour {

    //属性值
    public float moveSpeed = 3;
    private Vector3 bullectEulerAngles; // 子弹的旋转角度
    private float v = -1; // 坦克的竖直方向的移动量
    private float h; // 坦克的水平方向的移动量

    //引用
    private SpriteRenderer sr; // 坦克的SpriteRenderer组件
    public Sprite[] tankSprite; // 坦克朝向四个方向的精灵
    public GameObject bullectPrefab; // 子弹的预制体
    public GameObject explosionPrefab; // 爆炸特效的预制体

    //计时器
    private float timeVal; // 攻击计时器
    private float timeValChangeDirection; // 改变方向计时器

    private void Awake()
    {
        sr = GetComponent<SpriteRenderer>(); // 获取坦克的SpriteRenderer组件
    }

    void Start()
    {

    }

    void Update()
    {
        //攻击的时间间隔
        if (timeVal >= 3) // 如果攻击计时器大于等于3秒
        {
            Attack(); // 调用坦克的攻击方法
        }
        else
        {
            timeVal += Time.deltaTime; // 否则,增加攻击计时器的值
        }

    }

    private void FixedUpdate()
    {
        Move(); // 每一帧调用坦克的移动方法
    }

    //坦克的攻击方法
    private void Attack()
    {
       //子弹产生的角度:当前坦克的角度+子弹应该旋转的角度。
       Instantiate(bullectPrefab, transform.position, Quaternion.Euler(transform.eulerAngles + bullectEulerAngles)); // 实例化子弹预制体
       timeVal = 0; // 重置攻击计时器的值
    }

   //坦克的移动方法
private void Move()
{
    // 当计时器 timeValChangeDirection 大于等于4时,改变坦克的移动方向
    if (timeValChangeDirection >= 4)
    {
        // 随机一个数值
        int num = Random.Range(0, 8);
        if (num > 5)
        {
            v = -1;
            h = 0;
        }
        else if (num == 0)
        {
            v = 1;
            h = 0;
        }
        else if (num > 0 && num <= 2)
        {
            h = -1;
            v = 0;
        }
        else if (num > 2 && num <= 4)
        {
            h = 1;
            v = 0;
        }
        // 重置计时器
        timeValChangeDirection = 0;
    }
    else
    {
        // 计时器加上时间差
        timeValChangeDirection += Time.fixedDeltaTime;
    }

    // 沿着当前方向移动坦克
    transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);

    // 根据当前方向改变坦克的朝向
    if (v < 0)
    {
        sr.sprite = tankSprite[2];
        bullectEulerAngles = new Vector3(0, 0, -180);
    }
    else if (v > 0)
    {
        sr.sprite = tankSprite[0];
        bullectEulerAngles = new Vector3(0, 0, 0);
    }

    // 如果坦克在竖直方向上,则不进行水平方向的移动
    if (v != 0)
    {
        return;
    }

    // 沿着当前方向移动坦克
    transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);

    // 根据当前方向改变坦克的朝向
    if (h < 0)
    {
        sr.sprite = tankSprite[3];
        bullectEulerAngles = new Vector3(0, 0, 90);
    }
    else if (h > 0)
    {
        sr.sprite = tankSprite[1];
        bullectEulerAngles = new Vector3(0, 0, -90);
    }
}

//坦克的死亡方法
private void Die()
{
    // 玩家得分加1
    PlayerManager.Instance.playerScore++;
    // 产生爆炸特效
    Instantiate(explosionPrefab, transform.position, transform.rotation);
    // 销毁坦克
    Destroy(gameObject);
}

// 当坦克与其他游戏对象发生碰撞时,检测是否为敌方坦克,如果是,则重置移动方向
private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.tag == "Enemy")
    {
        timeValChangeDirection = 4;
    }
}

六、 坦克生成点脚本

上面三个出生点刷新敌人坦克,有两种坦克,随机产生一种
下面两个出生点刷新玩家坦克
延时调用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Born : MonoBehaviour {
    // 玩家坦克预制件
    public GameObject playerPrefab;
    // 敌人坦克预制件数组
    public GameObject[] enemyPrefabList;
    // 是否产生玩家坦克
    public bool createPlayer;

    // Use this for initialization
    void Start () {
        // 延迟1秒后执行 BornTank 方法
        Invoke("BornTank", 1f);
        // 一秒后销毁当前游戏对象
        Destroy(gameObject, 1);
    }
    
    // Update is called once per frame
    void Update () {
        
    }

    // 产生坦克的方法
    private void BornTank()
    {
        if (createPlayer)
        {
            // 产生玩家坦克
            Instantiate(playerPrefab, transform.position, Quaternion.identity);
        }
        else
        {
            // 随机选择一种敌人坦克类型
            int num = Random.Range(0, 2);
            // 产生敌人坦克
            Instantiate(enemyPrefabList[num], transform.position, Quaternion.identity);
        }
    }
}

七、 用链表实例化地图

游戏地图并不是预先设置好的,是随机生成的(除了心脏),每次都不一样

在这里插入图片描述

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MapCreation : MonoBehaviour {

    // 用来装饰初始化地图所需物体的数组。
    // 0.老家 1.墙 2.障碍 3.出生效果 4.河流 5.草 6.空气墙
    public GameObject[] item;

    //已经有东西的位置列表
    private List<Vector3> itemPositionList = new List<Vector3>();

    private void Awake()
    {
        InitMap();
    }

    private void InitMap()
    {
        //实例化老家
        CreateItem(item[0], new Vector3(0, -8, 0), Quaternion.identity);
        //用墙把老家围起来
        CreateItem(item[1], new Vector3(-1, -8, 0), Quaternion.identity);
        CreateItem(item[1], new Vector3(1, -8, 0), Quaternion.identity);
        for (int i = -1; i < 2; i++)
        {
            CreateItem(item[1], new Vector3(i, -7, 0), Quaternion.identity);
        }
        //实例化外围墙
        for (int i = -11; i < 12; i++)
        {
            CreateItem(item[6], new Vector3(i, 9, 0), Quaternion.identity);
        }
        for (int i = -11; i < 12; i++)
        {
            CreateItem(item[6], new Vector3(i, -9, 0), Quaternion.identity);
        }
        for (int i = -8; i < 9; i++)
        {
            CreateItem(item[6], new Vector3(-11, i, 0), Quaternion.identity);
        }
        for (int i = -8; i < 9; i++)
        {
            CreateItem(item[6], new Vector3(11, i, 0), Quaternion.identity);
        }

        //初始化玩家
        GameObject go = Instantiate(item[3], new Vector3(-2, -8, 0), Quaternion.identity);
        go.GetComponent<Born>().createPlayer = true;

        //产生敌人
        CreateItem(item[3], new Vector3(-10, 8, 0), Quaternion.identity);
        CreateItem(item[3], new Vector3(0, 8, 0), Quaternion.identity);
        CreateItem(item[3], new Vector3(10, 8, 0), Quaternion.identity);

        InvokeRepeating("CreateEnemy", 4, 5);

        //实例化地图
        for (int i = 0; i < 60; i++)
        {
            CreateItem(item[1], CreateRandomPosition(), Quaternion.identity);
        }
        for (int i = 0; i < 20; i++)
        {
            CreateItem(item[2], CreateRandomPosition(), Quaternion.identity);
        }
        for (int i = 0; i < 20; i++)
        {
            CreateItem(item[4], CreateRandomPosition(), Quaternion.identity);
        }
        for (int i = 0; i < 20; i++)
        {
            CreateItem(item[5], CreateRandomPosition(), Quaternion.identity);
        }
    }

    // 创建物体的方法
    private void CreateItem(GameObject createCameObject, Vector3 createPosition, Quaternion createRotation)
    {
        GameObject itemGo = Instantiate(createCameObject, createPosition, createRotation);
        itemGo.transform.SetParent(gameObject.transform);
        itemPositionList.Add(createPosition);
    }

  // 产生随机位置的方法
private Vector3 CreateRandomPosition()
{
    // 不生成x=-10,10的两列,y=-8,8正两行的位置
    while (true)
    {
        Vector3 createPosition = new Vector3(Random.Range(-9, 10), Random.Range(-7, 8), 0);
        
        // 判断是否该位置是否已经存在
        if (!HasThePosition(createPosition))
        {
            return createPosition;
        }
    }
}

//用来判断位置列表中是否有这个位置
private bool HasThePosition(Vector3 createPos)
{
    // itemPositionList 是之前记录所有敌人和道具生成位置的列表
    for (int i = 0; i < itemPositionList.Count; i++)
    {
        if (createPos == itemPositionList[i])
        {
            return true;
        }
    }
    
    return false;
}

//产生敌人的方法
private void CreateEnemy()
{
    int num = Random.Range(0, 3);
    Vector3 EnemyPos = new Vector3();
    
    // 随机选择一个 Y 轴最高(即在顶部)的位置作为敌人的位置
    if (num == 0)
    {
        EnemyPos = new Vector3(-10, 8, 0);
    }
    else if (num == 1)
    {
        EnemyPos = new Vector3(0, 8, 0);
    }
    else
    {
        EnemyPos = new Vector3(10, 8, 0);
    }
    
    // 生成敌人
    CreateItem(item[3], EnemyPos, Quaternion.identity);
}

心脏周边的墙体不是随机的,每次都必须预先设定好

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Heart : MonoBehaviour {
    // SpriteRenderer组件,用于设置坦克被击中后显示的图片
    private SpriteRenderer sr;
    // 爆炸特效预制件
    public GameObject explosionPrefab;
    // 死亡音效
    public AudioClip dieAudio;
    // 被击中后显示的破碎图片
    public Sprite BrokenSprite;

    // Use this for initialization
    void Start () {
        // 获取SpriteRenderer组件
        sr = GetComponent<SpriteRenderer>();
    }
    
    // ...

    // 坦克死亡的方法
    public void Die()
    {
        // 将坦克的SpriteRenderer组件的图片设置为破碎图片
        sr.sprite = BrokenSprite;
        // 产生爆炸特效
        Instantiate(explosionPrefab, transform.position, transform.rotation);
        // 设置PlayerManager类中的isDefeat变量为true,表示游戏失败
        PlayerManager.Instance.isDefeat = true;
        // 在坦克死亡的位置播放死亡音效
        AudioSource.PlayClipAtPoint(dieAudio, transform.position);
    }
}

八、 玩家游戏控制器脚本

负责游戏的基本逻辑
设置玩家生命值
设置分数
using System.Collections; // 导入系统集合命名空间
using System.Collections.Generic; // 导入泛型集合命名空间
using UnityEngine; // 导入 Unity 引擎命名空间
using UnityEngine.UI; // 导入 Unity 引擎 UI 命名空间
using UnityEngine.SceneManagement; // 导入 Unity 引擎场景管理命名空间

public class PlayerManager : MonoBehaviour { // 声明一个名为 PlayerManager 的类并继承自 MonoBehaviour

    // 属性值
    public int lifeValue = 3; // 玩家生命值,默认为 3
    public int playerScore = 0; // 玩家分数,默认为 0
    public bool isDead; // 是否死亡,默认为 false
    public bool isDefeat; // 是否失败,默认为 false

    // 引用
    public GameObject born; // 出生点游戏对象
    public Text playerScoreText; // 显示玩家分数的文本对象
    public Text PlayerLifeValueText; // 显示玩家生命值的文本对象
    public GameObject isDefeatUI; // 显示失败界面的游戏对象

    // 单例
    private static PlayerManager instance; // 声明一个静态的 PlayerManager 对象

    public static PlayerManager Instance // 声明一个静态的 Instance 属性
    {
        get
        {
            return instance; // 返回 instance 对象
        }

        set
        {
            instance = value; // 设置 instance 对象
        }
    }

    private void Awake() // Awake 方法在脚本实例被加载时执行
    {
        Instance = this; // 设置 instance 对象为当前实例
    }

    // Use this for initialization
    void Start () { // Start 方法在脚本实例被启用时执行,本例中未实现
		
	}
	
	// Update is called once per frame
	void Update () { // Update 方法在每一帧渲染时执行
        if (isDefeat) // 如果失败
        {
            isDefeatUI.SetActive(true); // 显示失败界面
            Invoke("ReturnToTheMainMenu", 3); // 延迟 3 秒后返回主界面
            return; // 返回
        }
        if (isDead) // 如果死亡
        {
            Recover(); // 复活
        }
        playerScoreText.text = playerScore.ToString(); // 更新分数文本
        PlayerLifeValueText.text = lifeValue.ToString(); // 更新生命值文本
	}

    private void Recover() // 复活方法
    {
        if (lifeValue<=0) // 如果生命值小于等于 0
        {
            // 游戏失败,返回主界面
            isDefeat = true; // 设置失败状态为 true
            Invoke("ReturnToTheMainMenu", 3); // 延迟 3 秒后返回主界面
        }
        else // 如果生命值大于 0
        {
            lifeValue--; // 生命值减一
            GameObject go = Instantiate(born, new Vector3(-2, -8, 0), Quaternion.identity); // 在出生点位置实例化玩家
            go.GetComponent<Born>().createPlayer = true; // 设置出生点的 createPlayer 属性为 true
            isDead = false; // 设置死亡状态为 false
        }
    }

    private void ReturnToTheMainMenu() // 返回主界面方法
    {
        SceneManager.LoadScene(0); // 加载场景 0
    }
}

九、 添加音效

添加游戏音效、坦克行进音效、开火音效。
增加双人模式。
添加ui
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Option : MonoBehaviour {

    private int choice = 1;
    public Transform posOne;
    public Transform posTwo;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.W))
        {
            choice = 1;
            transform.position = posOne.position;
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            choice = 2;
            transform.position = posTwo.position;
        }
        if (choice==1&&Input.GetKeyDown(KeyCode.Space))
        {
            SceneManager.LoadScene(1);
        }
	}
}

在这里插入图片描述

十、 资源包

https://pan.baidu.com/s/1eGVzYU-pQLZntuGcFfm0Ww

密码:exqi

工程文件私






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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

巧用千寻位置GNSS软件|一文教会横断面测量

测横断面主要用于线路工程和水利工程的前期设计中&#xff0c;在线路平曲线设计好之后&#xff0c;千寻位置GNSS软件可用于在中桩处测定垂直于线路中线方向原地貌的地面起伏的数据&#xff0c;本期就为大家介绍具体的操作技巧。 点击【测量】->【测横断面】&#xff0c;选择…

java——最小的K个数

题目链接 牛客在线oj题——最小的K个数 题目描述 给定一个长度为 n 的可能有重复值的数组&#xff0c;找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围&#xff1a;0≤k,n≤10000&…

Flink之TaskManager内存解析

一、CK失败 Flink任务的checkpoint操作失败大致分为两种情况&#xff0c;ck decline和ck expire: &#xff08;1&#xff09;ck decline 发生ck decline情况时&#xff0c;我们可以通过查看JobManager.log或TaskManager.log查明具体原因。其中有一种特殊情况为ck cancel&…

idea使用 ( 二 ) 创建java项目

3.创建java项目 3.1.创建普通java项目 3.1.1.打开创建向导 接 2.3.1.创建新的项目 也可以 从菜单选择建立项目 会打开下面的选择界面 3.1.2.不使用模板 3.1.3.设置项目名 Project name : 项目名 Project location : 项目存放的位置 确认创建 3.1.4.关闭tips 将 Dont s…

增强型PID-自适应-前馈-神经网络控制研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

解决docker启动mysql无法输入中文以及中文不显示或乱码问题

前言 我在使用MySQL时&#xff0c;遇到了两个问题。一是在插入中文数据时&#xff0c;无法输入中文。二是在select的时候&#xff0c;查出来的中文数据是空的&#xff08;因为插入时为空&#xff09;&#xff0c;然后我就使用Navicat连接数据库添加了中文数据&#xff0c;再到…

搭建家庭影音媒体中心 --公网远程连接Jellyfin流媒体服务器

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 转载自远程穿透的文章&…

人工智能时代来临,殊不知低代码早已出手

科普一下人工智能的等级划分&#xff0c;按照实力&#xff0c;人工智能可以分为弱人工智能(Artificial Narrow Intelligence&#xff0c;简称ANI)、强人工智能(Artificial General Intelligence简称AGI)、超人工智能(Artificial Superintelligence简称ASI)三个等级。 弱人工智能…

JavaWeb学习------Servlet

目录 JavaWeb学习------Servlet Servlet 生命周期 Servlet 生命周期 Servlet 方法介绍 •Servlet 体系结构 Servlet 体系结构 •Servlet urlPattern配置 Servlet urlPattern配置 •XML 配置方式编写 Servlet XML 配置方式编写 Servlet JavaWeb学习------Servlet •快速…

【汽车品牌案例02-设置右侧索引 Objective-C语言】

一、刚才我们说了一下,如何把那个汽车品牌加载起来,我们使用了一个模型的嵌套,以及我们在创建单元格的时候,是不是指定了一个,单元格的可重用ID吧, 1.根据重用ID来创建单元格,那么我们运行的时候,已经能把这个大致的效果做出来了, 大致就是这么一个效果, 接下来,还…

【剧前爆米花--爪哇岛寻宝】网络互连,网络通信和网络分层

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于网络初识的文章&#xff0c;在这篇文章中讲解了局域网广域网&#xff0c;IP地址&#xff0c;端口以及网络分层等相关内容&#xff0c;希望对你有所帮助&#xff01; 目录 网络互连…

PyTorch中的交叉熵函数 CrossEntropyLoss的计算过程

CrossEntropyLoss() 函数联合调用了 nn.LogSoftmax() 和 nn.NLLLoss()。 关于交叉熵函数的公式详见&#xff1a; 交叉熵损失函数原理详解 CrossEntropyLoss() 函数的计算过程可以拆解为如下四个步骤&#xff1a; 1、对输出的结果进行softmax操作,因为softmax操作可以将所有输入…

基于虚拟同步发电机的光伏混合储能并网系统MATLAB仿真

资源地址&#xff1a; 主要模块&#xff1a; 光伏电池模型&#xff08;按照数学模型搭建&#xff09;、蓄电池储能模块、超级电容储能模块、双向DC/DC模块、LC滤波器、逆变器VSG控制模块电压电流双环控制模块、光伏MPPT控制模块、储能系统充放电控制模块。 使用MATLAB2021b及…

09-Node.js—express框架

目录 1、express 介绍2、express 使用2.1 express 下载2.2 express 初体验 3、express 路由3.1 什么是路由3.2 路由的使用3.2.1使用Ajax发送一次post请求 3.3 获取请求参数 3.4 获取路由参数3.5 路由参数练习 4、express 响应设置5、express 中间件5.1 什么是中间件5.2 中间件的…

Linux 利用网络同步时间

yum -y install ntp ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ntpdate ntp1.aliyun.com 创建加入crontab echo "*/20 * * * * /usr/sbin/ntpdate -u ntp.api.bz >/dev/null &" >> /var/spool/cron/rootntp常用服务器 中国国家授…

活动目录(Active Directory)安全审计

延迟响应变化的影响可能会使原本应该微不足道的颠簸滚雪球变成无法弥补的损害。这在 Windows Active Directory 环境中更为重要&#xff0c;因为这种延迟造成的损害可能会使组织损失数百万美元&#xff01;在这种情况下&#xff0c;需要一个警惕的警报系统&#xff0c;该系统可…

(下)苹果有开源,但又怎样呢?

一开始&#xff0c;因为 MacOS X &#xff0c;苹果与 FreeBSD 过往从密&#xff0c;不仅挖来 FreeBSD 创始人 Jordan Hubbard&#xff0c;更是在此基础上开源了 Darwin。但是&#xff0c;苹果并没有给予 Darwin 太多关注&#xff0c;作为苹果的首个开源项目&#xff0c;它算不上…

【多线程】线程安全问题

1. 一段线程不安全的代码 我们先来看一段代码&#xff1a; public class ThreadDemo {public static int count 0;public static void main(String[] args) {for (int i 0; i < 10_0000; i) {count;}System.out.println("count " count);} } // 打印结果&…

MySql中执行计划如何来的——Optimizer Trace | 京东云技术团队

作者&#xff1a;京东物流 籍磊 1.前言 当谈到MySQL的执行计划时&#xff0c;会有很多同学想&#xff1a;“我就觉得使用其他的执行方案比EXPLAIN语句输出的方案强&#xff0c;凭什么优化器做的决定与我得不一样&#xff1f;”。这个问题在MySQL 5.6之前或许自己很难解决&…

滑动奇异频谱分析:数据驱动的非平稳信号分解工具(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…
最新文章