一.准备工作
首先创建一个新的Java项目命名为“王者荣耀”,并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。

创建一个名为“img”的文件夹来储存所需的图片素材。

二.代码呈现
package com.sxt;
  
 import javax.swing.*;
 import java.awt.*;
  
 public class Background extends GameObject {
  
     public Background(GameFrame gameFrame) {
         super(gameFrame);
         // TODO Auto-generated constructor stub
     }
  
     Image bg = Toolkit.getDefaultToolkit().getImage("img/Map.jpg");
  
     public void paintSelf(Graphics g){
         g.drawImage(bg,0,0,null);
  
     }
  
     @Override
     public Rectangle getRec() {
         // TODO Auto-generated method stub
         return null;
     }
 }
2.
package com.sxt;
  
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Rectangle;
  
 import com.sxt.beast.Beast;
  
 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);
         // TODO Auto-generated constructor stub
     }
  
     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);
         // TODO Auto-generated constructor stub
     }
     public Bullet() {
         super();
         // TODO Auto-generated constructor stub
     }
  
     public void move() {
         // 子弹与目标碰撞,子弹消失,目标减血
         if (recIntersectsRec(getRec(), target.getRec())) {
             if (Beast.class.isAssignableFrom(target.getClass())) {
                 target.setTarget(gameFrame.player);
                 target.setHasTarget(true);
             }
  
             target.setCurrentHp(target.getCurrentHp() - getAd());
             gameFrame.removeList.add(this);
         }
         double dis = getDis(getX(), getY(), target.getX(), target.getY());
         int xSpeed = (int) (getSpd() * (target.getX() - getX()) / dis);
         int ySpeed = (int) (getSpd() * (target.getY() - getY()) / dis);
         setX(getX() + xSpeed);
         setY(getY() + ySpeed);
     }
  
     @Override
     public void paintSelf(Graphics g) {
         // TODO Auto-generated method stub
         g.drawImage(getImg(), getX() - 16, getY() - 16, null);
         if (this.getImg() == 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() {
         // TODO Auto-generated method stub
         return new Rectangle(getX() - 5, getY() - 5, 10, 10);
     }
  
     /**
      * @return the ad
      */
     public int getAd() {
         return ad;
     }
  
     /**
      * @param ad the ad to set
      */
     public void setAd(int ad) {
         this.ad = ad;
     }
  
 }
3.
package com.sxt;
  
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Image;
 import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
  
 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;
     //英雄头像
     Image classical;
     //技能冷却时间
     int coolDownTimeOne;
     int coolDownTimeTwo;
     int coolDownTimeThree;
     //三个技能是否处于冷却状态
     boolean coolDownOne = true;
     boolean coolDownTwo = true;
     boolean coolDownThree = true;
     //英雄列表
     ArrayList<Champion> championList = new ArrayList<Champion>();
     
     static {
         for (int i = 1; i < 8; i++) {
             imgs[i] = "img/" + i + ".png";
         }
     }
  
     public Champion(GameFrame gameFrame, int x, int y) {
         super(gameFrame);
         setImg("img/stand.png");
         setX(x);
         setY(y);
         setSpd(75);
         setHp(24000);
         setDis(250);
         setAttackCoolDownTime(100);
         setCurrentHp(getHp());
         championList.add(new ChampionDaji(gameFrame));
         championList.add(new ChampionHouyi(gameFrame));
     }
     
     public Champion(GameFrame gameFrame) {
         // TODO Auto-generated constructor stub
         super(gameFrame);
         setImg("img/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("img/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) {
         // TODO Auto-generated method stub
         // 生命值为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() {
         // TODO Auto-generated method stub
         return new Rectangle(getX() - 30, getY() - 60, 60, 120);
     }
  
 }
4,
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;
  
 import com.sxt.beast.Beast;
  
 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("img/abilityOne.jpg");
         abilityTwo = Toolkit.getDefaultToolkit().getImage("img/abilityTwo.jpg");
         abilityThree = Toolkit.getDefaultToolkit().getImage("img/abilityThree.jpg");
         classical = Toolkit.getDefaultToolkit().getImage("img/Classical.jpg");
         // 三个技能冷却时间
         coolDownTimeOne = 6000;
         coolDownTimeTwo = 8000;
         coolDownTimeThree = 8000;
     }
  
     public void exit() {
         this.gameFrame.removeMouseListener(m);
     }
  
     public void abilityOneMove() {
         p.translate((int) (50 * cos), -(int) (50 * sin));
         for (GameObject redObj : gameFrame.objList) {
             // 是红色方小兵 && 发生碰撞 && 没在attacked列表里
             if (redObj instanceof MinionRed && p.intersects(redObj.getRec()) && attacked.indexOf(redObj) == -1) {
                 // 小兵扣血,添加到attacked里
                 redObj.setCurrentHp(redObj.getCurrentHp() - 400);
                 attacked.add(redObj);
             }else if (Beast.class.isAssignableFrom(redObj.getClass()) && p.intersects(redObj.getRec()) && attacked.indexOf(redObj) == -1) {
                 redObj.setCurrentHp(redObj.getCurrentHp() - 400);
                 attacked.add(redObj);
             }
             
         }
     }
  
     @Override
     public void abilityOne() {
         // TODO Auto-generated method stub
         if (coolDownOne) {
             m = new MouseMonitor();
             p = new Polygon();
             gameFrame.addMouseListener(m);
             attacked = new ArrayList<GameObject>();
         }
     }
  
     @Override
     public void abilityTwo() {
         // TODO Auto-generated method stub
         if (coolDownTwo) {
             boolean find = false;
             for (GameObject redObj : gameFrame.objList) {
                 // 是红色小兵 && 距离小于250 && 存活
                 if ((redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass())) && recIntersectsCir(redObj.getRec(), getX(), getY(), 250)
                         && redObj.isAlive()) {
                     // 添加子弹
                     abilityTwoBullet = new Bullet(gameFrame, this, redObj, 250, 60, "img/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() {
         // TODO Auto-generated method stub
         // 三技能没在冷却状态
         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 || Beast.class.isAssignableFrom(target.getClass())) && 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, 250, 60, "img/abilityTwoBullet.png");
                     }else {
                         bulletList[count] = new Bullet(gameFrame, this, targetList.get(r), 250, 60, "img/abilityTwoBullet.png");
                     }
                     count++;
                 }
                 new AbilityThreeBulletCD().start();
                 new AbilityThreeCD().start();
             }
         }
     }
  
     @Override
     public void abilityEffect(Graphics g) {
         // TODO Auto-generated method stub
         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.stop();
         }
     }
  
     // 技能二冷却时间
     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.stop();
         }
     }
  
     // 技能二控制时间
     class AbilityControllCD extends Thread {
         public void run() {
             abilityTwoTarget.beControlled = true;
             // 线程休眠
             try {
                 Thread.sleep(20000);
             } catch (Exception e) {
                 e.printStackTrace();
             }
             abilityTwoTarget.beControlled = false;
             this.stop();
         }
  
     }
     // 技能三冷却时间
     class AbilityThreeCD extends Thread {
         public void run() {
             // 将技能三设置为冷却状态
             coolDownThree = false;
             // 线程休眠
             try {
                 // three来表示三技能冷却时间
                 int three = coolDownTimeThree;
                 while (three > 0) {
                     Thread.sleep(1000);
                     System.out.println("三技能冷却时间: " + three / 1000);
                     three -= 1000;
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
             // 将技能三设置为攻击状态
             coolDownThree = true;
             // 线程终止
             this.stop();
         }
     }
     
     //技能三子弹时间间隔
     class AbilityThreeBulletCD extends Thread{
         public void run() {
             try {
                 gameFrame.objList.add(bulletList[0]);
                 Thread.sleep(200);
                 gameFrame.objList.add(bulletList[1]);
                 Thread.sleep(200);
                 gameFrame.objList.add(bulletList[2]);
                 Thread.sleep(200);
                 gameFrame.objList.add(bulletList[3]);
                 Thread.sleep(200);
                 gameFrame.objList.add(bulletList[4]);
             }catch(Exception e) {
                 e.printStackTrace();
             }
             this.stop();
         }
     }
  
     // 鼠标监视器
     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;
         }
     }
 }
