java坦克大战1.0——敌人坦克发射子弹+敌人消失+爆炸

目录

1.敌人坦克发射子弹

1.功能分析

 2.代码:

1.EnemyTank类:

2.MyPanel类 

2.敌人消失

1.功能分析:

2.代码 

1.EnemyTank类:

2.MyPanel类

3.Shot类

3.爆炸效果

1.功能分析

2.代码

1.Bomb类

2.MyPanel类

最终代码:

1.MyPanel类

2.Bomb类

3.Shot类

4.EnemyTank类


1.敌人坦克发射子弹

1.功能分析

让敌人的坦克也能够发射多颗子弹

  1. 在敌人坦克类,使用Vector保存多个Shot
  2. 当每创建一个敌人坦克对象,给该敌人对象初始化一个Shot对象,同时启动Shot
  3. 在绘制敌人坦克时,需要变量敌人坦克对象Vertor,绘制所有的子弹,当子弹isLive==false时就从Vertor移除

 2.代码:

1.EnemyTank类:
public class EnemyTank extends Tank {
    Vector<Shot> shots=new Vector<>();
    boolean isLive=true;
    public EnemyTank(int x, int y) {
        super(x, y);
    }
}

我们在敌人tank类里面增加了一组Vector集合用于存shot类,以及设置一个标记为了识别子弹是否被销毁。

2.MyPanel类 
 for (int e = 0; e < enemyTankSize; e++) {
            EnemyTank enemyTank=new EnemyTank(100*(e+1),0);
            enemyTank.setDirect(3);
            Shot shot = new Shot(enemyTank.getX() + 20, enemyTank.getY() + 60, enemyTank.getDirect());
            enemyTank.shots.add(shot);
            new Thread(shot).start();

            enemyTanks.add(enemyTank);

        }

我们在初始化敌人坦克的时候,我们加入一颗子弹。并开启子弹的线程。 

for (int i=0;i<enemyTanks.size();i++) {
            EnemyTank enemyTank = enemyTanks.get(i);
            draw_tank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 1);
                    //画出子弹
                for (int j = 0; j < enemyTank.shots.size(); j++) {
                    //取出子弹
                    Shot shot = enemyTank.shots.get(j);
                    //绘制
                    if(shot.isLive()){

                        g.fill3DRect(shot.getX(),shot.getY(),2,2,false);
                    }
                    else {
                        enemyTank.shots.remove(shot);
                    }


                }
            
        }
    }

我们在MyPanel类里面的 paint方法里面加了判断子弹,以及绘制子弹动画并移除的语句。

2.敌人消失

1.功能分析:

  1. 敌人消失,就是让子弹在遇到坦克的时候让enemytank和子弹的标记为false
  2. 然后在绘制坦克的时候判断标记。

2.代码 

1.EnemyTank类:
public class EnemyTank extends Tank {
    Vector<Shot> shots=new Vector<>();
    boolean isLive=true;
    public EnemyTank(int x, int y) {
        super(x, y);
    }
}

 在类里面加一行:

boolen isLive=true;

这里变量类型你可以自己设置,对于这种我们一般建议用default。

2.MyPanel类
public void hitTank(Shot s, EnemyTank enemyTank){
        switch (enemyTank.getDirect()){
            case 0:
            case 2:
                if(s.getX()>enemyTank.getX()&&s.getX()<enemyTank.getX()+40
                        &&s.getY()>enemyTank.getY()&&s.getY()<enemyTank.getY()+60){
                    s.setLive(false);
                    enemyTank.isLive=false;
                   
                    enemyTanks.remove(enemyTank);
                }
                break;
            case 1:
            case 3:
                if (s.getX()>enemyTank.getX()&&s.getX()<enemyTank.getX()+60
                &&s.getY()>enemyTank.getY()&&s.getY()<enemyTank.getY()+40) {
                    s.setLive(false);
                    enemyTank.isLive=false;
                   
                    enemyTanks.remove(enemyTank);

                }
                break;
        }
    }

因为我们设置的坦克是矩形的也就说他是一个规则的形状,那么在判断子弹和坦克的接触时,我们可以判断坦克的方向获得坦克的坐标然后和子弹的坐标相匹配。从而得到子弹是否进入了我们坦克的区域然后标记我们的坦克和子弹,并将坦克移除集合。

