王者荣耀中的单例模式(多线程)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_44001965/article/details/87920318

1,先建一个英雄抽象类Hero类,说明英雄的特征。

package com.aaa.Hero;

import com.aaa.skill.ISkill;

/**
 * className:Hero
 * discription:英雄抽象类
 * author:zz
 * createTime:2018-11-09 17:21
 */
public abstract class Hero {
    //英雄名字
    private String heroName;
    //技能接口
    private ISkill iSkill;
    //英雄自我介绍
    public abstract void display();
    //英雄普通攻击
    public abstract void normalAttack();
    //一次普攻的伤害值
    private int heroHeart;
    //英雄使用技能

    public String getHeroName() {
        return heroName;
    }

    public void setHeroName(String heroName) {
        this.heroName = heroName;
    }

    public ISkill getiSkill() {
        return iSkill;
    }

    public void setiSkill(ISkill iSkill) {
        this.iSkill = iSkill;
    }

    public int getHeroHeart() {
        return heroHeart;
    }

    public void setHeroHeart(int heroHeart) {
        this.heroHeart = heroHeart;
    }

    public void skill(){
        iSkill.useSkill();
    }
}

2,建立一个基地(单例类)Base类

package com.aaa.Hero;

/**
 * className:Base
 * discription:基地(单例类)
 * author:zz
 * createTime:2018-11-09 18:10
 */
public class Base {
    private Base(){}
    private static Base base=null;

    public static void setBase(Base base) {
        Base.base = base;
    }

    public int getBaseLife() {
        return baseLife;
    }

    public void setBaseLife(int baseLife) {
        this.baseLife = baseLife;
    }

    public boolean isOver() {
        return over;
    }

    public void setOver(boolean over) {
        this.over = over;
    }

    public synchronized static Base getBase(){
        if(base==null){
            base=new Base();
        }
        return base;

    }
    private int baseLife=2600;
    private boolean over=false;
}

3,建立一个技能的接口ISkill接口

package com.aaa.skill;

/**
 * 技能接口
 */
public interface ISkill {
    /**
     * 释放技能
     */
    public abstract void useSkill();
}

4,写两个技能类实现技能接口Jipao类和Kuangbao类

package com.aaa.skill;

/**
 * className:JiPao
 * discription:疾跑类
 * author:zz
 * createTime:2018-11-09 17:19
 */
public class JiPao implements ISkill{

    @Override
    public void useSkill() {
        System.out.println("使用疾跑技能,10秒内提高移速30%!");
    }
}

package com.aaa.skill;

/**
 * className:KuangBao
 * discription:狂暴类
 * author:zz
 * createTime:2018-11-09 17:20
 */
public class KuangBao implements ISkill{

    @Override
    public void useSkill() {
        System.out.println("使用狂暴技能,5秒内提高攻速50%");
    }
}

5,写两个英雄类,继承英雄的抽象类Huangzhong类和LiBai类

package com.aaa.Hero;

/**
 * className:HuangZhong
 * discription:
 * author:zz
 * createTime:2018-11-09 18:15
 */
public class HuangZhong extends Hero{
    public HuangZhong(){
        super.setHeroName("黄忠");
        super.setHeroHeart(60);
    }
    @Override
    public void display() {
        System.out.println("让你尝尝我的大炮的滋味吧!");
    }

    @Override
    public void normalAttack() {
        System.out.println("pongpongpong~~~");
    }
}
package com.aaa.Hero;

/**
 * className:LiBai
 * discription:李白类
 * author:zz
 * createTime:2018-11-09 17:28
 */
public class LiBai extends Hero{
    public LiBai(){
        super.setHeroName("李白");
        super.setHeroHeart(120);
    }
//英雄自我介绍
    @Override
    public void display() {
        System.out.println("你的剑,就是我的剑!");
    }
//英雄普通攻击
    @Override
    public void normalAttack() {
        System.out.println("锵锵锵~~~刺了一剑!");
    }
}

6,写一个基地的测试类BaseTest类

package com.aaa.test;

import com.aaa.Hero.*;
import com.aaa.skill.JiPao;
import com.aaa.skill.KuangBao;

/**
 * className:BaseTest
 * discription:
 * author:zz
 * createTime:2018-11-09 18:18
 */
public class BaseTest {
    public static void main(String[] args) {

        System.out.println("游戏即将开始,请选择您的英雄!");
        new Thread(new Runnable() {
            @Override
            public void run() {
                Hero hero=new LiBai();
                System.out.println("您选择了英雄"+hero.getHeroName());
                hero.display();
                hero.setiSkill(new JiPao());
                Base base=Base.getBase();
                destroyBase(hero,base);
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Hero hero=new HuangZhong();
                System.out.println("您选择了英雄"+hero.getHeroName());
                hero.display();
                hero.setiSkill(new KuangBao());
                Base base=Base.getBase();
                destroyBase(hero,base);
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Hero hero=new LvBu();
                System.out.println("您选择了英雄"+hero.getHeroName());
                hero.display();
                hero.setiSkill(new KuangBao());
                Base base=Base.getBase();
                destroyBase(hero,base);
            }
        }).start();

    }

    private static void destroyBase(Hero hero, Base base) {
        System.out.println("英雄["+hero.getHeroName()+"]伤害值为"+hero.getHeroHeart());
        hero.skill();
        while(base.getBaseLife()>0){
          synchronized (base){
              if(!base.isOver()){
                  base.setBaseLife(base.getBaseLife()-hero.getHeroHeart());
                  try {
                      Thread.sleep(600);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  if(base.getBaseLife()>0){
                      System.out.println("["+hero.getHeroName()+"]攻击了水晶,水晶剩余生命值为"+base.getBaseLife());
                  }else{
                      base.setOver(true);
                      System.out.println("["+hero.getHeroName()+"]摧毁了水晶,游戏结束!");
                  }
              }
          }
          }
        }
    }



7,写一个英雄的测试类HeroTest类

package com.aaa.test;

import com.aaa.Hero.Hero;
import com.aaa.Hero.LiBai;
import com.aaa.skill.JiPao;
import com.aaa.skill.KuangBao;

/**
 * className:HeroTest
 * discription:
 * author:zz
 * createTime:2018-11-09 17:31
 */
public class HeroTest {
    public static void main(String[] args) {
       // System.out.println("游戏开始,全军出击!!!");
        Hero hero=new LiBai();
        System.out.println("您选择了["+hero.getHeroName()+"]英雄"+"   ");
        hero.display();
        System.out.println("["+hero.getHeroName()+"]英雄的伤害值:"+hero.getHeroHeart());
        System.out.println("游戏开始,全军出击!");
        hero.setiSkill(new JiPao());

        hero.normalAttack();
        hero.skill();
    }
}

然后运行测试多个英雄同时攻击水晶。

猜你喜欢

转载自blog.csdn.net/weixin_44001965/article/details/87920318
今日推荐