5,
package com.sxt;
  
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Polygon;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
  
 import javax.swing.JButton;
  
 import com.sxt.beast.Beast;
  
 public class ChampionHouyi extends Champion {
  
     // 技能是否处于释放状态
     boolean ifAbilityThree = false;
     boolean ifAbilityTwo = false;
     // 鼠标监视器
     MouseMonitor m;
     MouseMonitorTwo m2;
     // 三技能多边形
     Polygon p;
     // 三技能三角函数
     double sin;
     double cos;
     // 三技能命中的目标
     GameObject abilityThreeTarget;
     // 三技能是否出界
     boolean ifXOutside;
     boolean ifYOutside;
     // 二技能位置
     int X_AbilityTwo;
     int Y_AbilityTwo;
  
     public ChampionHouyi(GameFrame gameFrame) {
         super(gameFrame);
         abilityOne = Toolkit.getDefaultToolkit().getImage("img/HyabilityOne.jpg");
         abilityTwo = Toolkit.getDefaultToolkit().getImage("img/HyabilityTwo.jpg");
         abilityThree = Toolkit.getDefaultToolkit().getImage("img/HyabilityThree.jpg");
         classical = Toolkit.getDefaultToolkit().getImage("img/后羿-辉光之辰.jpg");
         // 三个技能冷却时间
         coolDownTimeOne = 14000;
         coolDownTimeTwo = 10000;
         coolDownTimeThree = 28000;
         // TODO Auto-generated constructor stub
     }
  
     public ChampionHouyi(GameFrame gameFrame, int i, int j) {
         // TODO Auto-generated constructor stub
         super(gameFrame, i, j);
     }
  
     public void exit(MouseAdapter ma) {
         this.gameFrame.removeMouseListener(ma);
     }
  
     public void attack() {
         if (isAttackCoolDown()) {
             ArrayList<GameObject> targets = new ArrayList<GameObject>();// 目标列表,最多三个目标
             for (GameObject redObj : this.gameFrame.redList) {
                 if (this.recIntersectsCir(redObj.getRec(), getX() - 250, getY() - 250, 500)) {
                     targets.add(redObj);
                     if (targets.size() == 3) {
                         break;
                     }
                 }
             }
             for (GameObject beastObj : this.gameFrame.beast.beastList) {
                 if (this.recIntersectsCir(beastObj.getRec(), getX() - 250, getY() - 250, 500)) {
                     targets.add(beastObj);
                     if (targets.size() == 3) {
                         break;
                     }
                 }
             }
             for (int i = 0; i < targets.size(); i++) {
                 Bullet bullet;
                 if (i == 0) {
                     bullet = new Bullet(gameFrame, this, targets.get(i), 400, 50, "img/bullet.gif");
                 } else {
                     bullet = new Bullet(gameFrame, this, targets.get(i), 200, 50, "img/bullet.gif");
                 }
                 gameFrame.objList.add(bullet);
             }
             new AttackCD().start();
         }
     }
  
     public void abilityTwoAttack() {
         for (GameObject redObj : this.gameFrame.objList) {
             if (redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass())) {
                 if (this.recIntersectsCir(redObj.getRec(), X_AbilityTwo - 60, Y_AbilityTwo - 60, 120)) {
                     redObj.setCurrentHp(redObj.getCurrentHp() - 400);
                 }
                 if (this.recIntersectsCir(redObj.getRec(), X_AbilityTwo - 30, Y_AbilityTwo - 30, 60)) {
                     redObj.setCurrentHp(redObj.getCurrentHp() - 200);
                 }
             }
         }
     }
  
     public void abilityThreeMove() {
         p.translate((int) (50 * cos), -(int) (50 * sin));
         for (GameObject redObj : gameFrame.objList) {
             // 是红色方小兵 && 发生碰撞
             if ((redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass()))
                     && p.intersects(redObj.getRec())) {
                 // 击中目标后,目标减血并眩晕,多边形消失
                 redObj.setCurrentHp(redObj.getCurrentHp() - 400);
                 abilityThreeTarget = redObj;
                 new AbilityControlCD().start();
                 ifAbilityThree = false;
                 new AbilityThreeCD().start();
             }
         }
         if (!ifXOutside) {
             for (int x : p.xpoints) {
                 if (x < 0 || x >= 5165) {
                     ifXOutside = true;
                     break;
                 }
             }
         }
         if (!ifYOutside) {
             for (int y : p.ypoints) {
                 if (y < 0 || y >= 4085) {
                     ifYOutside = true;
                     break;
                 }
             }
         }
     }
  
     /**
      * 一技能 制作游戏界面攻击按钮的替身 替换攻击按钮 新的攻击按钮事件: 1. 定义目标列表 2. 添加目标,最多添加三个 3.
      * 目标列表第一个造成400伤害,其余200伤害 4. 持续5秒,结束后替换攻击按钮️
      */
     @Override
     public void abilityOne() {
         // TODO Auto-generated method stub
         if (coolDownOne) {
             new AbilityOneDuration().start();// 强化普攻持续时间
             new AbilityOneCD().start();
         }
     }
  
     /**
      * 二技能 先点击按钮释放技能 再点击技能范围内任意位置 之后点击的位置会出现 两个大小不同的圆 在大圆内会受到300伤害 在小圆内受到额外200伤害
      */
     @Override
     public void abilityTwo() {
         // TODO Auto-generated method stub
         if (coolDownTwo) {
             m2 = new MouseMonitorTwo();
             gameFrame.addMouseListener(m2);
             X_AbilityTwo = 0;
             Y_AbilityTwo = 0;
         }
  
     }
  
     @Override
     public void abilityThree() {
         // TODO Auto-generated method stub
         if (coolDownThree) {
             m = new MouseMonitor();
             p = new Polygon();
             gameFrame.addMouseListener(m);
             ifAbilityThree = true;
             ifXOutside = false;
             ifYOutside = false;
         }
     }
  
     @Override
     public void abilityEffect(Graphics g) {
         // TODO Auto-generated method stub
         if (ifAbilityTwo) {
             System.out.println("222");
             g.setColor(Color.RED);
             g.fillOval(X_AbilityTwo - 60, Y_AbilityTwo - 60, 120, 120);
             g.setColor(Color.BLACK);
             g.fillOval(X_AbilityTwo - 30, Y_AbilityTwo - 30, 60, 60);
             abilityTwoAttack();
             X_AbilityTwo = 0;
             Y_AbilityTwo = 0;
             ifAbilityTwo = false;
             new AbilityTwoCD().start();
         }
         if (ifAbilityThree) {
             System.out.println("333");
             g.setColor(Color.RED);
             g.fillPolygon(p);
             abilityThreeMove();
             // 如果出界,技能释放结束
             if (ifXOutside || ifYOutside) {
                 ifAbilityThree = false;
                 p = new Polygon();
                 new AbilityThreeCD().start();
             }
         }
     }
  
     // 攻击冷却时间
     class AttackCD extends Thread {
         public void run() {
             // 将攻击功能设置为冷却状态
             setAttackCoolDown(false);
             // 线程休眠
             try {
                 Thread.sleep(getAttackCoolDownTime());
             } catch (Exception e) {
                 e.printStackTrace();
             }
             // 将攻击功能设置为攻击状态
             setAttackCoolDown(true);
             // 线程终止
             this.stop();
         }
     }
  
     // 一技能冷却时间
     class AbilityOneCD extends Thread {
         public void run() {
             // 将攻击功能设置为冷却状态
             coolDownOne = false;
             // 休眠
             try {
                 // one用来储存冷却时间
                 int one = coolDownTimeOne;
                 while (coolDownTimeOne > 0) {
                     Thread.sleep(1000);
                     System.out.println("技能一冷却时间: " + coolDownTimeOne / 1000);
                     coolDownTimeOne -= 1000;
                 }
                 coolDownTimeOne = one;
             } catch (Exception e) {
                 e.printStackTrace();
             }
             // 将攻击功能解除冷却状态
             coolDownOne = true;
             // 线程终止
             this.stop();
         }
     }
  
     // 技能一持续时间
     class AbilityOneDuration extends Thread {
         public void run() {
             // 制作攻击按钮的替身
             JButton substitute = gameFrame.attackButton;
             gameFrame.remove(gameFrame.attackButton);
  
             JButton button = new JButton();
             button.setSize(130, 132);
             button.setLocation(1150, 430);
             button.addActionListener(new ActionListener() {
                 @Override
                 public void actionPerformed(ActionEvent e) {
                     // 获取到的事件源就是按钮本身
                     attack();
                 }
             });
             gameFrame.add(button);
             // 休眠
             try {
                 Thread.sleep(5000);
             } catch (Exception e) {
                 e.printStackTrace();
             }
             gameFrame.remove(button);
             gameFrame.add(substitute);
             // 线程终止
             this.stop();
         }
     }
  
     // 二技能冷却时间
     class AbilityTwoCD extends Thread {
         public void run() {
             // 将二技能设置为冷却状态
             coolDownTwo = false;
             // 休眠
             try {
                 int two = coolDownTimeTwo;
                 while (coolDownTimeTwo > 0) {
                     Thread.sleep(1000);
                     System.out.println("技能二冷却时间: " + coolDownTimeTwo / 1000);
                     coolDownTimeTwo -= 1000;
                 }
                 coolDownTimeTwo = two;
             } catch (Exception e) {
                 e.printStackTrace();
             }
             // 将攻击功能解除冷却状态
             coolDownTwo = true;
             // 线程终止
             this.stop();
         }
     }
  
     // 技能三冷却时间
     class AbilityThreeCD extends Thread {
         public void run() {
             // 将技能三设置为冷却状态
             coolDownThree = false;
             // 线程休眠
             try {
                 // three来表示三技能冷却时间
                 int three = coolDownTimeThree;
                 while (three > 0) {
                     Thread.sleep(1000);
                     System.out.println("三技能冷却时间: " + three / 1000);
                     three -= 1000;
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             }
             // 将技能三设置为攻击状态
             coolDownThree = true;
             // 线程终止
             this.stop();
         }
     }
  
     // 技能三控制时间
     class AbilityControlCD extends Thread {
         public void run() {
             abilityThreeTarget.beControlled = true;
             // 线程休眠
             try {
                 Thread.sleep(20000);
             } catch (Exception e) {
                 e.printStackTrace();
             }
             abilityThreeTarget.beControlled = false;
             this.stop();
         }
  
     }
  
     // 鼠标监视器
     private class MouseMonitorTwo extends MouseAdapter {
         @Override
         public void mousePressed(MouseEvent e) {// 当鼠标点击时
             System.out.println("pressed");
             int mouseX = e.getX(), mouseY = e.getY(), playerX = 700, playerY = 350;
             double dis = getDis(mouseX, mouseY, playerX, playerY);
             if (dis < 250) {
                 X_AbilityTwo = e.getX() - playerX + getX();
                 Y_AbilityTwo = e.getY() - playerY + getY();
             }
             ifAbilityTwo = true;
             exit(this);
         }
     }
  
     // 鼠标监视器
     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));
             ifAbilityThree = true;
             exit(this);
         }
     }
  
 }
