【java项目】飞机大战

news2024/12/26 0:43:22

文章目录

  • 项目-飞机大战
    • 窗口的创建
    • 背景图片的添加/点击事件的启动
    • 游戏物体父类的编写
    • 背景的移动
    • 双缓存技术--解决文字闪动
    • 背景图片循环出现
    • 我方战斗机的添加和鼠标控制
    • 添加首颗子弹
    • 批量添加子弹
    • 敌方飞机的批量添加功能
    • 我方子弹与敌方飞机的碰撞检测
    • 我方子弹与敌方飞机碰撞时的处理
    • 我方子弹与敌方飞机碰撞时碰撞坠毁
    • 敌方boss的添加和移动
    • 为敌方boss添加子弹
    • 我方飞机和敌方飞机子弹碰撞检测
    • 我方飞机与敌方boss的碰撞检测
    • 计分板的编写
    • 设定游戏规则
    • 为敌方boss添加生命值
    • 游戏的暂停功能
    • 子弹和敌机的越界消失
    • 为敌方小飞机添加爆炸效果
    • 为敌方boss添加生命血条

项目-飞机大战

窗口的创建

package GUI.project1;

import javax.swing.*;

public class GameWin extends JFrame {
    public void launch(){
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(600,600);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");
    }

    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

背景图片的添加/点击事件的启动

GameUtil.java

package project1;

import java.awt.*;

public class GameUtils {
    //背景图片
    public static Image bgImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\bg.jpg");
    //boss图片
    public static Image bossImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\boss.png");
    //爆炸图片
    public static Image explodeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\explode\\e6.gif");


}

GameWin.java

package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    public void launch(){
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(600,600);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
                    state = 1;
                    repaint();
                }
            }
        });
    }

    @Override
    public void paint(Graphics g) {
        if (state == 0){
            g.drawImage(GameUtils.bgImg,0,0,this);
            g.drawImage(GameUtils.bossImg,220,120,this);
            g.drawImage(GameUtils.explodeImg,270,350,this);
            g.setColor(Color.yellow);
            g.setFont(new Font("仿宋",Font.BOLD,40));
            g.drawString("点击开始游戏",180,300);
        }
        if (state == 1){
            g.drawImage(GameUtils.bgImg,0,0,this);
            g.drawImage(GameUtils.bossImg,220,120,this);
            g.drawImage(GameUtils.explodeImg,270,350,this);
            g.setColor(Color.yellow);
            g.setFont(new Font("仿宋",Font.BOLD,40));
            g.drawString("开始游戏了",180,300);
        }
    }

    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

游戏物体父类的编写

GameObj.java

package project1;

import java.awt.*;

public class GameObj {
    Image img;
    int x;
    int y;
    int width;
    int height;
    double speed;
    GameWin frame;

    public GameObj() {
    }

    public GameObj(Image img, int x, int y, double speed) {
        this.img = img;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }

    public GameObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
        this.img = img;
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.speed = speed;
        this.frame = frame;
    }

    public Image getImg() {
        return img;
    }

    public void setImg(Image img) {
        this.img = img;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public double getSpeed() {
        return speed;
    }

    public void setSpeed(double speed) {
        this.speed = speed;
    }

    public GameWin getFrame() {
        return frame;
    }

    public void setFrame(GameWin frame) {
        this.frame = frame;
    }
    public void paintSelf(Graphics gImage){
        gImage.drawImage(img,x,y,null);
    }
    public Rectangle getRec(){
        return new Rectangle(x,y,width,height);
    }
}

背景的移动

