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);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214368.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214368.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214368.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LVGL——按鈕部件

目錄 一、組成部分 二、按鈕部件操作 1、創建 2、設置樣式 3、添加事件 4、代碼例程 三、按鈕部件案例 一、組成部分 主體&#xff08;LV_PART_MAIN&#xff09; 二、按鈕部件操作 1、創建 lv_obj_t *btn lv_btn_create( parent );2、設置樣式 lv_obj_set_siz…

nginx配置自動壓縮-gzip壓縮

1.nginx配置文件 server里添加gzip配置信息。 重啟nginx服務 對比效果&#xff1a;上圖是沒有開啟gzip自動壓縮&#xff0c;總共資源是1.3M&#xff0c;傳輸1.3MB&#xff0c;下圖是開啟gzip壓縮&#xff0c;總共資源是1.3M&#xff0c;傳輸了973KB。

Axure簡單安裝與入門

目錄 一.Axure簡介 二.應用場景 三.安裝與漢化 3.1.安裝 3.2.漢化 四. 入門 4.1.復制、剪切及粘貼區域 4.2.選擇模式 4.3. 插入形狀 4.4.預覽、共享 感謝大家觀看&#xff01;希望能幫到你哦&#xff01;&#xff01;&#xff01; 一.Axure簡介 Axure RP是一款專業的原型…

四種數據庫執行腳本文件導入數據的方式

執行腳本文件的方式 Mysql mysql執行sql腳本文件的方法&#xff1a; 1、在命令行輸入mysql -uroot -h10.235.5.55 -p’123456’ -P3306 < F:\hello\niuzi.sql 2、在命令行輸入【source F:\hello\niuzi.sql】 mysql -uroot -h10.235.5.55 -p’123456’ -P3306 -e "sou…

HarmonyOS4.0從零開始的開發教程10管理組件狀態

HarmonyOS&#xff08;八&#xff09;管理組件狀態 概述 在應用中&#xff0c;界面通常都是動態的。如圖1所示&#xff0c;在子目標列表中&#xff0c;當用戶點擊目標一&#xff0c;目標一會呈現展開狀態&#xff0c;再次點擊目標一&#xff0c;目標一呈現收起狀態。界面會根…

ERROR: [BD 41-237] Bus Interface property FREQ_HZ does not match between

在自定義IP出現以上錯誤時可以通過雙擊模塊clk屬性 如果是灰色無法二次編輯時&#xff0c;在封裝IP時&#xff0c;選擇以下菜單

復雜sql分析 以及 索引合并

復雜sql分析 簡單的sql語句我們很簡單的就可以分析出來它的執行計劃&#xff0c;但是復雜的sql呢。例如 SELECT * FROM single_table WHERE(key1 > xyz AND key2 748 ) OR(key1 < abc AND key1 > lmn) OR(key1 LIKE %suf AND key1 > zzz AND (key2 < 8000 OR…

為什么同一張顯卡,深度學習的模型訓練的時候,有時候成功了,有時候失敗了

在同一張顯卡上進行深度學習模型訓練時&#xff0c;成功或失敗的結果可能受到以下因素的影響&#xff1a; 隨機性: 深度學習模型中的一些組件&#xff08;如權重初始化、數據的隨機排列等&#xff09;可能涉及到隨機性。這可能導致在每次訓練時得到不同的結果&#xff0c;有時成…

Mybatis進階知識

Mybatis的事務管理機制 在mybatis-config.xml文件中.可以進行mybatis的事務管理 <transactionManager type"JDBC"/> type的值有兩個 JDBCMANAGED JDBC事務管理器 mybatis框架自己管理事務&#xff0c;自己采用原生的JDBC代碼去管理事務 底層創建的事務管…

匯總區間算法(leetcode第228題)

題目描述&#xff1a; 給定一個 無重復元素 的 有序 整數數組 nums 。返回 恰好覆蓋數組中所有數字 的 最小有序 區間范圍列表 。也就是說&#xff0c;nums 的每個元素都恰好被某個區間范圍所覆蓋&#xff0c;并且不存在屬于某個范圍但不屬于 nums 的數字 x 。列表中的每個區…

財務機器人(RPA)會影響會計人員從業嗎?

財務機器人會對會計從業人員有影響。 不過是正面積極的影響。 它是財務人員工作的好助手好幫手。 具體展開聊聊財務RPA機器人是如何成為財務人員的好幫手。 財務機器人是在人工智能和自動化技術的基礎上建立的、以軟件機器人作為虛擬勞動力、依據預先設定的程序與現有用戶系…

活用異常處理(try-except)

介紹 簡要介紹Python的異常處理&#xff08;try-except&#xff09;。 基本語法 Try-except是Python中異常處理的基礎。 作為例子&#xff0c;我們將解釋執行除零時發生 ZeroDivisionError 的情況。 當除以零時&#xff0c;會出現以下錯誤。 print(1 / 0) # ZeroDivisionE…

藍牙配對、連接和刪除匯總

目的&#xff1a;處理PC連接藍牙設備的配對、連接和刪除操作&#xff0c;以及常見故障。 命令行配對藍牙設備并連接 要求&#xff1a;配對BLUET043藍牙&#xff0c;密碼為4444&#xff0c;然后連接該藍牙。操作步驟如下&#xff1a; Step1.下載 修復工具&#xff0c;然后安裝…

利用python編寫簡易POC腳本

POC&#xff1a;概念證明&#xff0c;即概念驗證&#xff08;英語&#xff1a;Proof of concept&#xff0c;簡稱POC&#xff09;是對某些想法的一個較短而不完整的實現&#xff0c;以證明其可行性&#xff0c;示范其原理&#xff0c;其目的是為了驗證一些概念或理論。 聲明&a…

三哥的黑科技,印度發布無線加熱服裝專利,冬季神器要來了

眾所周知風和自由在冬天是不存在的&#xff0c;冬天只剩下冰冷的像刀子一樣的風刮在你的臉上&#xff0c;哪怕穿的很厚&#xff0c;戴上全盔&#xff0c;也無法阻擋冰冷的風帶走你身體溫度&#xff0c;如果穿的特別多&#xff0c;騎車時候的舒適感和穿脫衣物的繁瑣也是一大頭疼…

【MySQL系列】Centos安裝MySQL

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

vim常用鍵位總結

1、移動光標 按鍵作用h或←光標向左移動一個字符j或↓光標向下移動一個字符k或↑光標向上移動一個字符l或→光標向右移動一個字符Ctrl f或Page Down屏幕向下移動一頁&#xff08;常用&#xff09;Ctrl b或Page Up屏幕向上移動一頁&#xff08;常用&#xff09;Ctrl d屏幕向…

Kafka使用總結

1、Kafka是何如做到高性能的&#xff1f; a、消息批處理減少網絡通信開銷&#xff0c;提升系統吞吐能力&#xff08;先攢一波&#xff0c;消息以“批”為單位進行處理&#xff09; 生產端&#xff1a;無論是同步發送還是異步發送&#xff0c;Kafka都不會立即就把這條消息發送出…