6,
package com.sxt;
  
 import java.awt.Graphics;
 import java.awt.Image;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
  
 import javax.swing.JButton;
 import javax.swing.JFrame;
  
 import com.sxt.beast.Beast;
  
 public class GameFrame extends JFrame {
  
     // 游戏模式 0 选择英雄,1 游戏开始,2 游戏胜利,3 游戏失败
     int state = 0;
     // 窗口尺寸
     private int windowWidth = 1400;
     private int windowHeight = 700;
     // 双缓冲图片
     private Image offScreenImage = null;
     // 攻击图片
     private Image attack = Toolkit.getDefaultToolkit().getImage("img/attack.jpg");
     //游戏胜利失败图片
     private Image gameWin = Toolkit.getDefaultToolkit().getImage("img/gameWin.png");
     private Image gameLose = Toolkit.getDefaultToolkit().getImage("img/gameLose.png");
     // 游戏背景
     Background background = new Background(this);
     // 游戏玩家
     Champion player;
     Champion champion = new ChampionHouyi(this,700,3800);
     // 双方小兵
     MinionBlue mb = new MinionBlue(this);
     MinionRed mr = new MinionRed(this);
     // 防御塔
     Turret turret = new Turret(this);
     //野怪
     public Beast beast = new Beast(this);
     // 攻击按钮
     JButton attackButton;
     // 游戏元素列表
     public ArrayList<GameObject> objList = new ArrayList<GameObject>();
     ArrayList<GameObject> redList = new ArrayList<GameObject>();// 红色方
     ArrayList<GameObject> blueList = new ArrayList<GameObject>();// 蓝色方
     public ArrayList<GameObject> removeList = new ArrayList<GameObject>();// 存放将要删除的元素
  
     public void launch() {
         // 设置尺寸
         setSize(windowWidth, windowHeight);
         // 窗口居中
         setLocationRelativeTo(null);
         // 关闭事件
         setDefaultCloseOperation(3);
         // 用户不能调整窗口大小
         setResizable(false);
         // 标题
         setTitle("王者荣耀");
         // 窗口可见
         setVisible(true);
         // 添加键盘监视器
         this.addKeyListener(new GameFrame.KeyMonitor());
         // 添加游戏元素
         objList.add(background);
         objList.addAll(turret.turretList);
         objList.addAll(beast.beastList);
         blueList.add(turret.turretList.get(0));
         redList.add(turret.turretList.get(4));
  
         /**
          * 攻击按钮
          */
         attackButton = new JButton();
         attackButton.setSize(130, 132);
         attackButton.setLocation(1150, 430);
         attackButton.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
                 // 按钮事件
                 player.attack(redList);
             }
         });
         this.add(attackButton);
  
         while (true) {
             if (state == 1) {
                 // 添加小兵
                 //mb.createMinion(this, blueList);
                 //mr.createMinion(this, redList);
                 // 添加防御塔
                 turret.addTurret();
             }
             repaint();
             try {
                 Thread.sleep(17);
             } 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) {
             for(int i = 0; i < champion.championList.size(); i++) {
                 //添加图片
                 Image classical = champion.championList.get(i).classical;
                 gImage.drawImage(classical, i*160, 20, null);
                 
                 //添加按钮
                 JButton championButton = new JButton();
                 championButton.setSize(150, 150);
                 championButton.setLocation(i*150, 0);
                 int a = i;
                 championButton.addActionListener(new ActionListener() {
                     @Override
                     public void actionPerformed(ActionEvent e) {
                         state = 1;
                         player = champion.championList.get(a);
                         objList.add(player);
                         player.addButton();
                     }
                 });
                 this.add(championButton);
             }
         } else if (state == 1) {
             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 == 2) {//游戏胜利
             gImage.drawImage(gameWin, 0, 5, null);
         } else if (state == 3) {//游戏失败
             gImage.drawImage(gameLose, 0, 5, null);
         }
         if (state != 1) {
             g.drawImage(offScreenImage, 0, 0, null);
         } else {
             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);
         }
     }
 }