for (int i=0;i<enemyTanks.size();i++) {
            EnemyTank enemyTank = enemyTanks.get(i);
            if(enemyTank.isLive){//确定坦克被击中
                draw_tank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 1);
                    //画出子弹
                for (int j = 0; j < enemyTank.shots.size(); j++) {
                    //取出子弹
                    Shot shot = enemyTank.shots.get(j);
                    //绘制
                    if(shot.isLive()){

                        g.fill3DRect(shot.getX(),shot.getY(),2,2,false);
                    }
                    else {
                        enemyTank.shots.remove(shot);
                    }


                }
            }
        }

 在绘制敌人的坦克的时候我我们加上一层if判断,判断是否还为true,不为true将子弹移除集合。这里我们为了不让子弹线程在移除后继续运行,我们对shot类run方法条件进行修改

3.Shot类
 if (!(x>=0&&x<=1000&&y>=0&&y<=750)&&isLive) {
                isLive=false;
                break;
            }

在判段条件里加了一个isLive,在确定子弹销毁的时候,就结束子弹线程。

3.爆炸效果

1.功能分析

  1. 实现爆炸的动态图,我们可以用一张,或多张图,去绘制同一个爆炸的生命周期。、
  2. 爆炸是紧跟在子弹之后的,所以我们去写hitTank方法。

2.代码

1.Bomb类
public class Bomb {
    int x,y;
    int life=16;//炸弹生命周期
    boolean isLive=true;

    public Bomb(int x, int y) {
        this.x = x;
        this.y = y;
    }
    //减少生命值
    public void lifeDown(){
        if(life>0){
            life--;
        }else {
            isLive=false;
        }
    }
}

我们在这里设置生命周期,以及坐标,和标准位

2.MyPanel类
Vector<Bomb> bombs=new Vector<>();
    Image image1=null;
    int enemyTankSize=3;
    public MyPanel(){
        hero=new Hero(100,100);
        hero.setSpeed(1);
        //初始化敌人的tank
        for (int e = 0; e < enemyTankSize; e++) {
            EnemyTank enemyTank=new EnemyTank(100*(e+1),0);
            enemyTank.setDirect(3);
            Shot shot = new Shot(enemyTank.getX() + 20, enemyTank.getY() + 60, enemyTank.getDirect());
            enemyTank.shots.add(shot);
            new Thread(shot).start();

            enemyTanks.add(enemyTank);

        }
        //初始化
        image1=Toolkit.getDefaultToolkit().getImage("./bomb1.gif");

    }

在初始化的时候,增加了一个bombs集合来存储爆炸的效果,以及设置一次爆炸所需要的gif图片,当然也可以是两个,三个去做这个爆炸效果。

 public void hitTank(Shot s, EnemyTank enemyTank){
        switch (enemyTank.getDirect()){
            case 0:
            case 2:
                if(s.getX()>enemyTank.getX()&&s.getX()<enemyTank.getX()+40
                        &&s.getY()>enemyTank.getY()&&s.getY()<enemyTank.getY()+60){
                    s.setLive(false);
                    enemyTank.isLive=false;
                    Bomb bomb=new Bomb(enemyTank.getX(), enemyTank.getY());
                    bombs.add(bomb);
                    enemyTanks.remove(enemyTank);
                }
                break;
            case 1:
            case 3:
                if (s.getX()>enemyTank.getX()&&s.getX()<enemyTank.getX()+60
                &&s.getY()>enemyTank.getY()&&s.getY()<enemyTank.getY()+40) {
                    s.setLive(false);
                    enemyTank.isLive=false;
                    Bomb bomb=new Bomb(enemyTank.getX(), enemyTank.getY());
                    bombs.add(bomb);
                    enemyTanks.remove(enemyTank);

                }
                break;
        }
    }

在hitTank方法里面增加一次bomb效果

 for (int i = 0; i <bombs.size() ; i++) {
            Bomb bomb = bombs.get(i);
            //根据bomb对象的life值去画出炸弹
            if(bomb.life>0){
                g.drawImage(image1,bomb.x,bomb.y,60,60,this);
            }
            bomb.lifeDown();
            //life为0
            if(bomb.life==0){
                bombs.remove(bomb);


            }
        }