package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    //背景图对象
    BgObj bgObj = new BgObj(GameUtils.bgImg,0,-2000,2);
    public void launch(){
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(600,600);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
                    state = 1;
                    repaint();
                }
            }
        });
        while (true){
            repaint();
            try{
                Thread.sleep(25);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void paint(Graphics g) {
        if (state == 0){
            g.drawImage(GameUtils.bgImg,0,0,this);
            g.drawImage(GameUtils.bossImg,220,120,this);
            g.drawImage(GameUtils.explodeImg,270,350,this);
            g.setColor(Color.yellow);
            g.setFont(new Font("仿宋",Font.BOLD,40));
            g.drawString("点击开始游戏",180,300);
        }
        if (state == 1){
            bgObj.paintSelf(g);
        }
    }

    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

双缓存技术–解决文字闪动

修改GameWin.java

package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    Image offScreenImage = null;
    int width = 600;
    int height = 600;
    //背景图对象
    BgObj bgObj = new BgObj(GameUtils.bgImg,0,-2000,2);
    public void launch(){
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(width,height);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
                    state = 1;
                    repaint();
                }
            }
        });
        while (true){
            repaint();
            try{
                Thread.sleep(25);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void paint(Graphics g) {
        if (offScreenImage == null){
            offScreenImage = createImage(width,height);
        }
        Graphics gImage = offScreenImage.getGraphics();
        gImage.fillRect(0,0,width,height);
        if (state == 0){
            gImage.drawImage(GameUtils.bgImg,0,0,this);
            gImage.drawImage(GameUtils.bossImg,220,120,this);
            gImage.drawImage(GameUtils.explodeImg,270,350,this);
            gImage.setColor(Color.yellow);
            gImage.setFont(new Font("仿宋",Font.BOLD,40));
            gImage.drawString("点击开始游戏",180,300);
        }
        if (state == 1){
            bgObj.paintSelf(gImage);
        }
        g.drawImage(offScreenImage,0,0,null);
    }

    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

背景图片循环出现

在BgObj.java中设置临界条件
在这里插入图片描述

我方战斗机的添加和鼠标控制

PlaneObj.java

package project1;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class PlaneObj extends GameObj{
    @Override
    public Image getImg() {
        return super.getImg();
    }

    public PlaneObj() {
        super();
    }

    public PlaneObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
        super(img, x, y, width, height, speed, frame);

        this.frame.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                PlaneObj.super.x = e.getX() - 11;
                PlaneObj.super.y = e.getY() - 16;
            }
        });
    }

    @Override
    public void paintSelf(Graphics gImage) {
        super.paintSelf(gImage);
    }

    @Override
    public Rectangle getRec() {
        return super.getRec();
    }
}

bug:飞机没动静

添加首颗子弹

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

批量添加子弹

GameWin.java

在这里插入代码片package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    Image offScreenImage = null;
    int width = 600;
    int height = 600;
    //背景图对象
    BgObj bgObj = new BgObj(GameUtils.bgImg,0,-2000,2);
    //飞机对象
    PlaneObj planeObj = new PlaneObj(GameUtils.planeImg,290,550,20,30,0,this);

    //游戏的重绘次数
    int count = 1;
    public void launch(){
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(width,height);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        GameUtils.gameObjList.add(bgObj);
        GameUtils.gameObjList.add(planeObj);

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
                    state = 1;
                    repaint();
                }
            }
        });

        while (true){
            if (state == 1){
                createObj();
                repaint();
            }
            repaint();
            try{
                Thread.sleep(25);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    @Override
    public void paint(Graphics g) {
        if (offScreenImage == null){
            offScreenImage = createImage(width,height);
        }
        Graphics gImage = offScreenImage.getGraphics();
        gImage.fillRect(0,0,width,height);
        if (state == 0){
            gImage.drawImage(GameUtils.bgImg,0,0,this);
            gImage.drawImage(GameUtils.bossImg,220,120,this);
            gImage.drawImage(GameUtils.explodeImg,270,350,this);
            gImage.setColor(Color.yellow);
            gImage.setFont(new Font("仿宋",Font.BOLD,40));
            gImage.drawString("点击开始游戏",180,300);
        }
        if (state == 1){
            //运行中
            for (int i =0;i<GameUtils.gameObjList.size();i++){
                GameUtils.gameObjList.get(i).paintSelf(gImage);
            }

        }
        g.drawImage(offScreenImage,0,0,null);
        count++;
    }

    void createObj(){
        if (count % 15 == 0){
            //我方子弹
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this));
            //通过索引把shellObjList的最后一个元素,加入到gameObjList中 ???
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size()-1));
        }

    }

    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