7,
package com.sxt;
  
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Image;
 import java.awt.Rectangle;
 import java.awt.Toolkit;
 import java.util.ArrayList;
  
 import com.sxt.beast.Beast;
  
 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() {
         // TODO Auto-generated constructor stub
     }
  
     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, "img/bullet.gif");
                 }
                 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;
                     }
                 }
             }
         }
     }
  
     class AttackCD extends Thread {
         public void run() {
             // 将攻击功能设置为冷却状态
             setAttackCoolDown(false);
             // 线程休眠
             try {
                 Thread.sleep(attackCoolDownTime);
             } catch (Exception e) {
                 e.printStackTrace();
             }
             // 将攻击功能设置为攻击状态
             setAttackCoolDown(true);
             // 线程终止
             this.stop();
         }
     }
  
     // 绘制元素
     public abstract void paintSelf(Graphics g);
  
     // 返回矩形
     public abstract Rectangle getRec();
  
     /**
      * @return the x
      */
     public int getX() {
         return x;
     }
  
     /**
      * @param x the x to set
      */
     public void setX(int x) {
         this.x = x;
     }
  
     /**
      * @return the y
      */
     public int getY() {
         return y;
     }
  
     /**
      * @param y the y to set
      */
     public void setY(int y) {
         this.y = y;
     }
  
     /**
      * @return the img
      */
     public Image getImg() {
         return img;
     }
  
     /**
      * @param img the img to set
      */
     public void setImg(String img) {
         this.img = Toolkit.getDefaultToolkit().getImage(img);
     }
  
     /**
      * @return the spd
      */
     public int getSpd() {
         return spd;
     }
  
     /**
      * @param spd the spd to set
      */
     public void setSpd(int spd) {
         this.spd = spd;
     }
  
     /**
      * @return the hp
      */
     public int getHp() {
         return hp;
     }
  
     /**
      * @param hp the hp to set
      */
     public void setHp(int hp) {
         this.hp = hp;
     }
  
     /**
      * @return the currentHp
      */
     public int getCurrentHp() {
         return currentHp;
     }
  
     /**
      * @param currentHp the currentHp to set
      */
     public void setCurrentHp(int currentHp) {
         if (currentHp < getHp()) {
             if (Beast.class.isAssignableFrom(getClass())) {
                 System.out.println("yes");
                 setTarget(gameFrame.player);
                 setHasTarget(true);
             }
         }
         this.currentHp = currentHp;
     }
  
     /**
      * @return the target
      */
     public GameObject getTarget() {
         return target;
     }
  
     /**
      * @param target the target to set
      */
     public void setTarget(GameObject target) {
         this.target = target;
     }
  
     /**
      * @return the hasTarget
      */
     public boolean isHasTarget() {
         return hasTarget;
     }
  
     /**
      * @param hasTarget the hasTarget to set
      */
     public void setHasTarget(boolean hasTarget) {
         this.hasTarget = hasTarget;
     }
  
     /**
      * @return the dis
      */
     public int getDis() {
         return dis;
     }
  
     /**
      * @param dis the dis to set
      */
     public void setDis(int dis) {
         this.dis = dis;
     }
  
     /**
      * @return the attackCoolDownTime
      */
     public int getAttackCoolDownTime() {
         return attackCoolDownTime;
     }
  
     /**
      * @param attackCoolDownTime the attackCoolDownTime to set
      */
     public void setAttackCoolDownTime(int attackCoolDownTime) {
         this.attackCoolDownTime = attackCoolDownTime;
     }
  
     /**
      * @return the attackCoolDown
      */
     public boolean isAttackCoolDown() {
         return attackCoolDown;
     }
  
     /**
      * @param attackCoolDown the attackCoolDown to set
      */
     public void setAttackCoolDown(boolean attackCoolDown) {
         this.attackCoolDown = attackCoolDown;
     }
  
     /**
      * @return the alive
      */
     public boolean isAlive() {
         return alive;
     }
  
     /**
      * @param alive the alive to set
      */
     public void setAlive(boolean alive) {
         this.alive = alive;
     }
 }