并在paint去绘制图像,完成一个生命周期的图画绘制。然后移除

最终代码:

1.MyPanel类

package game;


import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;

//绘图区
//为了监听键盘事件,实现接口KeyListener
//将子弹变成线程使用
public class MyPanel extends JPanel implements KeyListener,Runnable {
    //定义我的坦克
    Hero hero=null;
    //定义敌人的坦克,放入到vector里面
    Vector<EnemyTank> enemyTanks=new Vector<>();
    Vector<Bomb> bombs=new Vector<>();
    Image image1=null;
    int enemyTankSize=3;
    public MyPanel(){
        hero=new Hero(100,100);
        hero.setSpeed(1);
        //初始化敌人的tank
        for (int e = 0; e < enemyTankSize; e++) {
            EnemyTank enemyTank=new EnemyTank(100*(e+1),0);
            enemyTank.setDirect(3);
            Shot shot = new Shot(enemyTank.getX() + 20, enemyTank.getY() + 60, enemyTank.getDirect());
            enemyTank.shots.add(shot);
            new Thread(shot).start();

            enemyTanks.add(enemyTank);

        }
        //初始化
        image1=Toolkit.getDefaultToolkit().getImage("./bomb1.gif");

    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//

        //画出坦克-封装方法
        draw_tank(hero.getX(),hero.getY(),g,hero.getDirect(),0);
        //画出hero射击的子弹
        if(hero.shot!=null&&hero.shot.isLive())
        {
            g.fill3DRect(hero.shot.getX(),hero.shot.getY(),2,2,false);
        }
        //画炸弹
        for (int i = 0; i <bombs.size() ; i++) {
            Bomb bomb = bombs.get(i);
            //根据bomb对象的life值去画出炸弹
            if(bomb.life>0){
                g.drawImage(image1,bomb.x,bomb.y,60,60,this);
            }
            bomb.lifeDown();
            //life为0
            if(bomb.life==0){
                bombs.remove(bomb);


            }
        }

        //画出敌人的坦克
        for (int i=0;i<enemyTanks.size();i++) {
            EnemyTank enemyTank = enemyTanks.get(i);
            if(enemyTank.isLive){//确定坦克被击中
                draw_tank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 1);
                    //画出子弹
                for (int j = 0; j < enemyTank.shots.size(); j++) {
                    //取出子弹
                    Shot shot = enemyTank.shots.get(j);
                    //绘制
                    if(shot.isLive()){

                        g.fill3DRect(shot.getX(),shot.getY(),2,2,false);
                    }
                    else {
                        enemyTank.shots.remove(shot);
                    }


                }
            }
        }
    }
    //编写方法,画出坦克

    /**
     *
     * @param x 坦克左上角x的坐标
     * @param y 坦克的左上角y的坐标
     * @param g 画笔
     * @param direct 坦克方向
     * @param type 坦克类型
     */
    public void draw_tank(int x,int y,Graphics g,int direct,int type){
        switch (type){
            case 0:
                g.setColor(Color.CYAN);
                break;
            case 1:
                g.setColor(Color.orange);
                break;

        }
        //根据tank的方向绘制
        //根据坦克的方向绘制对应形象的坦克
        switch (direct){
            case 0://表示向上
                g.fill3DRect( x, y,10,60,false);
                g.fill3DRect( x+30, y,10,60,false);
                g.fill3DRect( x+10, y+10,20,40,false);
                g.fillOval(x+10,y+20,20,20);
                g.drawLine(x+20,y+30,x+20,y);
                break;
            case 1://表示向右
                g.fill3DRect( x, y,60,10,false);
                g.fill3DRect( x, y+30,60,10,false);
                g.fill3DRect( x+10, y+10,40,20,false);
                g.fillOval(x+20,y+10,20,20);
                g.drawLine(x+30,y+20,x+60,y+20);
                break;
            case 2://表示向左
                g.fill3DRect( x, y,60,10,false);
                g.fill3DRect( x, y+30,60,10,false);
                g.fill3DRect( x+10, y+10,40,20,false);
                g.fillOval(x+20,y+10,20,20);
                g.drawLine(x+30,y+20,x,y+20);
                break;
            case 3://表示向下
                g.fill3DRect( x, y,10,60,false);
                g.fill3DRect( x+30, y,10,60,false);
                g.fill3DRect( x+10, y+10,20,40,false);
                g.fillOval(x+10,y+20,20,20);
                g.drawLine(x+20,y+30,x+20,y+60);
                break;
            default:
                System.out.println("暂时没有处理");
        }

    }
    //编写方法,判断子弹是否击中

    public void hitTank(Shot s, EnemyTank enemyTank){
        switch (enemyTank.getDirect()){
            case 0:
            case 2:
                if(s.getX()>enemyTank.getX()&&s.getX()<enemyTank.getX()+40
                        &&s.getY()>enemyTank.getY()&&s.getY()<enemyTank.getY()+60){
                    s.setLive(false);
                    enemyTank.isLive=false;
                    Bomb bomb=new Bomb(enemyTank.getX(), enemyTank.getY());
                    bombs.add(bomb);
                    enemyTanks.remove(enemyTank);
                }
                break;
            case 1:
            case 3:
                if (s.getX()>enemyTank.getX()&&s.getX()<enemyTank.getX()+60
                &&s.getY()>enemyTank.getY()&&s.getY()<enemyTank.getY()+40) {
                    s.setLive(false);
                    enemyTank.isLive=false;
                    Bomb bomb=new Bomb(enemyTank.getX(), enemyTank.getY());
                    bombs.add(bomb);
                    enemyTanks.remove(enemyTank);

                }
                break;
        }
    }
    @Override
    public void keyTyped(KeyEvent e) {

    }

    //处理wsad按下的键
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_W)
        {
            //改变坦克的方向
            hero.setDirect(0);
            hero.move_up();

        } else if (e.getKeyCode()==KeyEvent.VK_D) {
            hero.setDirect(1);
            hero.move_right();

        } else if (e.getKeyCode()==KeyEvent.VK_A) {
            hero.setDirect(2);
            hero.move_left();
        } else if (e.getKeyCode()==KeyEvent.VK_S) {
            hero.setDirect(3);
            hero.move_down();
        }
        if(e.getKeyCode()==KeyEvent.VK_J) {

            System.out.println("用户按下j");
            hero.shotEnemyTank();
        }
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void run() {
        while (true) {
            try {

                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //判断是否击中敌人坦克
            if(hero.shot!=null&&hero.shot.isLive()){
                //遍历敌人所有的坦克
                for (int i = 0; i < enemyTanks.size(); i++) {
                    EnemyTank enemyTank = enemyTanks.get(i);
                    hitTank(hero.shot,enemyTank);
                }

            }
            this.repaint();
        }
    }
}

