当前位置: 首页 > news >正文

项目-坦克大战

增加功能

我方坦克在发射的子弹消亡后,才能发射新的子弹。同时实现发多颗子弹

  • 1,在按下J键,我们判断当前hero对象的子弹,是否已经销毁
  • 2,如果没有销毁,就不去触发shotEnemyTank
  • 3,如果已经销毁,才去触发shotEnemyTank
  • 4,如果要发射多颗子弹,就使用Vector保存(hero类)
  • 5,在绘制我方子弹时,需要遍历Vector,在按键J时,再次调用shotEnemyTank
  • 6,如果需要控制在我们的面板上最多只有5颗子弹:用if语句进行判断即可(hero类),

Hero类

import java.util.Vector;//自己的坦克,继承坦克父类
public class Hero extends Tank {//定义一个Shot对象,表示一个射击(线程)Shot shot = null;//可以发射多颗子弹Vector<Shot> shots = new Vector<>();public Hero(int x, int y) {super(x, y);}public void  shotEnemyTank(){//发多颗子弹怎么办? 控制在我们的面板上,最多只有5颗子弹if (shots.size()==5){return;}//创建Shot对象,根据当前Hero对象的位置和方向来创建Shotswitch (getDirect()){//得到Hero对象方向case 0://上shot = new Shot(getX()+20,getY(),0);break;case 1://右shot = new Shot(getX()+60,getY()+20,1);break;case 2://下shot = new Shot(getX()+20,getY()+60,2);break;case 3://左shot = new Shot(getX(),getY()+20,3);break;}//把新创建的shot放入到shots中shots.add(shot);//启动我们的shot线程new Thread(shot).start();}
}

画板类
改变keyPressed方法

 //当某个键按下,该方法会触发@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_W) {//上//改变坦克方向hero.setDirect(0);//让坦克动起来if (hero.getY()>0){hero.moveUp();}} else if (e.getKeyCode() == KeyEvent.VK_S) {//下hero.setDirect(2);if (hero.getY()+60<750){hero.moveDown();}} else if (e.getKeyCode() == KeyEvent.VK_A) {//左hero.setDirect(3);if (hero.getX()>0){hero.moveLeft();}} else if (e.getKeyCode() == KeyEvent.VK_D) {//右hero.setDirect(1);if (hero.getX()+60<1000)hero.moveRight();}//如果用户按下的是J,就发射if (e.getKeyCode() == KeyEvent.VK_J) {//判断hero的子弹是否销毁---发射一颗子弹if (hero.shot==null|| !hero.shot.isLive) {//线程销毁后,不代表shot对象为空,所以还需要判断shot的声明周期,才可以继续发子弹hero.shotEnemyTank();}//发射多颗子弹hero.shotEnemyTank();}//重绘repaint();}