8,
package com.sxt;
  
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Rectangle;
 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);
         // TODO Auto-generated constructor stub
     }
  
     /**
      * (1325, 3750) (4425, 3750) (5050, 3125) (5050, 1125)
      */
  
     public abstract void move(ArrayList<GameObject> objList);
  
     /**
      * @param x:       下一步的横坐标
      * @param y:       下一步的纵坐标
      * @param objList: 小兵列表
      * @return 下一步位置与其他小兵是否碰撞
      */
     public boolean hitMinion(int x, int y, ArrayList<GameObject> objList) {
         // 新的区域生成矩形
         Rectangle r = new Rectangle(x - 16, y - 16, 45, 45);
         for (GameObject obj : objList) {
             // 相同类 && 不是自身
             if (obj.getClass() == this.getClass() && obj != this) {
                 if (r.intersects(obj.getRec())) {
                     return true;
                 }
             }
         }
         return false;
     }
  
     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() {
         double dis = getDis(getX(), getY(), getTarget().getX(), getTarget().getY());
         int xSpeed = (int) (getSpd() * (getTarget().getX() - getX()) / dis);
         int ySpeed = (int) (getSpd() * (getTarget().getY() - getY()) / dis);
         if (!hitMinion(getX() + xSpeed, getY(), gameFrame.objList)) {
             setX(getX() + xSpeed);
         }
         if (!hitMinion(getX(), getY() + ySpeed, gameFrame.objList)) {
             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.stop();
         }
     }
  
     // 每波小兵生成时间
     class NextLine extends Thread {
         public void run() {
             nextLine = false;
             // 休眠15s
             try {
                 Thread.sleep(15000);
             } catch (Exception e) {
                 e.printStackTrace();
             }
             nextLine = true;
             // 线程终止
             this.stop();
         }
     }
  
     @Override
     public void paintSelf(Graphics g) {
         // TODO Auto-generated method stub
         // 生命值为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);
             // 小兵移动
             if (!beControlled) {
                 if (this instanceof MinionBlue) {
                     move(gameFrame.redList);
                 } else {
                     move(gameFrame.blueList);
                 }
             }
         }
     }
  
     @Override
     public Rectangle getRec() {
         // TODO Auto-generated method stub
         return new Rectangle(getX() - 16, getY() - 16, 45, 45);
     }
  
     /**
      * @return the ifFindTarget
      */
     public boolean isIfFindTarget() {
         return ifFindTarget;
     }
  
     /**
      * @param ifFindTarget the ifFindTarget to set
      */
     public void setIfFindTarget(boolean ifFindTarget) {
         this.ifFindTarget = ifFindTarget;
     }
  
 }
