项目-坦克大战
增加功能
我方坦克在发射的子弹消亡后,才能发射新的子弹。同时实现发多颗子弹
- 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();}}
}
相关文章:

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

代码随想录算法训练营第二十九天| LeetCode491.递增子序列* 、LeetCode46.全排列*、LeetCode47.全排列 II
#LeetCode 491. Non-decreasing Subsequences #LeetCode 491. 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 首先,本题不能考虑首先对数组排序,排序会导致数组直接变为一个…...

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

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 …...

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

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

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

【介绍下Python多线程,什么是Python多线程】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

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

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

安卓手机APP开发__支持64位的架构
安卓手机APP开发__支持64位的架构 目录 概述 读取你的APP 快速的状态检查 你的APP使用了原生的代码吗? 你的APP包含了64位的代码库吗? 确保在这些目录中有原生的代码库. 使用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
要求: 针对实验1和实验2构建的数据集信息分析 设计实现通过数据简介进行大类分类的程序 代码实现: 训练集数据获取: read_data.py import json import pickledef read_intro():data []trypathr"E:\Procedure\Python\Experiment\f…...

Vue 3 + Vite项目实战:常见问题与解决方案全解析
文章目录 一、项目使用本地图片打包后不显示1、在html中时候,本地运行和打包后线上运行都ok。2、用动态数据,本地运行ok,打包后线上运行不显示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中,可以通过两种方式注册组件:局部注册和全局注册。 局部注册是在父组件中通过import和components选项注册的组件,仅在当前父组件及其子组件中可用。 // 父组件中import ChildComponent from ./ChildComponent.vue;export default {co…...

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

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

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

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

2024.05.15 [AI开发配环境]个人使用最新版远程服务器配环境大纲:docker、云盘、ssh、conda等
不包括在宿主机安装docker。 docker 找到心仪的镜像,比如从网上pull: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;// 形态学变化,闭操作 先膨胀,再腐蚀 可以填充小洞,填充小的噪点cv::Mat element cv::getStructuringElement(cv::MORPH_RE…...

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

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

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

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

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

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

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