GameUtils.java

package project1;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class GameUtils {
    //背景图片
    public static Image bgImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\bg.jpg");
    //boss图片
    public static Image bossImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\boss.png");
    //爆炸图片
    public static Image explodeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\explode\\e6.gif");
    //我方战斗机图片
    public static Image planeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\plane.png");
    //我方子弹图片
    public static Image shellImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\shell.png");

    //所有游戏物体的集合
    public static List<GameObj> gameObjList = new ArrayList<>();
    //我方子弹的集合
    public static List<ShellObj> shellObjList = new ArrayList<>();

}

问题:
1.GUI中添加集合元素的用法
2.gameObjList的意义
解答:看下一节课的代码

敌方飞机的批量添加功能

1.创建EnemyObj.java

package project1;

import java.awt.*;

public class EnemyObj extends GameObj{
    public EnemyObj() {
        super();
    }

    public EnemyObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
        super(img, x, y, width, height, speed, frame);
    }

    @Override
    public void paintSelf(Graphics gImage) {
        super.paintSelf(gImage);
        y += speed;
    }

    @Override
    public Rectangle getRec() {
        return super.getRec();
    }
}

2.在GameUtil.java中添加敌方图片和集合

package project1;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class GameUtils {
    //背景图片
    public static Image bgImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\bg.jpg");
    //boss图片
    public static Image bossImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\boss.png");
    //爆炸图片
    public static Image explodeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\explode\\e6.gif");
    //我方战斗机图片
    public static Image planeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\plane.png");
    //我方子弹图片
    public static Image shellImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\shell.png");
    //敌机图片
    public static Image eneImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\enemy.png");


    //所有游戏物体的集合
    public static List<GameObj> gameObjList = new ArrayList<>();
    //我方子弹的集合
    public static List<ShellObj> shellObjList = new ArrayList<>();
    //敌机的集合
    public static List<EnemyObj> enemyObjList = new ArrayList<>();
}

3.在GameWin.java中像上一步操作中一样,添加enemyObjList和gameObjList中

x值的设置:可看视频讲解

void createObj(){
        if (count % 15 == 0){
            //我方子弹
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this));
            //通过索引把shellObjList的最后一个元素,加入到gameObjList中 ???
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size()-1));
        }
        if (count % 15 == 0){
            GameUtils.enemyObjList.add(new EnemyObj(GameUtils.eneImg,(int) (Math.random()*12)*50,0,49,36,5,this));
            GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size()-1));
        }
    }

在这里插入图片描述

我方子弹与敌方飞机的碰撞检测

EnemyObj.java中修改

public void paintSelf(Graphics gImage) {
        super.paintSelf(gImage);
        y += speed;
        for (ShellObj shellObj:GameUtils.shellObjList){
            if (this.getRec().intersects(shellObj.getRec())){
                System.out.println("碰撞了");
            }
        }
    }

我方子弹与敌方飞机碰撞时的处理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

我方子弹与敌方飞机碰撞时碰撞坠毁

EnemyObj.java
在这里插入图片描述
GameWin.java
在这里插入图片描述

因为鼠标移动的那个bug,所以没办法达到碰撞坠毁的效果

敌方boss的添加和移动

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为敌方boss添加子弹

1.新建BulletObj类

package project1;

import java.awt.*;