9,
package com.sxt;
  
 import java.util.ArrayList;
  
 public class MinionBlue extends Minion {
  
     public MinionBlue(GameFrame gameFrame) {
         super(gameFrame);
         setImg("img/blue.jpg");
         setX(1325);
         setY(3750);
         // TODO Auto-generated constructor stub
     }
  
     @Override
     public void move(ArrayList<GameObject> objList) {
         // TODO Auto-generated method stub
         if (isIfFindTarget()) {
             // 离开检测范围
             if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {
                 setIfFindTarget(false);
             } else {
                 if (!isHasTarget()) {
                     moveToTarget();
                 }
                 attack(objList);
             }
         } else {
             findTarget(objList);
             // 原路线移动
             if (getX() < 4425) {
                 setSpd(25);
                 if (!hitMinion(getX() + getSpd(), getY(), gameFrame.blueList)) {
                     setX(getX() + getSpd());
  
                 }
             } else if (getX() < 5100 && getX() >= 4425) {
                 setSpd(20);
                 if (!hitMinion(getX() + getSpd(), getY(), gameFrame.blueList)) {
                     setX(getX() + getSpd());
                 }
                 if (!hitMinion(getX(), getY() - getSpd(), gameFrame.blueList)) {
                     setY(getY() - getSpd());
                 }
             } else if (getX() >= 4900) {
                 setSpd(18);
                 if (!hitMinion(getX(), getY() - getSpd(), gameFrame.blueList)) {
                     setY(getY() - getSpd());
                 }
             }
         }
     }
 }