2.Bomb类

package game;

public class Bomb {
    int x,y;
    int life=16;//炸弹生命周期
    boolean isLive=true;

    public Bomb(int x, int y) {
        this.x = x;
        this.y = y;
    }
    //减少生命值
    public void lifeDown(){
        if(life>0){
            life--;
        }else {
            isLive=false;
        }
    }
}

3.Shot类

package game;

public class Shot implements Runnable{
    //子弹的坐标
    private int x;
    private int y;
    private int direct=0;

    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 getDirect() {
        return direct;
    }

    public void setDirect(int direct) {
        this.direct = direct;
    }

    public boolean isLive() {
        return isLive;
    }

    public void setLive(boolean live) {
        isLive = live;
    }

    public int getSpeed() {
        return speed;
    }

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

    private boolean isLive=true;

    public Shot(int x, int y, int direct) {
        this.x = x;
        this.y = y;
        this.direct = direct;
    }

    private int speed=2;
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            //根据方向改变
            switch (direct){
                case 0://上
                    y-=speed;
                    break;
                case 1://右
                    x+=speed;
                    break;
                case 2:
                    x-=speed;
                    break;
                case 3:
                    y+=speed;
                    break;
            }
            System.out.println("x="+x+"y="+y);
            //当子弹碰到敌人坦克时结束线程
            if (!(x>=0&&x<=1000&&y>=0&&y<=750)&&isLive) {
                isLive=false;
                break;
            }

        }
    }
}

4.EnemyTank类

package game;

import java.util.Vector;

public class EnemyTank extends Tank {
    Vector<Shot> shots=new Vector<>();
    boolean isLive=true;
    public EnemyTank(int x, int y) {
        super(x, y);
    }
}

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

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

