Java王者荣耀火柴人
主要功能
键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小兵每隔一段时间自动生成,在王者峡谷下路移动,遇到敌人则自动攻击。防御塔可以自动识别敌人进行攻击。野怪分为RedBuff,BlueBuff,普通野怪,死亡后都可以复活。游戏胜利的条件是红方水晶生命值为零,游戏失败条件是蓝方水晶生命值为零。游戏的设计模式为可以偷塔。
游戏流程图 
一,主窗口类
作用:初始化变量,窗口的启动方法,键盘监听事件,添加按钮事件,游戏不同状态的变化,播放背景音乐
package com.sxt;import com.sxt.beast.Beast;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.swing.JButton;
import javax.swing.JFrame;public class GameFrame extends JFrame {// 游戏开始 0, 游戏胜利1,游戏失败2int state = 0;// 窗口尺寸final int windowWidth = 1400;final int windowHeight = 700;// 双缓冲图片private Image offScreenImage = null;// 攻击图片private Image attack = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\attack.jpg");//游戏胜利失败图片private Image gameWin = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\gameWin.png");private Image gameLose = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\gameLose.png");// 游戏背景Background background = new Background(this);// 游戏玩家Champion player = new ChampionDaji(this);// 双方小兵MinionBlue mb = new MinionBlue(this);MinionRed mr = new MinionRed(this);//野怪public Beast beast = new Beast(this);// 防御塔Turret turret = new Turret(this);// 游戏元素列表public ArrayList<GameObject> objList = new ArrayList<>();ArrayList<GameObject> redList = new ArrayList<>();// 红色方ArrayList<GameObject> blueList = new ArrayList<>();// 蓝色方public ArrayList<GameObject> removeList = new ArrayList<>();// 存放将要删除的元素public void launch() {// 设置尺寸setSize(windowWidth, windowHeight);// 窗口居中setLocationRelativeTo(null);// 关闭事件setDefaultCloseOperation(3);// 用户不能调整窗口大小setResizable(false);// 标题setTitle("王者荣耀");// 窗口可见setVisible(true);// 添加键盘监视器this.addKeyListener(new GameFrame.KeyMonitor());// 添加游戏元素objList.add(background);objList.add(player);objList.addAll(beast.beastList);objList.addAll(turret.turretList);playMusic();for (int i = 0; i < 4; i++) {blueList.add(turret.turretList.get(i));}for (int i = 4; i < 8; i++) {redList.add(turret.turretList.get(i));}/*** 攻击按钮*/JButton button = new JButton();button.setSize(130, 132);button.setLocation(1150, 430);button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 按钮事件player.attack(redList);}});this.add(button);player.addButton();while (true) {mb.createMinion(this, blueList);mr.createMinion(this, redList);repaint();try {Thread.sleep(25);} catch (Exception e) {e.printStackTrace();}}}public void paint(Graphics g) {if (offScreenImage == null) {offScreenImage = this.createImage(5984, 4452);}Graphics gImage = offScreenImage.getGraphics();if(state==0){turret.isLive();for (int i = 0; i < objList.size(); i++) {objList.get(i).paintSelf(gImage);}// 绘制攻击图片gImage.drawImage(attack, player.getX() + 500, player.getY() + 100, null);objList.removeAll(removeList);} else if (state ==1) {//游戏胜利gImage.drawImage(gameWin, player.getX()-700, player.getY()-300 , null);} else if (state == 2) {//游戏失败gImage.drawImage(gameLose, player.getX()-700, player.getY()-300, null);}g.drawImage(offScreenImage, -player.getX() + 700, -player.getY() + 350, null);// 添加按钮后不能调用键盘事件 因为程序的焦点变成了按钮 this.requestFocus() 把焦点重新改变到游戏界面上this.requestFocus();}// main方法public static void main(String[] args) {GameFrame gameFrame = new GameFrame();gameFrame.launch();}// 键盘事件private class KeyMonitor extends KeyAdapter {@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();player.keyPressed(e);}@Overridepublic void keyReleased(KeyEvent e) {int key = e.getKeyCode();player.keyReleased(e);}}static Clip clip;public static void playMusic() {try{//这里面放 绝对路径,音频必须是wav格式,用音频转换软件 把mp3 转成wav格式File musicPath = new File("C:\\Users\\23839\\IdeaProjects\\PlaneWar\\PlayMusic\\bgm.wav");if(musicPath.exists()){AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);clip = AudioSystem.getClip();clip.open(audioInput);FloatControl gainControl = (FloatControl)clip.getControl(FloatControl.Type.MASTER_GAIN);gainControl.setValue(-20.0f);//设置音量,范围为 -60.0f 到 6.0fclip.start();clip.loop(Clip.LOOP_CONTINUOUSLY);}else{}}catch(Exception ex){ex.printStackTrace();}}}
二,游戏元素父类
作用:初始化基本变量,定义addHp()方法,两点之间的距离方法,矩形与矩形的碰撞检测方法,矩形与圆形的碰撞检测方法,定义防御塔,英雄,小兵的攻击方法,用线程实现攻击的冷却时间。
package com.sxt;import java.awt.*;
import java.util.ArrayList;//游戏元素的父类
public abstract class GameObject {// 坐标private int x;private int y;// 图片private Image img;// 游戏界面public GameFrame gameFrame;// 速度private int spd;// 初始生命值private int hp;// 当前生命值private int currentHp;// 攻击目标private GameObject target;// 是否有目标private boolean hasTarget = false;// 攻击距离private int dis;// 攻击时间间隔private int attackCoolDownTime;// 攻击是否冷却private boolean attackCoolDown = true;// 是否存活private boolean alive = true;//是否被控制boolean beControlled = false;public GameObject(GameFrame gameFrame) {this.gameFrame = gameFrame;}public GameObject(int x, int y, GameFrame gameFrame) {this.x = x;this.y = y;this.gameFrame = gameFrame;}public GameObject() {}public void addHp(Graphics g, int difX, int difY, int width, int height, Color color) {// 绘制外部轮廓g.setColor(Color.black);g.drawRect(getX() - difX, getY() - difY, width, height);// 填充矩形g.setColor(color);g.fillRect(getX() - difX, getY() - difY, (int) (width * getCurrentHp() / getHp()), height);}public double getDis(int x1, int y1, int x2, int y2) {return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));}// 矩形矩形碰撞检测public boolean recIntersectsRec(Rectangle r1, Rectangle r2) {return r1.intersects(r2);}public boolean recIntersectsCir(Rectangle rec, int x, int y, int r) {// 矩形于圆相交: 圆心到至少一个矩形定点的距离小于rif ((getDis(x, y, rec.x, rec.y) < r) || (getDis(x, y, rec.x, rec.y + rec.height) < r)|| (getDis(x, y, rec.x + rec.width, rec.y) < r)|| (getDis(x, y, rec.x + rec.width, rec.y + rec.height) < r)) {return true;}return false;}// 攻击方法public void attack(ArrayList<GameObject> gameObjList) {if (hasTarget) {// 目标离开范围后寻找新的目标if (!recIntersectsCir(target.getRec(), getX(), getY(), getDis())) {setHasTarget(false);}// 目标死亡,寻找新目标else if (!target.isAlive()) {setHasTarget(false);} else if (isAttackCoolDown() && isAlive()) {Bullet bullet = null;// 防御塔攻击if (Turret.class.isAssignableFrom(getClass())) {bullet = new Bullet(gameFrame, this, getTarget(), 500, 50);}// 小兵攻击else if (Minion.class.isAssignableFrom(getClass())) {bullet = new Bullet(gameFrame, this, getTarget(), 50, 30);}// 玩家攻击else if (this instanceof Champion) {bullet = new Bullet(gameFrame, this, getTarget(), 500, 50);}gameFrame.objList.add(bullet);// 线程开始new AttackCD().start();}} else {// 遍历列表for (GameObject obj : gameObjList) {// 判断攻击范围(圆形)与敌方(矩形)是否相交if (recIntersectsCir(obj.getRec(), getX(), getY(), getDis())) {// 找到目标setTarget(obj);setHasTarget(true);// 跳出循环break;}}// 玩家是否在攻击范围内if (!hasTarget && gameObjList == gameFrame.blueList) {if (recIntersectsCir(gameFrame.player.getRec(), getX(), getY(), getDis())) {// 找到目标setTarget(gameFrame.player);setHasTarget(true);}}else {//野怪是否在攻击范围内for (GameObject obj : gameFrame.beast.beastList) {// 判断攻击范围(圆形)与敌方(矩形)是否相交if (recIntersectsCir(obj.getRec(), getX(), getY(), getDis())) {// 找到目标setTarget(obj);setHasTarget(true);// 跳出循环break;}}}}}//public abstract void addTurret();class AttackCD extends Thread {public void run() {// 将攻击功能设置为冷却状态setAttackCoolDown(false);// 线程休眠try {Thread.sleep(attackCoolDownTime);} catch (Exception e) {e.printStackTrace();}// 将攻击功能设置为攻击状态setAttackCoolDown(true);// 线程终止this.interrupt();}}// 绘制元素public abstract void paintSelf(Graphics g);// 返回矩形public abstract Rectangle getRec();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 Image getImg() {return img;}public void setImg(String img) {this.img = Toolkit.getDefaultToolkit().getImage(img);}public int getSpd() {return spd;}public void setSpd(int spd) {this.spd = spd;}public int getHp() {return hp;}public void setHp(int hp) {this.hp = hp;}public int getCurrentHp() {return currentHp;}public void setCurrentHp(int currentHp) {this.currentHp = currentHp;}public GameObject getTarget() {return target;}public void setTarget(GameObject target) {this.target = target;}public boolean isHasTarget() {return hasTarget;}public void setHasTarget(boolean hasTarget) {this.hasTarget = hasTarget;}public int getDis() {return dis;}public void setDis(int dis) {this.dis = dis;}public int getAttackCoolDownTime() {return attackCoolDownTime;}public void setAttackCoolDownTime(int attackCoolDownTime) {this.attackCoolDownTime = attackCoolDownTime;}public boolean isAttackCoolDown() {return attackCoolDown;}public void setAttackCoolDown(boolean attackCoolDown) {this.attackCoolDown = attackCoolDown;}public boolean isAlive() {return alive;}public void setAlive(boolean alive) {this.alive = alive;}
}
二,游戏元素父类
作用:初始化基本变量,定义addHp()方法,两点之间的距离方法,矩形与矩形的碰撞检测方法,矩形与圆形的碰撞检测方法,定义防御塔,英雄,小兵的攻击方法,用线程实现攻击的冷却时间。
package com.sxt;import java.awt.*;
import java.util.ArrayList;//游戏元素的父类
public abstract class GameObject {// 坐标private int x;private int y;// 图片private Image img;// 游戏界面public GameFrame gameFrame;// 速度private int spd;// 初始生命值private int hp;// 当前生命值private int currentHp;// 攻击目标private GameObject target;// 是否有目标private boolean hasTarget = false;// 攻击距离private int dis;// 攻击时间间隔private int attackCoolDownTime;// 攻击是否冷却private boolean attackCoolDown = true;// 是否存活private boolean alive = true;//是否被控制boolean beControlled = false;public GameObject(GameFrame gameFrame) {this.gameFrame = gameFrame;}public GameObject(int x, int y, GameFrame gameFrame) {this.x = x;this.y = y;this.gameFrame = gameFrame;}public GameObject() {}public void addHp(Graphics g, int difX, int difY, int width, int height, Color color) {// 绘制外部轮廓g.setColor(Color.black);g.drawRect(getX() - difX, getY() - difY, width, height);// 填充矩形g.setColor(color);g.fillRect(getX() - difX, getY() - difY, (int) (width * getCurrentHp() / getHp()), height);}public double getDis(int x1, int y1, int x2, int y2) {return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));}// 矩形矩形碰撞检测public boolean recIntersectsRec(Rectangle r1, Rectangle r2) {return r1.intersects(r2);}public boolean recIntersectsCir(Rectangle rec, int x, int y, int r) {// 矩形于圆相交: 圆心到至少一个矩形定点的距离小于rif ((getDis(x, y, rec.x, rec.y) < r) || (getDis(x, y, rec.x, rec.y + rec.height) < r)|| (getDis(x, y, rec.x + rec.width, rec.y) < r)|| (getDis(x, y, rec.x + rec.width, rec.y + rec.height) < r)) {return true;}return false;}// 攻击方法public void attack(ArrayList<GameObject> gameObjList) {if (hasTarget) {// 目标离开范围后寻找新的目标if (!recIntersectsCir(target.getRec(), getX(), getY(), getDis())) {setHasTarget(false);}// 目标死亡,寻找新目标else if (!target.isAlive()) {setHasTarget(false);} else if (isAttackCoolDown() && isAlive()) {Bullet bullet = null;// 防御塔攻击if (Turret.class.isAssignableFrom(getClass())) {bullet = new Bullet(gameFrame, this, getTarget(), 500, 50);}// 小兵攻击else if (Minion.class.isAssignableFrom(getClass())) {bullet = new Bullet(gameFrame, this, getTarget(), 50, 30);}// 玩家攻击else if (this instanceof Champion) {bullet = new Bullet(gameFrame, this, getTarget(), 500, 50);}gameFrame.objList.add(bullet);// 线程开始new AttackCD().start();}} else {// 遍历列表for (GameObject obj : gameObjList) {// 判断攻击范围(圆形)与敌方(矩形)是否相交if (recIntersectsCir(obj.getRec(), getX(), getY(), getDis())) {// 找到目标setTarget(obj);setHasTarget(true);// 跳出循环break;}}// 玩家是否在攻击范围内if (!hasTarget && gameObjList == gameFrame.blueList) {if (recIntersectsCir(gameFrame.player.getRec(), getX(), getY(), getDis())) {// 找到目标setTarget(gameFrame.player);setHasTarget(true);}}else {//野怪是否在攻击范围内for (GameObject obj : gameFrame.beast.beastList) {// 判断攻击范围(圆形)与敌方(矩形)是否相交if (recIntersectsCir(obj.getRec(), getX(), getY(), getDis())) {// 找到目标setTarget(obj);setHasTarget(true);// 跳出循环break;}}}}}//public abstract void addTurret();class AttackCD extends Thread {public void run() {// 将攻击功能设置为冷却状态setAttackCoolDown(false);// 线程休眠try {Thread.sleep(attackCoolDownTime);} catch (Exception e) {e.printStackTrace();}// 将攻击功能设置为攻击状态setAttackCoolDown(true);// 线程终止this.interrupt();}}// 绘制元素public abstract void paintSelf(Graphics g);// 返回矩形public abstract Rectangle getRec();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 Image getImg() {return img;}public void setImg(String img) {this.img = Toolkit.getDefaultToolkit().getImage(img);}public int getSpd() {return spd;}public void setSpd(int spd) {this.spd = spd;}public int getHp() {return hp;}public void setHp(int hp) {this.hp = hp;}public int getCurrentHp() {return currentHp;}public void setCurrentHp(int currentHp) {this.currentHp = currentHp;}public GameObject getTarget() {return target;}public void setTarget(GameObject target) {this.target = target;}public boolean isHasTarget() {return hasTarget;}public void setHasTarget(boolean hasTarget) {this.hasTarget = hasTarget;}public int getDis() {return dis;}public void setDis(int dis) {this.dis = dis;}public int getAttackCoolDownTime() {return attackCoolDownTime;}public void setAttackCoolDownTime(int attackCoolDownTime) {this.attackCoolDownTime = attackCoolDownTime;}public boolean isAttackCoolDown() {return attackCoolDown;}public void setAttackCoolDown(boolean attackCoolDown) {this.attackCoolDown = attackCoolDown;}public boolean isAlive() {return alive;}public void setAlive(boolean alive) {this.alive = alive;}
}
三,防御塔类
作用:初始化防御塔并添加到窗口中,游戏失败与胜利方法,在绘制自身方法中通过判断血量删除元素或者绘制防
package com.sxt;import java.awt.*;
import java.util.ArrayList;
//防御塔类
public class Turret extends GameObject{ArrayList<Turret> turretList = new ArrayList<>();public Turret turretBlueOne;public Turret turretBlueTwo;public Turret turretBlueThree;public Turret turretBlueBase;public Turret turretRedOne;public Turret turretRedTwo;public Turret turretRedThree;public Turret turretRedBase;public Turret(GameFrame gameFrame) {super(gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\turret.png");// 初始化八个防御塔turretList.add(turretBlueOne = new TurretBlue(1860, 3790, gameFrame));turretList.add(turretBlueTwo = new TurretBlue(2650, 3820, gameFrame));turretList.add(turretBlueThree = new TurretBlue(3995, 3830, gameFrame));turretList.add(turretBlueBase = new TurretBlue(1130, 3650, gameFrame));turretList.add(turretRedOne = new TurretRed(5100, 3030, gameFrame));turretList.add(turretRedTwo = new TurretRed(5120, 2100, gameFrame));turretList.add(turretRedThree = new TurretRed(5060, 1570, gameFrame));turretList.add(turretRedBase = new TurretRed(4850, 1100, gameFrame));}public Turret(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\turret.png");setHp(6000);setCurrentHp(getHp());setAttackCoolDownTime(1000);setDis(300);}public void isLive(){if(gameFrame.turret.turretBlueBase.getCurrentHp()==0){gameFrame.state=2;}if(gameFrame.turret.turretRedBase.getCurrentHp()==0){gameFrame.state=1;}}@Overridepublic void paintSelf(Graphics g) {// 生命值为0if (getCurrentHp() <= 0) {setAlive(false);gameFrame.removeList.add(this);if (this instanceof TurretBlue) {gameFrame.blueList.remove(this);} else {gameFrame.redList.remove(this);}} else {// 添加生命值if (this instanceof TurretBlue) {this.addHp(g, 50, 130, 100, 20, Color.GREEN);attack(gameFrame.redList);} else {this.addHp(g, 50, 130, 100, 20, Color.RED);attack(gameFrame.blueList);}g.drawImage(getImg(), getX() - 50, getY() - 100, null);g.fillOval(getX(), getY(), 10, 10);g.drawRect(getX() - 50, getY() - 100, 100, 180);g.drawOval(getX() - 300, getY() - 300, 600, 600);}}@Overridepublic Rectangle getRec() {return new Rectangle(getX() - 50, getY() - 100, 100, 180);}
}
1.蓝色防御塔
作用:有参构造。
package com.sxt;
//蓝方防御塔
public class TurretBlue extends Turret{public TurretBlue(GameFrame gameFrame){super(gameFrame);}public TurretBlue(int x,int y,GameFrame gameFrame){super(x,y,gameFrame);}
}
2.红方防御塔
作用:有参构造。
package com.sxt;
//蓝方防御塔
public class TurretRed extends Turret{//有参构造public TurretRed(GameFrame gameFrame){super(gameFrame);}public TurretRed(int x,int y,GameFrame gameFrame){super(x,y,gameFrame);}
}
四,英雄类
作用:实现键盘监听,添加按钮,鼠标监听。
package com.sxt;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;import javax.swing.JButton;//游戏英雄类
public abstract class Champion extends GameObject {// 移动public boolean up, down, left, right;// 移动图集static String[] imgs = new String[8];// 第几张图片int moveCount = 1;//技能图片Image abilityOne;Image abilityTwo;Image abilityThree;//技能冷却时间int coolDownTimeOne;int coolDownTimeTwo;int coolDownTimeThree;//三个技能是否处于冷却状态boolean coolDownOne = true;boolean coolDownTwo = true;boolean coolDownThree = true;static {for (int i = 1; i < 8; i++) {imgs[i] = "C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\move\\" + i + ".png";}}public Champion(GameFrame gameFrame) {super(gameFrame);//定义英雄的图片和坐标setImg("C:\\Users\\23839\\IdeaProjects\\HonorOfKings\\src\\imgs\\stand.png");setX(700);setY(3800);setSpd(75);setHp(24000);setDis(250);setAttackCoolDownTime(100);setCurrentHp(getHp());}public void keyPressed(KeyEvent e) {int key = e.getKeyCode();if (key == KeyEvent.VK_D) {right = true;}if (key == KeyEvent.VK_A) {left = true;}if (key == KeyEvent.VK_W) {up = true;}if (key == KeyEvent.VK_S) {down = true;}}public void keyReleased(KeyEvent e) {int key = e.getKeyCode();if (key == KeyEvent.VK_D) {right = false;}if (key == KeyEvent.VK_A) {left = false;}if (key == KeyEvent.VK_W) {up = false;}if (key == KeyEvent.VK_S) {down = false;}}public void move() {if (up) {setY(getY() - getSpd());}if (down) {setY(getY() + getSpd());}if (left) {setX(getX() - getSpd());}if (right) {setX(getX() + getSpd());}if (up || down || left || right) {setImg(imgs[moveCount]);moveCount++;if (moveCount == 8) {moveCount = 1;}} else {setImg("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\stand.png");}}//添加三个技能按钮public void addButton() {JButton button1 = new JButton();button1.setSize(100, 100);button1.setLocation(1056, 513);button1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {abilityOne();}});JButton button2 = new JButton();button2.setSize(100, 100);button2.setLocation(1090, 370);button2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {abilityTwo();}});JButton button3 = new JButton();button3.setSize(100, 100);button3.setLocation(1220, 300);button3.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {abilityThree();}});gameFrame.add(button1);gameFrame.add(button2);gameFrame.add(button3);}public abstract void abilityOne();public abstract void abilityTwo();public abstract void abilityThree();public abstract void abilityEffect(Graphics g);@Overridepublic void paintSelf(Graphics g) {// 生命值为0if (getCurrentHp() <= 0) {setAlive(false);gameFrame.removeList.add(this);} else {// 添加生命值addHp(g, 30, 80, 80, 20, Color.GREEN);//绘制技能图片g.drawImage(abilityOne, getX() + 360, getY() + 180, null);g.drawImage(abilityTwo, getX() + 400, getY() + 40, null);g.drawImage(abilityThree, getX() + 520, getY() - 30, null);// 绘制图片g.drawImage(this.getImg(), getX() - 33, getY() - 50, null);// 改变画笔颜色g.setColor(Color.GREEN);// 绘制中心圆点g.fillOval(getX(), getY(), 10, 10);// 绘制矩形边框g.drawRect(getX() - 23, getY() - 50, 60, 120);move();abilityEffect(g);}}@Overridepublic Rectangle getRec() {return new Rectangle(getX() - 30, getY() - 60, 60, 120);}}
1.英雄妲己
作用:定义三个技能的具体实现方法,用线程实现技能的冷却时间,控制时间,鼠标监视器实现释放技能一,定义技能效果。
package com.sxt;import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Random;public class ChampionDaji extends Champion {// 技能是否处于释放状态boolean ifAbilityOne = false;boolean ifAbilityTwo = false;// 鼠标监视器MouseMonitor m;// 一技能多边形Polygon p;// 一技能三角函数double sin;double cos;// 一技能已经攻击过的目标ArrayList<GameObject> attacked;// 一技能移动次数int step = 0;// 技能二目标GameObject abilityTwoTarget;// 技能二子弹Bullet abilityTwoBullet;// 三技能的五个子弹,释放三技能后重新定义Bullet[] bulletList = { new Bullet(), new Bullet(), new Bullet(), new Bullet(), new Bullet() };public ChampionDaji(GameFrame gameFrame) {super(gameFrame);abilityOne = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\Daji\\abilityOne.jpg");abilityTwo = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\Daji\\abilityTwo.jpg");abilityThree = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\Daji\\abilityThree.jpg");// 三个技能冷却时间coolDownTimeOne = 3000;coolDownTimeTwo = 5000;coolDownTimeThree = 8000;}public void exit() {this.gameFrame.removeMouseListener(m);}public void abilityOneMove() {p.translate((int) (50 * cos), -(int) (50 * sin));for (GameObject redObj : gameFrame.redList) {// 是红色方小兵 && 发生碰撞 && 没在attacked列表里if (redObj instanceof MinionRed && p.intersects(redObj.getRec()) && attacked.indexOf(redObj) == -1) {// 小兵扣血,添加到attacked里redObj.setCurrentHp(redObj.getCurrentHp() - 400);attacked.add(redObj);}}}@Overridepublic void abilityOne() {if (coolDownOne) {m = new MouseMonitor();p = new Polygon();gameFrame.addMouseListener(m);attacked = new ArrayList<GameObject>();}}public void abilityTwo() {if (coolDownTwo) {boolean find = false;for (GameObject redObj : gameFrame.objList) {// 是红色小兵 && 距离小于250 && 存活if (redObj instanceof MinionRed && recIntersectsCir(redObj.getRec(), getX(), getY(), 250)&& redObj.isAlive()) {// 添加子弹abilityTwoBullet = new Bullet(gameFrame, this, redObj, 250, 60, "C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\Daji\\abilityTwoBullet.png");gameFrame.objList.add(abilityTwoBullet);// 给目标赋值abilityTwoTarget = redObj;// 释放二技能ifAbilityTwo = true;find = true;break;}}if (find) {new AbilityTwoCD().start();find = false;}}}/*** 点击技能三释放技能 先将技能范围内目标储存到targetList里 提前定义五个子弹 技能释放时初始化五个子弹 子弹目标从targetList里随机选择* 如果期间目标死亡,制作一个目标替身,生命值设置为true 子弹与目标或替身碰撞后消失*/@Overridepublic void abilityThree() {if (coolDownThree) {// 创建列表来储存目标ArrayList<GameObject> targetList = new ArrayList<GameObject>();// 遍历redList,找到符合条件的目标,储存到列表里for (int i = 0; i < gameFrame.objList.size(); i++) {GameObject target = gameFrame.objList.get(i);// 是红色小兵 && 在技能范围里 && 存活if (target instanceof MinionRed && recIntersectsCir(target.getRec(), getX(), getY(), 250)&& target.isAlive()) {targetList.add(target);}}// 找到目标if (targetList.size() != 0) {// 创建五个子弹,随机攻击列表里的目标Random random = new Random();int count = 0; // 统计三技能发射子弹数量while (count < 5) {int r = random.nextInt(targetList.size());if (!targetList.get(r).isAlive()) {GameObject substitute = targetList.get(r);substitute.setAlive(true);bulletList[count] = new Bullet(gameFrame, this, substitute, 150, 60,"C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\Daji\\abilityTwoBullet.png");} else {bulletList[count] = new Bullet(gameFrame, this, targetList.get(r), 150, 60,"C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\Daji\\abilityTwoBullet.png");}count++;}new AbilityThreeBulletCD().start();// 三技能进入冷却new AbilityThreeCD().start();}}}@Overridepublic void abilityEffect(Graphics g) {if (ifAbilityOne) {g.setColor(Color.RED);g.fillPolygon(p);abilityOneMove();step++;if (step == 10) {step = 0;ifAbilityOne = false;}}if (ifAbilityTwo) {System.out.println(abilityTwoTarget.beControlled);if (abilityTwoBullet.getRec().intersects(abilityTwoTarget.getRec())) {new AbilityControllCD().start();ifAbilityTwo = false;}}}// 技能一冷却时间class AbilityOneCD extends Thread {public void run() {// 将技能一设置为冷却状态coolDownOne = false;// 线程休眠try {// one来表示一技能冷却时间int one = coolDownTimeOne;while (one > 0) {Thread.sleep(1000);System.out.println("一技能冷却时间: " + one / 1000);one -= 1000;}} catch (Exception e) {e.printStackTrace();}// 将技能一设置为攻击状态coolDownOne = true;// 线程终止this.interrupt();}}// 技能二冷却时间class AbilityTwoCD extends Thread {public void run() {// 将技能二设置为冷却状态coolDownTwo = false;// 线程休眠try {// one来表示二技能冷却时间int two = coolDownTimeTwo;while (two > 0) {Thread.sleep(1000);System.out.println("二技能冷却时间: " + two / 1000);two -= 1000;}} catch (Exception e) {e.printStackTrace();}// 将技能二设置为攻击状态coolDownTwo = true;// 线程终止this.interrupt();}}// 技能二控制时间class AbilityControllCD extends Thread {public void run() {abilityTwoTarget.beControlled = true;// 线程休眠try {Thread.sleep(20000);} catch (Exception e) {e.printStackTrace();}abilityTwoTarget.beControlled = false;this.interrupt();}}//技能三冷却状态class AbilityThreeCD extends Thread {public void run() {// 将攻击功能设置为冷却状态coolDownThree = false;// 休眠try {int three = coolDownTimeThree;while (coolDownTimeThree > 0) {Thread.sleep(1000);System.out.println("技能三冷却时间: " + coolDownTimeThree / 1000);coolDownTimeThree -= 1000;}coolDownTimeThree = three;} catch (Exception e) {e.printStackTrace();}// 将攻击功能解除冷却状态coolDownThree = true;// 线程终止this.interrupt();}}class AbilityThreeBulletCD extends Thread {public void run() {// 休眠try {System.out.println("Thread start");gameFrame.objList.add(bulletList[0]);Thread.sleep(100);gameFrame.objList.add(bulletList[1]);Thread.sleep(100);gameFrame.objList.add(bulletList[2]);Thread.sleep(100);gameFrame.objList.add(bulletList[3]);Thread.sleep(100);gameFrame.objList.add(bulletList[4]);} catch (Exception e) {e.printStackTrace();}// 线程终止this.interrupt();}}// 鼠标监视器private class MouseMonitor extends MouseAdapter {@Overridepublic void mousePressed(MouseEvent e) {// 当鼠标点击时int mouseX = e.getX(), mouseY = e.getY(), playerX = 700, playerY = 350;double dis = getDis(mouseX, mouseY, playerX, playerY);// 三角函数cos = (mouseX - playerX) / dis;sin = -(mouseY - playerY) / dis;// 坐标差int difX = (int) (60 * sin);int difY = (int) (60 * cos);p.addPoint(getX() - difX, getY() - difY);p.addPoint(getX() + difX, getY() + difY);p.addPoint(getX() + difX + (int) (20 * cos), getY() + difY - (int) (20 * sin));p.addPoint(getX() - difX + (int) (20 * cos), getY() - difY - (int) (20 * sin));exit();new AbilityOneCD().start();ifAbilityOne = true;}}
}
五,小兵类
作用:初始化小兵的基本参数,实现找到目标方法,向目标移动方法。每波小兵生成的时间,每个小兵生成的时间,在绘制自身方法中通过判断血量是否为零实现删除元素功能和绘制小兵功能。
package com.sxt;import java.awt.*;
import java.util.ArrayList;public abstract class Minion extends GameObject{// 是否生成下一个小兵private boolean nextMinion = true;// 是否生成下一波小兵private boolean nextLine = true;// 生成小兵数量private int minionCount = 0;// 是否检测到目标private boolean ifFindTarget = false;public Minion(GameFrame gameFrame) {super(gameFrame);setHp(800);setCurrentHp(getHp());setDis(100);setAttackCoolDownTime(2000);}/*** (1325, 3750) (4425, 3750) (5050, 3125) (5050, 1125)*/public abstract void move(ArrayList<GameObject> objList);public void findTarget(ArrayList<GameObject> objList) {for (GameObject obj : objList) {if (recIntersectsCir(obj.getRec(), getX(), getY(), 200)) {setTarget(obj);setIfFindTarget(true);}}if (objList == gameFrame.blueList) {if (recIntersectsCir(gameFrame.player.getRec(), getX(), getY(), 200)) {setTarget(gameFrame.player);setIfFindTarget(true);}}}public void moveToTarget() {int dis = (int) getDis(getX(), getY(), getTarget().getX(), getTarget().getY());if(dis!=0) {int xSpeed = (getSpd() * (getTarget().getX() - getX()) / dis);int ySpeed = (getSpd() * (getTarget().getY() - getY()) / dis);setX(getX() + xSpeed);setY(getY() + ySpeed);}}public void createMinion(GameFrame gameFrame, ArrayList<GameObject> minionList) {if (nextLine) {if (nextMinion) {// 蓝色方小兵if (minionList == this.gameFrame.blueList) {MinionBlue mb = new MinionBlue(gameFrame);gameFrame.objList.add(mb);minionList.add(mb);}// 红色方小兵else {MinionRed mr = new MinionRed(gameFrame);gameFrame.objList.add(mr);minionList.add(mr);}minionCount++;new NextMinion().start();}if (minionCount == 3) {minionCount = 0;new NextLine().start();}}}// 每个小兵生成时间class NextMinion extends Thread {public void run() {nextMinion = false;// 休眠1.5stry {Thread.sleep(1500);} catch (Exception e) {e.printStackTrace();}nextMinion = true;// 线程终止this.interrupt();}}// 每波小兵生成时间class NextLine extends Thread {public void run() {nextLine = false;// 休眠15stry {Thread.sleep(15000);} catch (Exception e) {e.printStackTrace();}nextLine = true;// 线程终止this.interrupt();}}@Overridepublic void paintSelf(Graphics g) {// 生命值为0if (getCurrentHp() <= 0) {setAlive(false);gameFrame.removeList.add(this);if (this instanceof MinionBlue) {gameFrame.blueList.remove(this);} else {gameFrame.redList.remove(this);}} else {// 添加生命值if (this instanceof MinionBlue) {this.addHp(g, 17, 28, 45, 10, Color.GREEN);} else {this.addHp(g, 17, 28, 45, 10, Color.RED);}g.drawImage(getImg(), getX() - 16, getY() - 16, null);g.setColor(Color.RED);g.fillOval(getX(), getY(), 10, 10);g.drawRect(getX() - 16, getY() - 16, 45, 45);g.drawOval(getX() - 200, getY() - 200, 400, 400);// 小兵移动if (!beControlled) {if (this instanceof MinionBlue) {move(gameFrame.redList);} else {move(gameFrame.blueList);}}}}@Overridepublic Rectangle getRec() {return new Rectangle(getX() - 16, getY() - 16, 45, 45);}public boolean isIfFindTarget() {return ifFindTarget;}public void setIfFindTarget(boolean ifFindTarget) {this.ifFindTarget = ifFindTarget;}}
2.蓝方小兵
作用:具体的蓝方小兵移动方法。
package com.sxt;import java.util.ArrayList;public class MinionBlue extends Minion{public MinionBlue(GameFrame gameFrame) {super(gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\minion\\blue.jpg");setX(1325);setY(3750);}@Overridepublic void move(ArrayList<GameObject> objList) {if(isIfFindTarget()) {//离开检测范围if(!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {setIfFindTarget(false);}else {if(!isHasTarget()) {moveToTarget();}attack(objList);}}else {findTarget(objList);//原路线移动if(getX() < 4425) {setSpd(5);setX(getX() + getSpd());}else if(getX() < 5100 && getX() >= 4425) {setSpd(20);setX(getX() + getSpd());setY(getY() - getSpd());}else if(getX() >= 4900) {setSpd(18);setY(getY() - getSpd());}}}
}
六,子弹类
作用:子弹移动方法。
package com.sxt;import java.awt.*;//子弹类
public class Bullet extends GameObject {//发射子弹的游戏元素GameObject attacker;//目标GameObject target;//攻击力int ad;public Bullet(GameFrame gameFrame, GameObject attacker, GameObject target, int ad, int spd) {super(attacker.getX(), attacker.getY(), gameFrame);this.attacker = attacker;this.target = target;setAd(ad);setSpd(spd);}public Bullet(GameFrame gameFrame, GameObject attacker, GameObject target, int ad, int spd, String img) {super(attacker.getX(), attacker.getY(), gameFrame);this.attacker = attacker;this.target = target;setImg(img);setAd(ad);setSpd(spd);}public Bullet() {super();}public void move() {//子弹与目标碰撞,子弹消失,目标减血if (recIntersectsRec(getRec(), target.getRec())) {target.setCurrentHp(target.getCurrentHp() - getAd());gameFrame.removeList.add(this);}int dis = (int) getDis(getX(), getY(), target.getX(), target.getY());if (dis != 0) {int xSpeed = (getSpd() * (target.getX() - getX()) / dis);int ySpeed = (getSpd() * (target.getY() - getY()) / dis);setX(getX() + xSpeed);setY(getY() + ySpeed);}}@Overridepublic void paintSelf(Graphics g) {g.drawImage(getImg(), getX()-16, getY()-16, null);g.setColor(Color.BLACK);g.fillOval(getX()-5, getY()-5, 10, 10);g.drawRect(getX()-5, getY()-5, 10, 10);move();}@Overridepublic Rectangle getRec() {return new Rectangle(getX()-5, getY()-5, 10, 10);}public int getAd() {return ad;}public void setAd(int ad) {this.ad = ad;}
}
七,背景类
作用:初始化背景
package com.sxt;import java.awt.*;
//背景类
public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\Map.jpg");public void paintSelf(Graphics g){g.drawImage(bg,0,0,null);}@Overridepublic Rectangle getRec() {return null;}
}
八,野怪类
作用:在绘制自身方法中通过判断血量删除元素或者绘制自身,用线程实现自动复活功能。
package com.sxt.beast;import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;import com.sxt.*;public class Beast extends GameObject {public ArrayList<Beast> beastList = new ArrayList<>();int width;int height;// 复活的元素Beast beast = null;public Beast(GameFrame gameFrame) {super(gameFrame);beastList.add(new RedBuff(3045, 3170, gameFrame));beastList.add(new Bear(2800, 2855, gameFrame));beastList.add(new Bird(3570, 3380, gameFrame));beastList.add(new Xiyi(4585, 2365, gameFrame));beastList.add(new BlueBuff(4025, 2295, gameFrame));beastList.add(new Wolf(4235, 1945, gameFrame));}public Beast(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setHp(1000);setCurrentHp(getHp());beast = this;}@Overridepublic void paintSelf(Graphics g) {if (getCurrentHp() <= 0) {System.out.println("beast die");setAlive(false);gameFrame.removeList.add(this);gameFrame.beast.beastList.remove(this);new ReviveCD().start();} else {// 添加生命值addHp(g, width / 2, 80, width, 20, Color.GREEN);g.drawImage(getImg(), getX() - width / 2, getY() - height / 2, null);g.setColor(Color.RED);g.fillOval(getX(), getY(), 10, 10);g.drawOval(getX() - getDis(), getY() - getDis(), 2 * getDis(), 2 * getDis());}}@Overridepublic Rectangle getRec() {return new Rectangle(getX() - width / 2, getY() - height / 2, width, height);}//野怪复活class ReviveCD extends Thread {public void run() {// 线程休眠try {Thread.sleep(5000);} catch (Exception e) {e.printStackTrace();}Beast reviveBeast;if (beast instanceof RedBuff) {reviveBeast = new RedBuff(3045, 3170, gameFrame);} else if (beast instanceof Bear) {reviveBeast = new Bear(2800, 2855, gameFrame);} else if (beast instanceof Bird) {reviveBeast = new Bird(3570, 3380, gameFrame);} else if (beast instanceof Xiyi) {reviveBeast = new Xiyi(4585, 2365, gameFrame);} else if (beast instanceof BlueBuff) {reviveBeast = new BlueBuff(4025, 2295, gameFrame);} else {reviveBeast = new Wolf(4235, 1945, gameFrame);}gameFrame.objList.add(reviveBeast);gameFrame.beast.beastList.add(reviveBeast);}}}
1.熊类
package com.sxt.beast;
import com.sxt.GameFrame;
public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\HonorOfKings\\src\\imgs\\beast\\bear.jpg");width = 85;height = 112;setDis(65);}}
2.鸟类
package com.sxt.beast;
import com.sxt.GameFrame;
public class Bird extends Beast {public Bird(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\HonorOfKings\\src\\imgs\\beast\\红隼.jpg");width = 122;height = 98;setDis(125);}}
3.蓝Buff
package com.sxt.beast;
import com.sxt.GameFrame;
public class BlueBuff extends Beast {public BlueBuff(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\HonorOfKings\\src\\imgs\\beast\\blueBuff.jpg");width = 142;height = 176;setDis(70);}}
4.红Buff
package com.sxt.beast;
import com.sxt.GameFrame;
public class RedBuff extends Beast {public RedBuff(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\HonorOfKings\\src\\imgs\\beast\\redBuff.jpg");width = 103;height = 150;setDis(70);}
}
5.狼类
package com.sxt.beast;
import com.sxt.GameFrame;
public class Wolf extends Beast {public Wolf(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\HonorOfKings\\src\\imgs\\beast\\wolf.jpg");width = 145;height = 140;setDis(65);}}
6.蜥蜴类
package com.sxt.beast;
import com.sxt.GameFrame;
public class Xiyi extends Beast {public Xiyi(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\23839\\IdeaProjects\\HonorOfKings\\src\\imgs\\beast\\蜥蜴.jpg");width = 111;height = 65;setDis(125);}
}



相关文章:
Java王者荣耀火柴人
主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…...
1.鸿蒙应用程序开发app_hap开发环境搭建
1.下载Node.js, Javascipts的运行环境 node.js版本下载v12.18.3/https://www.cnblogs.com/txwtech/p/17865780.html 2.下载并安装DevEco Studio DevEco Studio 3.1 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发,提供了代码智能编辑、低代…...
JDK多版本集成 Jacoco 配置指南
JDK多版本集成 Jacoco 配置指南 本篇相关 JDK 版本配置如下: JDK8 JDK11 JDK17 Jacoco 是什么 Jacoco 是一个用于Java程序的代码覆盖率报告工具。它通过动态分析(在代码执行时收集数据)来生成代码覆盖率报告文件。Jacoco 支持多种覆盖率标…...
容器及容器调度(云)
在云计算中,容器是一种轻量级、可执行的软件包,它包含应用程序及其全部依赖项,包括库、二进制文件、配置文件等。容器与虚拟机不同,因为它们不需要包含完整的操作系统;相反,所有容器都共享主机操作系统的内…...
实验七 子网的划分
实验七 子网的划分 实验目的掌握划分子网的方法实验内容划分给定IP地址的子网将划分后的子网应用到网络环境中实验要求每位同学从下表中至少选择一行进行子网划分,并填写所选择行的剩余部分。(注意:子网号全0的不用)标准IP地址 要求划 分子网数 借用的主机位数 子网掩码 第…...
Proteus仿真--射击小游戏仿真设计
本文介绍基于proteus射击小游戏仿真设计(完整仿真源文件及代码见文末链接) 仿真图如下 K1-K4为4个按键,用于上移、下移、确认等,模拟单机游戏 仿真运行视频 Proteus仿真--射击小游戏仿真设计 附完整Proteus仿真资料代码资料 …...
docker的资源控制:
docker的资源控制: 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制,记录,隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…...
Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书
Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客…...
【人工智能 | 知识表示方法】状态空间法 语义网络,良好的知识表示是解题的关键!(笔记总结系列)
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...
华清远见嵌入式学习——QT——作业1
作业要求: 代码: ①:头文件 #ifndef LOGIN_H #define LOGIN_H#include <QWidget> #include <QLineEdit> //行编辑器类 #include <QPushButton> //按钮类 #include <QLabel> //标签类 #include <QM…...
MYSQL练习创建存储函数和存储过程
创建数据表,信息如下: 表结构: 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否…...
Java基础语法面试题
数据类型 Java有哪些数据类型 定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类 型,在内存中分配了不同大小的内存空间。 分类: 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,dou…...
结合ColorUI组件开发微信小程序
1.自定义组件生命周期函数: Component({data: {},attached() {console.log("自定义组件生命周期函数 attached--先执行");this.getPos();},ready() {console.log("ready生命周期函数---在attached之后执行")},methods: {getPos() {var that th…...
如何搭建废品上门回收小程序
如今,随着环境保护意识的增强,废品的回收和再利用变得越来越重要。为了方便人们进行废品回收,搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …...
蓝牙配对、连接和删除汇总
目的:处理PC连接蓝牙设备的配对、连接和删除操作,以及常见故障。 命令行配对蓝牙设备并连接 要求:配对BLUET043蓝牙,密码为4444,然后连接该蓝牙。操作步骤如下: Step1.下载 修复工具,然后安装…...
Linux网络——高级IO
目录 一.五种IO模型 1.阻塞式IO 2.非阻塞式IO 3.信号驱动IO 4.多路转接IO: 5.异步IO 二.同步通信 vs 异步通信 三.设置非阻塞IO 1.阻塞 vs 非阻塞 2.非阻塞IO 3.实现函数SetNoBlock 四.I/O多路转接之select 1.初识select 2.select函数原型 3.socket就绪…...
Java注解详解
概述 注解是对程序代码进行标注和解释的一种方式。在Java中,注解提供了一种元数据形式,能够在程序中嵌入有关程序的信息,以便进行进一步的处理。注解通过使用符号来声明,如Override、Deprecated等。 注解和注释的区别 注释&…...
Android wifi 框架以及Enable流程
Android P相比于Android O的变化 多了WifiStateMachinePrime(状态机的前处理机制),wifiService的相关cmd 不再是直接send 给WifiStateMachine,而是被送到WifiStateMachinePrime先进行处理后,再送往WifiStateMachine也…...
十五、机器学习进阶知识:K-Means聚类算法
文章目录 1、聚类概述2、K-Means聚类算法原理3、K-Means聚类实现3.1 基于SKlearn实现K-Means聚类3.2 自编写方式实现K-Means聚类 4、算法不足与解决思路4.1 存在的问题4.2 常见K值确定方法4.3 算法评估优化思路 1、聚类概述 聚类(Clustering)是指将不同…...
软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位
目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...