10,
package com.sxt;
  
 import java.util.ArrayList;
  
 public class MinionRed extends Minion {
  
     public MinionRed(GameFrame gameFrame) {
         super(gameFrame);
         setImg("img/red.jpg");
         setX(5050);
         setY(1125);
         // TODO Auto-generated constructor stub
     }
  
     @Override
     public void move(ArrayList<GameObject> objList) {
         // TODO Auto-generated method stub
         if (isIfFindTarget()) {
             // 离开检测范围
             if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {
                 setIfFindTarget(false);
             } else {
                 if (!isHasTarget()) {
                     moveToTarget();
                 }
                 attack(objList);
             }
         } else {
             findTarget(objList);
             // 原路线移动
             if (getY() < 3125) {
                 setSpd(18);
                 if (!hitMinion(getX(), getY() + getSpd(), gameFrame.redList)) {
                     setY(getY() + getSpd());
                 }
             } else if (getY() < 3750 && getY() >= 3125) {
                 setSpd(20);
                 if (!hitMinion(getX(), getY() + getSpd(), gameFrame.redList)) {
                     setY(getY() + getSpd());
                 }
                 if (!hitMinion(getX() - getSpd(), getY(), gameFrame.redList)) {
                     setX(getX() - getSpd());
                 }
             } else if (getY() >= 3750) {
                 setSpd(25);
                 if (!hitMinion(getX() - getSpd(), getY(), gameFrame.redList)) {
                     setX(getX() - getSpd());
                 }
             }
         }
     }
  
 }
11,
package com.sxt;
  
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Rectangle;
 import java.util.ArrayList;
  
 public class Turret extends GameObject {
  
     ArrayList<Turret> turretList = new ArrayList<Turret>();
     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("img/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));
  
         // TODO Auto-generated constructor stub
     }
  
     public Turret(int x, int y, GameFrame gameFrame) {
         super(x, y, gameFrame);
         setImg("img/turret.png");
         setHp(6000);
         setCurrentHp(getHp());
         setAttackCoolDownTime(1000);
         setDis(300);
     }
     
     public void addTurret() {
         /**
          * 添加到objList里会被绘制出来,添加到redList和blueList才会被攻击 前一个防御塔爆炸后再把后一个添加到列表里
          */
         if (!gameFrame.turret.turretBlueOne.isAlive() && gameFrame.turret.turretBlueTwo.isAlive()
                 && gameFrame.blueList.indexOf(gameFrame.turret.turretBlueTwo) == -1) {
             gameFrame.blueList.add(gameFrame.turret.turretBlueTwo);
         }
         if (!gameFrame.turret.turretBlueTwo.isAlive() && gameFrame.turret.turretBlueThree.isAlive()
                 && gameFrame.blueList.indexOf(gameFrame.turret.turretBlueThree) == -1) {
             gameFrame.blueList.add(gameFrame.turret.turretBlueThree);
         }
         if (!gameFrame.turret.turretBlueThree.isAlive() && gameFrame.turret.turretBlueBase.isAlive()
                 && gameFrame.blueList.indexOf(gameFrame.turret.turretBlueBase) == -1) {
             gameFrame.blueList.add(gameFrame.turret.turretBlueBase);
         }
         if (!gameFrame.turret.turretBlueBase.isAlive()) {
             //游戏失败
             gameFrame.state = 3;
         }
  
         if (!gameFrame.turret.turretRedOne.isAlive() && gameFrame.turret.turretRedTwo.isAlive()
                 && gameFrame.redList.indexOf(gameFrame.turret.turretRedTwo) == -1) {
             gameFrame.redList.add(gameFrame.turret.turretRedTwo);
         }
         if (!gameFrame.turret.turretRedTwo.isAlive() && gameFrame.turret.turretRedThree.isAlive()
                 && gameFrame.redList.indexOf(gameFrame.turret.turretRedThree) == -1) {
             gameFrame.redList.add(gameFrame.turret.turretRedThree);
         }
         if (!gameFrame.turret.turretRedThree.isAlive() && gameFrame.turret.turretRedBase.isAlive()
                 && gameFrame.redList.indexOf(gameFrame.turret.turretRedBase) == -1) {
             gameFrame.redList.add(gameFrame.turret.turretRedBase);
         }
         if (!gameFrame.turret.turretRedBase.isAlive()) {
             //游戏胜利
             gameFrame.state = 2;
         }
     }
     
  
     @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.drawOval(getX() - 300, getY() - 300, 600, 600);
         }
     }
  
     @Override
     public Rectangle getRec() {
         // TODO Auto-generated method stub
         return new Rectangle(getX() - 50, getY() - 100, 100, 180);
     }
  
 }