public class BulletObj extends GameObj{
    public BulletObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
        super(img, x, y, width, height, speed, frame);
    }

    @Override
    public void paintSelf(Graphics gImage) {
        super.paintSelf(gImage);
    }

    @Override
    public Rectangle getRec() {
        return super.getRec();
    }
}

2.在GameUtils.java中添加图片和集合

//敌方子弹的集合
    public static Image bulletImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\bullet.png");

//敌方子弹的集合
    public static List<BulletObj> bulletObjList = new ArrayList<>();

3.在GameWin.java中加入集合类中

if (count % 15 == 0){
            GameUtils.bulletObjList.add(new BulletObj(GameUtils.bulletImg,bossObj.getX()+76,bossObj.getY()+85,15,25,5,this));
            GameUtils.gameObjList.add(GameUtils.bulletObjList.get(GameUtils.bulletObjList.size()-1));
        }

4.再回BulletObj,java中添加子弹速度

@Override
    public void paintSelf(Graphics gImage) {
        super.paintSelf(gImage);
        y += speed;
    }

我方飞机和敌方飞机子弹碰撞检测

在BulletObj.java中设置state为3

@Override
    public void paintSelf(Graphics gImage) {
        super.paintSelf(gImage);
        y += speed;
        //敌方子弹于我方飞机的碰撞检测
        if (this.getRec().intersects(this.frame.planeObj.getRec())){
            GameWin.state = 3;
        }
    }

我方飞机与敌方boss的碰撞检测

在PlaneObj.java中设置state为3
在这里插入图片描述

计分板的编写

1.在GameWin.java中定义游戏得分变量
在这里插入图片描述
2.在 GameUtil.java中绘制字符串工具类
在这里插入图片描述
3.在主类中替换相同代码
在这里插入图片描述
4.在主类中绘制计分板
在这里插入图片描述
5.在EnemyObj.java中检测碰撞时score++
在这里插入图片描述

设定游戏规则

当敌机出现100架后,Boss才出现

1.在GameWin.java中设定
在这里插入图片描述
2.GameWin.java中,生成一辆敌机,enemyCount就++
在这里插入图片描述
3.增加if判断条件,判断bossobj的生成条件
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
4.增加boss的子弹生成判断
在这里插入图片描述
5.bug:报错 --去PlaneObj.java中的碰撞检测加上判断
在这里插入图片描述

为敌方boss添加生命值

1.设定生命值
在这里插入图片描述

2.设置敌方飞机和我方子弹的碰撞检测
在这里插入图片描述
3.去GameWin.java中添加通关提示语
在这里插入图片描述

游戏的暂停功能

在这里插入图片描述

子弹和敌机的越界消失

因为子弹和敌机在窗口外依然被绘制,所以会降低游戏运行速度

1.子弹跑出窗口后的处理
在这里插入图片描述

2.敌机子弹消失判断
在这里插入图片描述
3.在GameWin.java中观察长度
在这里插入图片描述

输出:最后稳定
在这里插入图片描述

为敌方小飞机添加爆炸效果

1.ExplodeObj类的实现
在这里插入图片描述
2.GameObj.java中构造器的添加
在这里插入图片描述
3.ExplodeObj类中构造器的继承
在这里插入图片描述

4.将爆炸图放在图片数组中
在这里插入图片描述
2.添加爆炸图片的判断
在这里插入图片描述
在这里插入图片描述
3.在主类中添加爆炸集合类
在这里插入图片描述
4.在EnemyObj.java中绑定爆炸类
在这里插入图片描述
5.从GameWin.java添加到gameobjList中
在这里插入图片描述
6.在EnemyObj.java添加到removeList中
在这里插入图片描述

为敌方boss添加生命血条

在BossObj.java中添加
在这里插入图片描述

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

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

相关文章

单片机基础之单片机中断、定时器中断、PWM及SG90舵机的初识认知