在paint方法中遍历Vector集合

  @Overridepublic void paint(Graphics g) {super.paint(g);//3,通过画笔填充一个矩形区域   g.fillRect();g.fillRect(0, 0, 1000, 750);//填充矩形,默认为黑色//画出自己的坦克drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 1);
//        drawTank(hero.getX() +100,hero.getY(),g,hero.getDirect(),0);
//        drawTank(hero.getX() +200,hero.getY(),g,hero.getDirect(),0);
//        drawTank(hero.getX() +300,hero.getY(),g,hero.getDirect(),1);//判断何时画子弹
//        if (hero.shot != null && hero.shot.isLive == true) {
//            g.setColor(Color.white);
//            g.draw3DRect(hero.shot.x, hero.shot.y, 1, 1, false);
//
//        }//将hero的子弹集合shots,遍历取出绘制for (int i = 0; i < hero.shots.size(); i++) {Shot shot = hero.shots.get(i);if (shot != null && shot.isLive == true) {g.setColor(Color.white);g.draw3DRect(shot.x, shot.y, 1, 1, false);}else {//如果该shot对象已经无效,就从shots集合中拿掉hero.shots.remove(shot);}}//如果bombs 集合中有对象,就画出for (int i = 0; i < bombs.size(); i++) {//取出来炸弹Bomb bomb = bombs.get(i);//根据当前这个bomb对象的life值去画出对应的图片if (bomb.life > 6) {g.drawImage(image1, bomb.x, bomb.y, 60, 60, this);} else if (bomb.life > 3) {g.drawImage(image2, bomb.x, bomb.y, 60, 60, this);} else {g.drawImage(image3, bomb.x, bomb.y, 60, 60, this);}//让这个炸弹的生命值减少bomb.lifeDown();//如果 bomb life 为0 ,就从bombs的集合中删除if (bomb.life == 0) {bombs.remove(bomb);}}//画出敌人的坦克for (int i = 0; i < enemyTanks.size(); i++) {//从Vector取出坦克EnemyTank enemyTank = enemyTanks.get(i);//判断当前坦克是否还存活if (enemyTank.isLive) {//当敌人坦克时存活的,才画出该坦克drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 0);//画出 enemyTank 所有子弹for (int j = 0; j < enemyTank.shots.size(); j++) {//取出子弹Shot shot = enemyTank.shots.get(j);//绘制if (shot.isLive) {//isLive=trueg.setColor(Color.white);g.draw3DRect(shot.x, shot.y, 1, 1, false);} else {//从Vector 移除enemyTank.shots.remove(shot);}}}}}

让敌人坦克发射的子弹消亡后,可以再发射子弹

  • 1,在敌人坦克类中的run方法中判断 Vector集合的数量
  • 2,如果仍然存活且数量小于1,则执行相关业务代码
//敌人坦克
public class EnemyTank extends Tank implements Runnable {//给敌人坦克类,使用Vector 保存多个ShotVector<Shot> shots = new Vector<>();//定义敌人坦克的存货属性boolean isLive = true;public EnemyTank(int x, int y) {super(x, y);}@Overridepublic void run() {while (true) {//这里我们判断如果shots size() = 0; 创建一颗子弹,放入到shots集合,并启动if (isLive&&shots.size()<1){Shot s = null;//判断坦克的方向,创建对应的子弹switch (getDirect()){case 0:s=new Shot(getX()+20,getY(),0);case 1:s=new Shot(getX()+60,getY()+20,0);case 2:s=new Shot(getX()+20,getY()+60,0);case 3:s=new Shot(getX(),getY()+20,0);}shots.add(s);new Thread(s).start();}switch (getDirect()) {//根据坦克的方向来进行移动case 0://向上//让坦克保持一个方向,走30步for (int i = 0; i < 30; i++) {if (getY()>0){moveUp();}//休眠50好眠try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}}break;case 1://向右//让坦克保持一个方向,走30步for (int i = 0; i < 30; i++) {if (getX()+60<1000){moveRight();}//休眠50好眠try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}}break;case 2://向下//让坦克保持一个方向,走30步for (int i = 0; i < 30; i++) {if (getY()+60<750){moveDown();}//休眠50好眠try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}}break;case 3://向左//让坦克保持一个方向,走30步for (int i = 0; i < 10; i++) {if (getX()>0){moveLeft();}//休眠50好眠try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}}break;}//休眠50好眠try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}// 然后随机的改变坦克方向0-3setDirect((int) (Math.random() * 4));  //0-3//一旦写并发程序,一定要考虑清楚,该线程什么时候结束if (!isLive) {break;}}}
}

当敌人的坦克击中我方坦克时,我方坦克消失,并出现爆炸效果

  • 1,编写方法,判断敌人坦克是否击中我方坦克
  • 2,在run方法中调用该方法
//画板类
public class MyPanel extends JPanel implements KeyListener, Runnable {//定义我的坦克Hero hero = null;//定义敌人坦克,放入到Vector(线程安全,可以有多个)Vector<EnemyTank> enemyTanks = new Vector<>();int enemyTankSize = 3;//定义一个Vector,用于存放炸弹(炸弹既不属于我方坦克也不属于地方坦克 ,所以坦克放在画板类)//当我们的子弹击中坦克时,就加入一个Bomb对象到bombsVector<Bomb> bombs = new Vector<>();//定义三张炸弹图片,用于显示爆炸效果Image image1 = null;Image image2 = null;Image image3 = null;public MyPanel() {//初始化自己的坦克hero = new Hero(100, 100);hero.setSpeed(5);//初始化敌人的坦克for (int i = 0; i < enemyTankSize; i++) {//创建一个敌人的坦克EnemyTank enemyTank = new EnemyTank(100 * (i + 1), 0);//启动敌人坦克线程,让他动起来new Thread(enemyTank).start();//设置方向enemyTank.setDirect(2);//给该enemyTank 加入一颗子弹Shot shot = new Shot(enemyTank.getX() + 20, enemyTank.getY() + 60, enemyTank.getDirect());enemyTank.shots.add(shot);//启动shot对象new Thread(shot).start();//把敌人的坦克加入的总的坦克对象中enemyTanks.add(enemyTank);}
//        image1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/1.gif"));
//        image2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/2.gif"));
//        image3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/3.gif"));//初始化照片对象image1 = new ImageIcon("image/1.gif").getImage();image2 = new ImageIcon("image/2.gif").getImage();image3 = new ImageIcon("image/3.gif").getImage();}@Overridepublic void paint(Graphics g) {super.paint(g);//3,通过画笔填充一个矩形区域   g.fillRect();g.fillRect(0, 0, 1000, 750);//填充矩形,默认为黑色if (hero != null && hero.isLive){//画出自己的坦克drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 1);}
//        drawTank(hero.getX() +100,hero.getY(),g,hero.getDirect(),0);
//        drawTank(hero.getX() +200,hero.getY(),g,hero.getDirect(),0);
//        drawTank(hero.getX() +300,hero.getY(),g,hero.getDirect(),1);//判断何时画子弹
//        if (hero.shot != null && hero.shot.isLive == true) {
//            g.setColor(Color.white);
//            g.draw3DRect(hero.shot.x, hero.shot.y, 1, 1, false);
//
//        }//将hero的子弹集合shots,遍历取出绘制for (int i = 0; i < hero.shots.size(); i++) {Shot shot = hero.shots.get(i);if (shot != null && shot.isLive == true) {g.setColor(Color.white);g.draw3DRect(shot.x, shot.y, 1, 1, false);}else {//如果该shot对象已经无效,就从shots集合中拿掉hero.shots.remove(shot);}}//如果bombs 集合中有对象,就画出for (int i = 0; i < bombs.size(); i++) {//取出来炸弹Bomb bomb = bombs.get(i);//根据当前这个bomb对象的life值去画出对应的图片if (bomb.life > 6) {g.drawImage(image1, bomb.x, bomb.y, 60, 60, this);} else if (bomb.life > 3) {g.drawImage(image2, bomb.x, bomb.y, 60, 60, this);} else {g.drawImage(image3, bomb.x, bomb.y, 60, 60, this);}//让这个炸弹的生命值减少bomb.lifeDown();//如果 bomb life 为0 ,就从bombs的集合中删除if (bomb.life == 0) {bombs.remove(bomb);}}//画出敌人的坦克for (int i = 0; i < enemyTanks.size(); i++) {//从Vector取出坦克EnemyTank enemyTank = enemyTanks.get(i);//判断当前坦克是否还存活if (enemyTank.isLive) {//当敌人坦克时存活的,才画出该坦克drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 0);//画出 enemyTank 所有子弹for (int j = 0; j < enemyTank.shots.size(); j++) {//取出子弹Shot shot = enemyTank.shots.get(j);//绘制if (shot.isLive) {//isLive=trueg.setColor(Color.white);g.draw3DRect(shot.x, shot.y, 1, 1, false);} else {//从Vector 移除enemyTank.shots.remove(shot);}}}}}/*int x 坦克的横坐标int y 坦克的纵坐标Graphics g  画笔int direct  坦克的方向int type  坦克的类型*/public void drawTank(int x, int y, Graphics g, int direct, int type) {switch (type) {case 0://敌人的坦克g.setColor(Color.cyan);break;case 1://我的坦克g.setColor(Color.yellow);break;}//根据坦克的方向,来绘制坦克//direct表示方法:  0:向上   1:向右    2:向下    3:向左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, 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;case 3://表示向左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;default:System.out.println("暂时没有处理");}}//编写方法,判断敌人坦克是否击中我方坦克public void hitHero(){//遍历所有的敌人坦克for (int i = 0; i < enemyTanks.size(); i++) {//取出敌人坦克EnemyTank enemyTank = enemyTanks.get(i);//遍历enemyTank 对象的所有子弹for (int j = 0; j < enemyTank.shots.size(); j++) {//取出子弹Shot shot = enemyTank.shots.get(j);//判断shot 是否击中我的坦克if (hero.isLive&&shot.isLive){hitTank( shot,hero);}}}}public void hitEnemy(){//判断我们的子弹是否击中了敌人坦克if (hero.shot != null && hero.shot.isLive) {//当我方的子弹还存活//遍历敌人所有的坦克for (int i = 0; i < enemyTanks.size(); i++) {EnemyTank enemyTank = enemyTanks.get(i);hitTank(hero.shot, enemyTank);}}}//编写方法:判断我方子弹是否击敌人坦克//什么时候判断,我方坦克是否击中敌人坦克?  run方法public void hitTank(Shot s, Tank tank) {//判断s 击中坦克switch (tank.getDirect()) {case 0://敌人坦克向上case 2://敌人坦克向下if (s.x > tank.getX() && s.y < tank.getY() + 40 &&s.y > tank.getY() && s.y < tank.getY() + 60) {s.isLive = false;tank.isLive = false;//当我的子弹击中敌人坦克后,将enenmyTank 从Vector 拿掉enemyTanks.remove(tank);//这里敌人坦克被击中//创建Bomb对象,加入到bombs集合Bomb bomb = new Bomb(tank.getX(), tank.getY());bombs.add(bomb);}break;case 1://敌人坦克向右case 3://敌人坦克向下if (s.x > tank.getX() && s.y < tank.getY() + 60 &&s.y > tank.getY() && s.y < tank.getY() + 40) {s.isLive = false;tank.isLive = false;Bomb bomb = new Bomb(tank.getX(), tank.getY());bombs.add(bomb);}break;}}//有字符输出时,该方法就会触发@Overridepublic void keyTyped(KeyEvent e) {}//当某个键按下,该方法会触发@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_W) {//上//改变坦克方向hero.setDirect(0);//让坦克动起来if (hero.getY()>0){hero.moveUp();}} else if (e.getKeyCode() == KeyEvent.VK_S) {//下hero.setDirect(2);if (hero.getY()+60<750){hero.moveDown();}} else if (e.getKeyCode() == KeyEvent.VK_A) {//左hero.setDirect(3);if (hero.getX()>0){hero.moveLeft();}} else if (e.getKeyCode() == KeyEvent.VK_D) {//右hero.setDirect(1);if (hero.getX()+60<1000)hero.moveRight();}//如果用户按下的是J,就发射if (e.getKeyCode() == KeyEvent.VK_J) {//判断hero的子弹是否销毁---发射一颗子弹if (hero.shot==null|| !hero.shot.isLive) {//线程销毁后,不代表shot对象为空,所以还需要判断shot的声明周期,才可以继续发子弹hero.shotEnemyTank();}//发射多颗子弹hero.shotEnemyTank();}//重绘repaint();}//当某个键释放(松开),该方法会触发@Overridepublic void keyReleased(KeyEvent e) {}//添加线程的方法,确保子弹可以重绘@Overridepublic void run() {//每隔 100毫秒,重绘区域,刷新绘图区域,子弹就移动while (true) {try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}//判断我们坦克是否击中别人hitEnemy();//判断敌人坦克是否击中我们hitHero();this.repaint();}}
}

相关文章:

项目-坦克大战

增加功能 我方坦克在发射的子弹消亡后&#xff0c;才能发射新的子弹。同时实现发多颗子弹 1&#xff0c;在按下J键&#xff0c;我们判断当前hero对象的子弹&#xff0c;是否已经销毁2&#xff0c;如果没有销毁&#xff0c;就不去触发shotEnemyTank3&#xff0c;如果已经销毁&…...

代码随想录算法训练营第二十九天| LeetCode491.递增子序列* 、LeetCode46.全排列*、LeetCode47.全排列 II

#LeetCode 491. Non-decreasing Subsequences #LeetCode 491. 视频讲解&#xff1a;回溯算法精讲&#xff0c;树层去重与树枝去重 | LeetCode&#xff1a;491.递增子序列_哔哩哔哩_bilibili 首先&#xff0c;本题不能考虑首先对数组排序&#xff0c;排序会导致数组直接变为一个…...

基于SpringBoot设计模式之开端

文章目录 前言引言开始 前言 为了更好的在项目中&#xff0c;能更加优雅的使用设计模式&#xff0c;比较针对性的解决我们的问题。我将在这个专栏详细的描述23种设计模式&#xff0c;为了与时俱进&#xff0c;我打算通过springboot的形式将23种设计模式全部撸完&#xff01; 引…...

tensorflow实现二分类

# 导入所需库和模块 from tensorflow.keras.layers import Dense, Input, Activation # 导入神经网络层和激活函数模块 from tensorflow.keras.models import Sequential # 导入Keras的Sequential模型 import pandas as pd # 导入Pandas库用于数据处理 import numpy as np …...

简化路径[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个字符串path&#xff0c;表示指向某一文件或目录的Unix风格 绝对路径 &#xff08;以/开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。在Unix风格的文件系统中&#xff0c;一个点.表示当前目录本身&#x…...

记一次若依项目组装树型结构数据的效率优化

背景 最近公司的项目使用了若依框架做开发&#xff0c;发现部门管理功能的部门如果有3万笔记录时&#xff0c;查询部门信息并组装为父子结构时运行特别缓慢&#xff0c;本地运行需要3分钟才能加载出来&#xff0c;因此接到优化的工作。 代码展示 首先看看表结构是这么定义的…...

秒杀系统之系统优化

3 系统优化 对于一个软件系统&#xff0c;提高性能可以有很多种手段&#xff0c;如提升硬件水平、调优JVM 性能&#xff0c;这里主要关注代码层面的性能优化—— 减少序列化&#xff1a;减少 Java 中的序列化操作可以很好的提升系统性能。序列化大部分是在 RPC 阶段发生&#x…...

【介绍下Python多线程,什么是Python多线程】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

FPGA相关论文阅读

一、Achieving 100Gbps Intrusion Prevention on a Single Server 论文名称中文翻译&#xff1a;在单台服务器上实现100Gbps吞吐量的入侵防御检测。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…...

瑞芯微RK3588驱动设计之DVP并口摄像头2

dts配置看瑞芯微RK3588驱动配置之DVP并口摄像头1_rockchip 调试dvp设备 直接显示摄像头数据-CSDN博客 这里看看驱动的具体实现&#xff0c;以gc2145为例。 gc2145的驱动源码如下&#xff1a; // SPDX-License-Identifier: GPL-2.0 /** GC2145 CMOS Image Sensor driver*** C…...

安卓手机APP开发__支持64位的架构

安卓手机APP开发__支持64位的架构 目录 概述 读取你的APP 快速的状态检查 你的APP使用了原生的代码吗&#xff1f; 你的APP包含了64位的代码库吗&#xff1f; 确保在这些目录中有原生的代码库. 使用APK分析器查看原生的代码库 通过解压缩APK查看原生的代码库 用安卓工…...

Foxmail使用经验总结

目录 1.概述 2.版本历史 3.使用方法 3.1.安装和设置账户 3.2.收取和阅读邮件 ​​​​​​​3.3.发送邮件 ​​​​​​​3.4.管理联系人 ​​​​​​​3.5.日程安排和任务管理 ​​​​​​​3.6.定制设置和插件 ​​​​​​​3.7.跨平台同步 4.小结 1.概述 Fox…...

信息系统项目管理师0601:项目立项管理 — 考点总结(可直接理解记忆)

点击查看专栏目录 项目立项管理 — 考点总结(可直接理解记忆) 1.项目建议书(又称立项申请)是项目建设单位向上级主管部门提交项目申请时所必须的文件,是对拟建项目提出的框架性的总体设想。在项目建议书批准后,方可开展对外工作(掌握)。 2.项目建议书应该包括的核心内…...

实验三:机器学习1.0

要求&#xff1a; 针对实验1和实验2构建的数据集信息分析 设计实现通过数据简介进行大类分类的程序 代码实现&#xff1a; 训练集数据获取&#xff1a; read_data.py import json import pickledef read_intro():data []trypathr"E:\Procedure\Python\Experiment\f…...

Vue 3 + Vite项目实战:常见问题与解决方案全解析

文章目录 一、项目使用本地图片打包后不显示1、在html中时候&#xff0c;本地运行和打包后线上运行都ok。2、用动态数据&#xff0c;本地运行ok&#xff0c;打包后线上运行不显示3、适用于处理单个链接的资源文件4、用动态数据且本地和线上访问都可显示 二、使用插件vite-plugi…...

飞天使-k8s知识点31-rancher的正确打开方式

文章目录 安装之前优化一下内核参数以及系统内核版本 rancher安装主要是使用以下命令nginx的配置为解决办法 安装之前优化一下内核参数以及系统内核版本 内核版本 4.17 cat > /etc/modules-load.d/iptables.conf <<EOF ip_tables iptable_filter EOF 然后重启服务器…...

Vue.component v2v3注册(局部与全局)组件使用详解

在Vue中&#xff0c;可以通过两种方式注册组件&#xff1a;局部注册和全局注册。 局部注册是在父组件中通过import和components选项注册的组件&#xff0c;仅在当前父组件及其子组件中可用。 // 父组件中import ChildComponent from ./ChildComponent.vue;export default {co…...

HNU-算法设计与分析-作业5

第五次作业【回溯算法】 文章目录 第五次作业【回溯算法】<1> 算法分析题5-3 回溯法重写0-1背包<2> 算法分析题5-5 旅行商问题&#xff08;剪枝&#xff09;<3> 算法实现题5-2 最小长度电路板排列问题<4> 算法实现题5-7 n色方柱问题<5> 算法实现…...

基础之音视频2

01 前言 02 mp 03 mp实例 简易音乐播放器 04 音频 sound-pool 1.作用 播放多个音频&#xff0c;短促音频 2.过程 加载load- 3.示例 模拟手机选铃声 步骤&#xff1a; 创建SoundPool对象&#xff0c;设置相关属性 音频流存入hashmap 播放音频 05 videoview 3gp 体积小 mp4 …...

两小时看完花书(深度学习入门篇)

1.深度学习花书前言 机器学习早期的时候十分依赖于已有的知识库和人为的逻辑规则&#xff0c;需要人们花大量的时间去制定合理的逻辑判定&#xff0c;可以说是有多少人工&#xff0c;就有多少智能。后来逐渐发展出一些简单的机器学习方法例如logistic regression、naive bayes等…...

21【Aseprite 作图】画白菜

1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边&#xff0c;可以通过油漆桶工具&#xff08;取消 “连续”&#xff09;&#xff0c;就把红色的轮廓线&#xff0c;变成黑色的 同时用吸管工具&#xff0c;吸取绿色和白色&#xff0c;用油漆桶填充颜色 4 加上阴影…...

2024.05.15 [AI开发配环境]个人使用最新版远程服务器配环境大纲:docker、云盘、ssh、conda等

不包括在宿主机安装docker。 docker 找到心仪的镜像&#xff0c;比如从网上pull&#xff1a;https://hub.docker.com/r/pytorch/pytorch/tags?page&page_size&ordering&name2.0.1 docker pull pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel# 新建容器 docker r…...

opencv 轮廓区域检测

直线检测 void LineDetect(const cv::Mat &binaryImage) {cv::Mat xImage,yImage,binaryImage1,binaryImage2;// 形态学变化&#xff0c;闭操作 先膨胀&#xff0c;再腐蚀 可以填充小洞&#xff0c;填充小的噪点cv::Mat element cv::getStructuringElement(cv::MORPH_RE…...

2024-5-16

今日安排&#xff1a; 完结 nf_tables 模块的基本学习&#xff0c;然后开始审计源码mount 的使用&#xff0c;学习 namespace (昨昨昨昨天残留的任务)&#xff08;&#xff1a;看我能搁到什么时候静不下心学习新知识就做 CTF 题目&#x1f991;&#x1f991;&#x1f991; 今…...

IT行业的现状与未来:技术创新引领时代变革

随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。本文将探讨当前IT行业的现状及未来发展趋势&#xff0c;并邀请行业领袖、技术专家和创…...

Redis分布式锁【简单版】

文章目录 概要例子1【SETNX EXPIRE】例子2【 Redisson 】 概要 redis分布式锁六种方案 SETNX EXPIRE 方案&#xff1a; 描述&#xff1a;使用Redis的SETNX命令来尝试设置一个键值对&#xff0c;如果该键不存在&#xff0c;则设置成功并设置过期时间&#xff0c;实现锁的功能…...

18.Blender 渲染工程、打光方法及HDR贴图导入

HDR环境 如何导入Blender的HDR环境图 找到材质球信息 在右上角&#xff0c;点击箭头&#xff0c;展开详细部分 点击材质球&#xff0c;会出现下面一列材质球&#xff0c;将鼠标拖到第二个材质球&#xff0c;会显示信息 courtyard.exr 右上角打开已渲染模式 左边这里选择世界…...

VBA在Excel中部首组查字法的应用

VBA在Excel中部首组查字法的应用 文章目录 前言一、网站截图二、操作思路三、代码1.创建数据发送及返回方法2.创建截取字符串中的数值的方法3.获取部首对应的编码4.获取特定部首的汉字运行效果截图前言 使用汉语字典查生字、生词,多用拼音查字法和部首查字法。以前都是用纸质…...

ASP.NET MVC 4升级迁移到ASP.NET MVC 5

背景&#xff1a;今天针对一个老项目进行框架升级&#xff0c;老项目使用的是MVC 4&#xff0c;现在要升级到MVC5。 备份项目.NET升级4.5以上版本通过Nuget&#xff0c;更新或者直接安装包 包名oldVersionnewVersion说明Microsoft.AspNet.Mvc4.0.05.x.xMicrosoft.AspNet.Razo…...

AIGC时代已至,你准备好抓住机遇了吗?

一、行业前景 AIGC&#xff0c;即人工智能生成内容&#xff0c;是近年来人工智能领域中发展迅猛的一个分支。随着大数据、云计算、机器学习等技术的不断进步&#xff0c;AIGC已经取得了显著的成果&#xff0c;并且在广告、游戏、自媒体、教育、电商等多个领域实现了广泛应用。…...