相关文章

maven-依赖管理

依赖配置 https://mvnrepository.com/?__cf_chl_rt_tkvRzDsumjmJ_HF95MK4otu9XluVRHGqAY5Wv4UQYETR8-1714103058-0.0.1.1-1557 <dependencies><dependency><groupId></groupId><artifactId></artifactId><version></version>…

精确测量地面沉降:静力水准仪的应用

地面沉降是一个全球性的地质问题&#xff0c;它可能对建筑物、道路和地下设施造成严重的损害。因此&#xff0c;对地面沉降进行精确测量和监测至关重要。静力水准仪作为一种先进的测量设备&#xff0c;为地面沉降的精确测量提供了有效手段。本文将探讨静力水准仪在地面沉降测量…

Dokcer容器分布式搭建LNMP+wordpress论坛

目录 引言 一、架构环境 二、搭建容器 &#xff08;一&#xff09;自定义网络 &#xff08;二&#xff09;搭建nginx容器 1.文件准备 2.查看与编辑文件 3.生成镜像 4.创建容器 &#xff08;三&#xff09;搭建MySQL容器 1.文件准备 2.查看与编辑文件 3.生成镜像 …

版本控制系统-Git

目录 1. Git简介 2. 下载及安装 3.命令行操做 3.1全局设置 3.2初始化仓库 3.3提交代码 3.4查看提交历史 3.5推送代码 3.6拉取合并代码 3.7克隆仓库 3.8. 配置忽略文件 3.9. 凭据管理 4. GUI工具操作 4.1. 全局设置 4.2. 初始化仓库 4.3. 提交代码 输入提交日志…

【linux-1-Ubuntu常用命令-vim编辑器-Vscode链接ubuntu远程开发】

目录 1. 安装虚拟机Vmare和在虚拟机上安装Ubuntu系统&#xff1a;2. 常用的Ubuntu常识和常用命令2.1 文件系统结构2.2 常用命令2.3 vim编辑器 3. Ubuntu能联网但是ping不通电脑&#xff1a;4. Windows上安装VScode链接ubuntu系统&#xff0c;进行远程开发&#xff1a; 1. 安装虚…

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中&#xff0c;地图功能是一个非常常见且实用的功能&#xff0c;可以帮助用户快速定位并浏览周边信息。而在uni-app开发中&#xff0c;使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项&#xff0c;帮助开发者顺利完成地图功能…

每日OJ题_DFS爆搜深搜回溯剪枝①_力扣784. 字母大小写全排列

目录 力扣784. 字母大小写全排列 解析代码1_path是全局变量 解析代码2_path是函数参数 力扣784. 字母大小写全排列 784. 字母大小写全排列 难度 中等 给定一个字符串 s &#xff0c;通过将字符串 s 中的每个字母转变大小写&#xff0c;我们可以获得一个新的字符串。 返回…

Linux环境下的编译和调试

本文目录 一、编译1. gcc/g编译器2. gcc/g安装3. 代码编译过程4. gcc编译 二、调试1. 下载gdb调试器2. gdb 调试器使用步骤 一、编译 1. gcc/g编译器 对于.c 格式的 C 文件&#xff0c;可以采用 gcc 或 g编译。 对于.cc、.cpp 格式的 C文件&#xff0c;应该采用 g进行编译。 …

第一个Cython程序-helloworld

Cython是Python的一个模块&#xff0c;可以将python语言“翻译”成C语言。 如何安装&#xff1f; python -m pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple/ 新建两个文件helloworld.pyx和setup.py。 helloworld.pyx print("hello world")setu…

【学习vue 3.x】(五)VueRouter路由与Vuex状态管理

文章目录 章节介绍本章学习目标 路由的基本搭建与嵌套路由模式vue路由的搭建嵌套路由模式 动态路由模式与编程式路由模式动态路由模式编程式路由 命名路由与命名视图与路由元信息命名路由命名视图路由元信息 路由传递参数的多种方式及应用场景路由传参 详解route对象与router对…

ubuntu开启message文件