目录 一、初探单片机中断 二、定时器中断相关寄存器 1、中断寄存器 2、中断结构 3、用定时器中断方式控制LED&#xff0c;代码编程测试 三、初识PWM 1、什么是占空比 2、如何输出PWM信号 四、SG90舵机基本认知 1、什么是舵机 2、怎么控制舵机 3、舵机编程实战 一、…

Jetson nano 入手系列之2—板载摄像头IMX219启动

Jetson nano 入手系列之2—板载摄像头IMX219启动1.亚克力板安装2.摄像头启动3.nvgstcapture常用命令3.1 Set sensor orientation3.2 Get Image Capture Resolution3.3 Capture3.4 quit参考文献Jetson nano 入手系列&#xff1a; Jetson nano 入手系列之1—如何SSH远程登录 Jets…

Redis学习(一)

Redis入门 Redis是一个基于内存的key-value结构数据库&#xff0c;读写性能较高 Redis数据类型 Redis存储的是key-value结构的数据&#xff0c;其中key是字符串类型&#xff0c;value有5种数据类型&#xff1a; 1.字符串 string 2.哈希 hash 3.列表 list 4.集合 set 5.有序集…

Altium Designer 20 凡亿教育视频学习-01

课程视频&#xff1a;第1课 课程介绍.mp4_哔哩哔哩_bilibili 第一部分学习 学习方法 工程具备文件 一定需要先建立工程&#xff0c;再来创建原理图库、原理图等文件 栅格大小改变 栅格的大小我们常在绘制原理图的时候改变&#xff0c;因为有时候我们需要画一个细线&#…

【PCB专题】什么是通孔、盲孔、埋孔?

PCB板是由基板和PP叠加而成的。不同层上走了各种信号线和电源,这些信号和电源在不同的电路层之间切换时需要依靠过孔(通孔、盲孔和埋孔)连接。如下图所示的6层板,使用了2阶HDI方案:有机械孔和激光孔。 过孔的作用就像是水管一样,连接了不同的平面。PCB板上的过孔作用就是…

函数的定义和调用 与 this指向

1、函数的定义和调用 1.1、函数的定义方式 函数声明方式 function 关键字 (命名函数)函数表达式 (匿名函数)new Function() var fn new Function(参数1,参数2..., 函数体)&#xff08;1&#xff09;Function 里面参数都必须是字符串格式 &#xff08;2&#xff09;第三种方式…

已解决+ CategoryInfo: SecurityError: (:) [ ].ParentContainsErrorRecordException

已解决无法加载文件 E:\day_01\Scripts\activate.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的about_Execution_Policies。 CategoryInfo: SecurityError: &#xff08;:&#xff09; [ ]…

[LeetCode周赛复盘] 第 326 场周赛20230101

[LeetCode周赛复盘] 第 326 场周赛20230101 一、本周周赛总结二、 [Easy] 6278. 统计能整除数字的位数1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6279. 数组乘积中的不同质因数数目1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6196. 将字符串分割成值不超过 K 的子字…

路由 NAT(简介、静态NAT、动态NAT、NATServer、NAPT、Easy-ip、NAT地址映射表)

4.1.0 路由 NAT&#xff08;简介、静态NAT、动态NAT、NATServer、NAPT、Easy-ip、NAT地址映射表&#xff09; 目录简介NAT地址映射表静态NAT简介操作案例动态NAT简介操作案例NAT Server简介操作案例NAPT简介操作案例Easy-ip简介操作案例简介 为了有效节约公网IPv4地址&#xf…

QT 学习笔记(十二)

文章目录一、文件系统1. 文件系统简介2. 文件系统分类二、基本文件操作1. QFile 读文件2. QFile 写文件3. QFileInfo 获取文件信息三、基本文件操作代码1. 主窗口头文件 widget.h2. 主窗口源文件 widget.cpp由于每次代码都是在原有程序上修改&#xff0c;因此除了新建项目&…

物联网与射频识别技术,课程实验(三)

