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,游戏失败2 -
int 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() { -
@Override -
public 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 { -
@Override -
public void keyPressed(KeyEvent e) { -
int key = e.getKeyCode(); -
player.keyPressed(e); -
} -
@Override -
public 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.0f -
clip.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) { -
// 矩形于圆相交: 圆心到至少一个矩形定点的距离小于r -
if ((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; -
} -
} -
@Override -
public void paintSelf(Graphics g) { -
// 生命值为0 -
if (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); -
} -
} -
@Override -
public 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() { -
@Override -
public void actionPerformed(ActionEvent e) { -
abilityOne(); -
} -
}); -
JButton button2 = new JButton(); -
button2.setSize(100, 100); -
button2.setLocation(1090, 370); -
button2.addActionListener(new ActionListener() { -
@Override -
public void actionPerformed(ActionEvent e) { -
abilityTwo(); -
} -
}); -
JButton button3 = new JButton(); -
button3.setSize(100, 100); -
button3.setLocation(1220, 300); -
button3.addActionListener(new ActionListener() { -
@Override -
public 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); -
@Override -
public void paintSelf(Graphics g) { -
// 生命值为0 -
if (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); -
} -
} -
@Override -
public 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); -
} -
} -
} -
@Override -
public 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 子弹与目标或替身碰撞后消失 -
*/ -
@Override -
public 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(); -
} -
} -
} -
@Override -
public 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 { -
@Override -
public 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.5s -
try { -
Thread.sleep(1500); -
} catch (Exception e) { -
e.printStackTrace(); -
} -
nextMinion = true; -
// 线程终止 -
this.interrupt(); -
} -
} -
// 每波小兵生成时间 -
class NextLine extends Thread { -
public void run() { -
nextLine = false; -
// 休眠15s -
try { -
Thread.sleep(15000); -
} catch (Exception e) { -
e.printStackTrace(); -
} -
nextLine = true; -
// 线程终止 -
this.interrupt(); -
} -
} -
@Override -
public void paintSelf(Graphics g) { -
// 生命值为0 -
if (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); -
} -
} -
} -
} -
@Override -
public Rectangle getRec() { -
return new Rectangle(getX() - 16, getY() - 16, 45, 45); -
} -
public boolean isIfFindTarget() { -
return ifFindTarget; -
} -
public void setIfFindTarget(boolean ifFindTarget) { -
this.ifFindTarget = ifFindTarget; -
} -
}
![]()
1.红方小兵
作用:具体的红方小兵移动方法。
-
package com.sxt; -
import java.util.ArrayList; -
public class MinionRed extends Minion { -
public MinionRed(GameFrame gameFrame) { -
super(gameFrame); -
setImg("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\minion\\red.jpg"); -
setX(5050); -
setY(1125); -
} -
@Override -
public 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 (getY() < 3125) { -
setSpd(28); -
setY(getY() + getSpd()); -
} else if (getY() < 3750 && getY() >= 3125) { -
setSpd(20); -
setY(getY() + getSpd()); -
setX(getX() - getSpd()); -
} else if (getY() >= 3750) { -
setSpd(25); -
setX(getX() - getSpd()); -
} -
} -
} -
}
![]()
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); -
} -
@Override -
public 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); -
} -
} -
@Override -
public 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(); -
} -
@Override -
public 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); -
} -
@Override -
public 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; -
} -
@Override -
public 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()); -
} -
} -
@Override -
public 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键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…...
【黑马甄选离线数仓day04_维度域开发】
1. 维度主题表数据导出 1.1 PostgreSQL介绍 PostgreSQL 是一个功能强大的开源对象关系数据库系统,它使用和扩展了 SQL 语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。 官方网址:PostgreSQL: The worlds most advanced open s…...
C# 中using关键字的使用
在C#中我们还是很有必要掌握using关键字的。 比如这样: string path “D:\data.txt”; if (!File.Exists(path )) {File.Create(path); File.WriteAllText(path,"OK"); } 首先我创建…...
16 redis高可用读写分离方案
在前面说的JedisSentinelPool只能实现主从的切换,而无法实现读写的分离。 1.哨兵的客户端实现主从切换方案 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</arti…...
Nginx模块开发之http handler实现流量统计(2)
文章目录 一、概述二、Nginx handler模块开发2.1、代码实现2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 总结 一、概述 上一篇【Nginx模块开发之http handler实现流量统计(1)】使用数组在单进程实现了IP的流量统计&a…...
案例012:Java+SSM+uniapp基于微信小程序的科创微应用平台设计与实现
文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…...
vue3+elementPlus登录向后端服务器发起数据请求Ajax
后端的url登录接口 先修改main.js文件 // 导入Ajax 前后端数据传输 import axios from "axios"; const app createApp(App) //vue3.0使用app.config.globalProperties.$http app.config.globalProperties.$http axios app.mount(#app); login.vue 页面显示部分…...
存储区域
将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并在内存中为这些段分配空间。 栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。 进…...
C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)
前言 我们在开发串口通信程序时,有时候会遇到比如单片机或者传感器发送的数据速度特别快,比如10ms、20ms发送一次,并且每次发送的数据量还比较大,如果按照常规的写法,我们会发现接收的数据还没处理完,新的数据又发送过来了,这就会导致处理数据滞后,软件始终处理的不是…...
Redis-Redis高可用集群之水平扩展
Redis3.0以后的版本虽然有了集群功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,今天就来带大家看看redis高可用集群如何做水平扩展,原始集群(见下图)由6个节点组成,6个节点分布在三…...
2023全球数字贸易创新大赛-人工智能元宇宙-4-10
目录 竞赛感悟: 创业的话 好的项目 数字工厂,智慧制造:集群控制的安全问题...
go defer用法_类似与python_java_finially
defer 执行 时间 defer 一般 定义在 函数 开头, 但是 他会 最后 被执行 A defer statement defers the execution of a function until the surrounding function returns. 如果说 为什么 不在 末尾 定义 defer 呢, 因为 当 错误 发生时, 程序 执行 不到 末尾 就会 崩溃. d…...
Log4j2.xml不生效:WARN StatusLogger Multiple logging implementations found:
背景 将 -Dlog4j.debug 添加到IDEA的类的启动配置中 运行上图代码,这里log4j2.xml控制的日志级别是info,很明显是没生效。 DEBUG StatusLogger org.slf4j.helpers.Log4jLoggerFactory is not on classpath. Good! DEBUG StatusLogger Using Shutdow…...
【LeetCode】挑战100天 Day14(热题+面试经典150题)
【LeetCode】挑战100天 Day14(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-162.1 题目2.2 题解 三、面试经典 150 题-163.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&…...
VMware安装windows操作系统
一、下载镜像包 地址:镜像包地址。 找到需要的版本下载镜像包。 二、安装 打开VMware新建虚拟机,选择用镜像文件。将下载的镜像包加载进去即可。...
历时半年,我发布了一款习惯打卡小程序
半年多前,我一直困扰于如何记录习惯打卡情况,在参考了市面上绝大多数的习惯培养程序后,终于创建并发布了这款习惯打卡小程序。 “我的小日常打卡”小程序主要提供习惯打卡和专注训练功能。致力于培养用户养成一个个好的习惯,改掉…...
被DDOS了怎么办 要如何应对
DDoS攻击的特点和类型 1. 特点 DDoS攻击的特点是通过大量合法的请求或者无效的请求,消耗目标服务器的网络带宽和系统资源,使其无法正常运行。攻击者通常使用多个主机发起攻击,以达到更高的攻击效果。 2. 常见类型 (1)S…...
时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)
一、本文介绍 本文给大家带来的实战内容是利用PyTorch实现LSTM-GRU模型,LSTM和GRU都分别是RNN中最常用Cell之一,也都是时间序列预测中最常见的结构单元之一,本文的内容将会从实战的角度带你分析LSTM和GRU的机制和效果,同时如果你…...
【免费使用】基于PaddleSeg开源项目开发的人像抠图Web API接口
基于PaddleSeg开源项目开发的人像抠图API接口,服务器不存储照片大家可放心使用。 1、请求接口 请求地址:http://apiseg.hysys.cn/predict_img 请求方式:POST 请求参数:{"image":"/9j/4AAQ..."} 参数是jso…...
Centos7 Python环境和yum修复
1、删除现有残余包 [rootlocalhost ]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# whereis python |xargs rm -frv[rootlocalhost ]# whereis python ##验证清除&…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