环境&#xff1a;ubuntu 20.04 1、首先需要修改 /etc/rsyslog.d/50-default.conf 文件&#xff1b;源文件中message被注释&#xff0c;如下图&#xff1a; 2、打开注释&#xff1a; 3、重启服务 systemctl restart rsyslog.service 如此即可&#xff01;

OFDM802.11a的FPGA实现(五)卷积编码器的FPGA实现与验证(含verilog代码和matlab代码)

目录 1.前言2.卷积编码2.1卷积编码基本概念2.2 802.11a卷积编码器2.3 卷积编码模块设计2.4 Matlab设计与ModelSim仿真验证 1.前言 前面一节完成了扰码器的FPGA设计与Matlab验证&#xff0c;这节继续对卷积编码器进行实现和验证。 2.卷积编码 2.1卷积编码基本概念 卷积码编码器…

Aiseesoft Data Recovery for Mac:专业数据恢复软件

Aiseesoft Data Recovery for Mac是一款高效且专业的数据恢复软件&#xff0c;专为Mac用户量身打造。 Aiseesoft Data Recovery for Mac v1.8.22激活版下载 无论是由于误删、格式化还是系统崩溃等原因导致的数据丢失&#xff0c;Aiseesoft都能帮助您快速找回。 它采用先进的扫描…

Windows下Git安装

目录 一、下载二、安装三、查看 Git 安装路径 一、下载 下载链接&#xff1a;https://git-scm.com/ 二、安装 双击安装包&#xff0c;按提示一步步进行操作&#xff1a; 三、查看 Git 安装路径 where git D:\Program Files\Git\cmd\git.exe

什么是DDoS攻击?怎么防御DDoS攻击?

在网络安全领域&#xff0c;DDoS攻击一直是热门话题&#xff0c;随着网络技术的不断发展和网络环境的复杂化演变&#xff0c;DDoS攻击变得愈加频繁、更具破坏性。根据2023年网络安全态势研判分析年度综合报告&#xff0c;全年全网网络层的DDoS攻击次数达2.51亿次&#xff01;本…

卷积通用模型的剪枝、蒸馏---蒸馏篇--KD蒸馏(以deeplabv3+为例)

上篇文章介绍了剪枝篇,本文以上篇的剪枝模型为学生模型,以剪枝之前的模型为教师模型,进行KD逻辑蒸馏,之后会尝试特征蒸馏和关系蒸馏等。 一、KD逻辑蒸馏 1.1 大致过程 逻辑蒸馏,是基于分类问题设计的,因此非常适用于语义分割。模型最后会有一个softmax层,其输出值对应了…

React正式更新!开始学习React 19!

本文为原创文章&#xff0c;原文链接&#xff1a;J实验室&#xff0c;未经授权请勿转载 今年2月份&#xff0c;React 发布消息确认今年发布 v19 版本&#xff0c;尘封两年的版本号终于要更新了&#xff08;详情点击&#xff1a;React 19 发布在即&#xff0c;抢先学习一下新特性…

x2600君正 ubi文件系统的编译和烧录

使用平台&#xff1a;君正x2600 ubi文件系统使用问题 1.ubi文件和ubifs文件 2 方法&#xff1a;mkfs.ubifs和ubinize两步打包ubi文件系统 mkfs.ubifs工具 mkfs.ubifs命令用于制作ubifs文件系统&#xff0c;命令示例如下&#xff1a; mkfs.ubifs -x lzo -m 2KiB -e 124KiB -c 3…

FSNotes for Mac v6.7.1中文激活版:强大的笔记管理工具

FSNotes for Mac是一款功能强大的文本处理与笔记管理工具&#xff0c;为Mac用户提供了一个直观、高效的笔记记录和整理平台。 FSNotes for Mac v6.7.1中文激活版下载 FSNotes支持Markdown语法&#xff0c;使用户能够轻松设置笔记格式并添加链接、图像等元素&#xff0c;实现笔记…

【软考高项】第十二章 项目质量管理

目录 12.1管理基础 12.1.1质量与项目质量 12.1.2质量管理 12.1.3质量管理标准体系 12.1.4管理新实践 12.2项目质量管理过程 12.2.1过程概述 12.2.2裁剪考虑因素 12.2.3敏捷与适应方法 12.3规划质量管理 12.3.1输入 12.3.2工具与技术 12.3.3输出 12.4管理质量 12…
最新文章