实验3—— 时隙ALOHA(S-ALOHA)算法的实现及其性能分析 实验说明&#xff1a; 1. 利用Python或Matlab模拟时隙ALOHA算法&#xff1b; 分析标签数量k、时隙大小t对信道利用率的影响&#xff0c;其中&#xff0c; 信道利用率发送数据的时间/(发送数据的时间信道空闲的时间) 3. …

10、中断系统概述

目录 0x01、异常类型 0x0001、系统异常清单 0x0002、外部中断清单 0x02、NVIC 简介 0x0001、NVIC 寄存器 0x0002、NVIC 中断配置固件库 0x03、优先级 0x0001、优先级定义 0x0002、优先级分组 0x0003、中断编程 0x01、异常类型 STM32F103 在内核水平上搭载了一个异常响…

重金打造SEA浩瀚架构,吉利的野心绝不仅仅是一个平台

&#xff08;作者&#xff1a;贝贝。常年供职于某外资整车企业产品规划部门&#xff0c;负责全球车型在国内的引入和投放&#xff09;最近几个月&#xff0c;吉利旗下的中高端电动车品牌极氪汽车销量一路走高。单凭借极氪001一款车型&#xff0c;10月、11月交付量连续破万&…

查找:折半查找、平衡二叉树、散列表(习题-1、5、6)二叉排序树(习题-2、3、4)

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.1 Last edited: 2023.1.1 目录 查找&#xff1a;折半查找、平衡二叉树、散列表&#xff08;习题-1、5、6&#xff09; 第1关&#xff1…

04.spring源码循环依赖终极讲解

1.Spring怎么解决循环依赖 我们都知道&#xff0c;单例Bean初始化完成&#xff0c;要经历三步&#xff1a; 注入就发生在第二步&#xff0c;属性赋值&#xff0c;结合这个过程&#xff0c;Spring 通过三级缓存解决了循环依赖&#xff1a; 一级缓存 : Map<String,Object>…

PUCCH传输UCI信息

上报HARQ-ACK 时序 传输HARQ-ACK信息的时序不再像4G那样固定&#xff0c;而是由基站侧配置给UE。有下面几种情况&#xff1a; 如果UE收到的是DCI format 1_0&#xff0c;其中的字段’PDSCH-to-HARQ_feedback timing indicatior’指示HARQ-ACK与PDSCH的时序关系&#xff0c;该…

Linux之孤儿进程、进程优先级、环境变量

本章目录1.孤儿进程2.状态优先级3.环境变量1.孤儿进程 父进程如果提前退出&#xff0c;那么子进程后退出&#xff0c;进入Z之后&#xff0c;那该如何处理&#xff1f; 父进程先退出&#xff0c;子进程还在&#xff0c;子进程就称之为“孤儿进程”。 孤儿进程被1号init进程&am…

移动安全APT事件总结及防御解决方案探讨

声明 本文是学习移动安全总结 2019. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 2019年各地移动APT事件总结 2019年世界依旧不太平&#xff0c;在表面平静的背后是暗流涌动。大规模军事冲突不会发生的当下&#xff0c;因利益&#xff0c;…

Python全栈开发(一)——环境搭建和入门

今天是2023年的第一天&#xff0c;接下来的一个月里&#xff0c;我将持续更新关于python全栈开发的相关知识&#xff0c;前面一段时间都是基础语法。主要分成四大块&#xff1a;基础、面向对象、MYSQL数据库、Django框架。话不多说&#xff0c;进入到今天的主题。 1.文档和工具…

聊聊最适合程序员的画图工具

画图工具 没问题&#xff0c;直接坦白讲&#xff0c;我用了 2 年的画图工具是&#xff1a;draw.io。 我的图解文章里的图片全是在 draw.io 这个工具画的&#xff0c;写了那么久的图解文章&#xff0c;再加上我工作中也有画图的习惯&#xff0c;累计也有在上面画了接近 1000 张…