12,
package com.sxt;
  
 public class TurretBlue extends Turret {
  
     public TurretBlue(GameFrame gameFrame) {
         super(gameFrame);
         // TODO Auto-generated constructor stub
     }
     
     public TurretBlue(int x, int y, GameFrame gameFrame) {
         super(x, y, gameFrame);
     }
  
 }
13,
package com.sxt;
  
 public class TurretRed extends Turret {
  
     public TurretRed(GameFrame gameFrame) {
         super(gameFrame);
         // TODO Auto-generated constructor stub
     }
     
     public TurretRed(int x, int y, GameFrame gameFrame) {
         super(x, y, gameFrame);
     }
     
 }
14,
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("img/bear.jpg");
         width = 85;
         height = 112;
         setDis(65);
         // TODO Auto-generated constructor stub
     }
  
 }
15,
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<Beast>();
     int width;
     int height;
  
     // 初始坐标
     int initialX;
     int initialY;
  
     // 有没有仇恨值
     public boolean isAggressive = false;
  
     // 复活的元素
     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());
         setSpd(10);
         setAttackCoolDownTime(2000);
         initialX = getX();
         initialY = getY();
         beast = this;
     }
  
     public void moveToTarget() {
         double dis = getDis(getX(), getY(), getTarget().getX(), getTarget().getY());
         if (dis > 500) {
             isAggressive = false;
             setHasTarget(false);
         } else {
             int xSpeed = (int) (getSpd() * (getTarget().getX() - getX()) / dis);
             int ySpeed = (int) (getSpd() * (getTarget().getY() - getY()) / dis);
             setX(getX() + xSpeed);
             setY(getY() + ySpeed);
         }
     }
  
     public void moveToInitialLocation() {
         double dis = getDis(getX(), getY(), initialX, initialY);
         if (dis < getSpd()) {
             setX(initialX);
             setY(initialY);
             isAggressive = true;
         } else {
             int xSpeed = (int) (getSpd() * (initialX - getX()) / dis);
             int ySpeed = (int) (getSpd() * (initialY - getY()) / dis);
             setX(getX() + xSpeed);
             setY(getY() + ySpeed);
         }
     }
  
     /**
     判断有没有目标及野怪的仇恨值(又没有攻击性)
         true,判断是否到攻击范围
             false,向目标移动,若中途离开出生点距离大于300或与目标距离大于400,则不再有攻击性。
             true,发射子弹,线程开始
         false,没有目标,回到出生地,自动回血,再次有攻击性
     */
     public void move() {
         if (isHasTarget() && isAggressive) {
             if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), getDis())) {
                 moveToTarget();
             } else if (isAttackCoolDown() && isAlive()) {
                 Bullet bullet = new Bullet(gameFrame, this, getTarget(), 500, 50, "img/bullet.gif");
                 gameFrame.objList.add(bullet);
                 new AttackCD().start();
             }
         } else {
             moveToInitialLocation();
             if (getCurrentHp() < getHp()) {
                 setCurrentHp(getCurrentHp() + 100);
             }
         }
  
     }
  
     @Override
     public void paintSelf(Graphics g) {
         // TODO Auto-generated method stub// 生命值为0
         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());
             move();
         }
     }
  
     @Override
     public Rectangle getRec() {
         // TODO Auto-generated method stub
         return new Rectangle(getX() - width / 2, getY() - height / 2, width, height);
     }
  
     class AttackCD extends Thread {
         public void run() {
             // 将攻击功能设置为冷却状态
             setAttackCoolDown(false);
             // 线程休眠
             try {
                 Thread.sleep(getAttackCoolDownTime());
             } catch (Exception e) {
                 e.printStackTrace();
             }
             // 将攻击功能设置为攻击状态
             setAttackCoolDown(true);
             // 线程终止
             this.stop();
         }
     }
  
     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);
         }
     }
  
 }
16,
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("img/红隼.jpg");
         width = 122;
         height = 98;
         setDis(125);
         // TODO Auto-generated constructor stub
     }
  
 }
17,
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("img/blueBuff.jpg");
         width = 142;
         height = 176;
         setDis(70);
         // TODO Auto-generated constructor stub
     }
  
 }
18,
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("img/redBuff.jpg");
         width = 103;
         height = 150;
         setDis(70);
         // TODO Auto-generated constructor stub
     }
 }
19,
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("img/wolf.jpg");
         width = 145;
         height = 140;
  
         setDis(65);
         // TODO Auto-generated constructor stub
     }
  
 }
20,
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("img/蜥蜴.jpg");
         width = 111;
         height = 65;
         setDis(125);
         // TODO Auto-generated constructor stub
     }
 }
三.结果呈现

