1、框架图:
2、core的代码:(PK专场)
(1)、PKAction.java
package sanguosha.core;
import sanguosha.hero.Hero;
import sanguosha.skill.Skill;
public class PKAction {
public void pk(Hero a,Hero b){
a.say();
b.say();
while(true){
//发动攻击=获得技能
//B向A发动一次攻击(B获得技能,A失去血滴)
if(b.getHp()>0){
Skill skill=b.hit();
int damage=skill.sumDamage(b);
a.setHp(a.getHp()-damage);
System.out.println(b.getHeroname()+"向"+a.getHeroname()+"发动了一招"+skill.getSkillname()+"技能,"+a.getHeroname()+",失去"+damage+"点血,还剩余"+a.getHp()+"血量!");
//1000ms 休息1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
System.out.print(b.getHeroname()+"已经挂了!");
break;
}
//A向B发动一次攻击(A获得技能,B失去血滴)
if(a.getHp()>0){
//多态(因为不知道攻击使用的是什么技能,就用多态)
Skill skill=a.hit();
//a英雄的累积血量
int damage=skill.sumDamage(a);
b.setHp(b.getHp()-damage);
System.out.println(a.getHeroname()+"向"+b.getHeroname()+"发动了一招"+skill.getSkillname()+"技能,"+b.getHeroname()+",失去"+damage+"点血,还剩余"+b.getHp()+"血量!");
//1000ms 休息1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
System.out.println(a.getHeroname()+"已经挂了!");
break;
}
}
}
}
3、hero专场:WuliHero 和ZhiliHero
(1)、hero.java
package sanguosha.hero;
import sanguosha.skill.Skill;
public abstract class Hero {
private String heroname;
private int hp;//血量
private int mp;//魔法值
private Skill[] wuliSkill=new Skill[3];//物理技能列表
private Skill[] fashuSkill=new Skill[3];//法术技能列表
public String getHeroname() {
return heroname;
}
public void setHeroname(String heroname) {
this.heroname = heroname;
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getMp() {
return mp;
}
public void setMp(int mp) {
this.mp = mp;
}
public Skill[] getWuliSkill() {
return wuliSkill;
}
public void setWuliSkill(Skill[] wuliSkill) {
this.wuliSkill = wuliSkill;
}
public Skill[] getFashuSkill() {
return fashuSkill;
}
public void setFashuSkill(Skill[] fashuSkill) {
this.fashuSkill = fashuSkill;
}
public abstract void say();
//方法的返回值为Skill
public abstract Skill hit();
}
(2)、WuliHero.java
package sanguosha.hero;
import sanguosha.skill.Skill;
public class WuliHero extends Hero{
@Override
public void say() {
System.out.println("本大将是:"+this.getHeroname()+"。前来受死!");
}
@Override
public Skill hit() {
//生成[0,10)的随机数(包括小数)
int i=(int)Math.floor(Math.random()*10);
if(i<7){
//生成物理技能数组内的数
int j=(int)Math.floor(Math.random()*this.getWuliSkill().length);
return this.getWuliSkill()[j];
}
else {
//生成法术技能数组内的数
int j=(int)Math.floor(Math.random()*this.getFashuSkill().length);
return this.getFashuSkill()[j];
}
}
}
(3)、ZhiliHero.java
package sanguosha.hero;
import sanguosha.skill.Skill;
public class ZhiliHero extends Hero{
@Override
public void say() {
System.out.println("本大帅是:"+this.getHeroname()+"。还不快快前来受死!");
}
@Override
public Skill hit() {
int i=(int)Math.floor(Math.random()*10);
if(i<8){
int j=(int)Math.floor(Math.random()*this.getFashuSkill().length);
return this.getFashuSkill()[j];
}
else{
int j=(int)Math.floor(Math.random()*this.getWuliSkill().length);
return this.getWuliSkill()[j];
}
}
}
4、skill专场:FashuSkill和WuliSkill
(1)、skill.java
package sanguosha.skill;
import sanguosha.hero.Hero;
public abstract class Skill {
private String skillname;//技能名称
private int damage;//基本伤害值
//构造函数
public Skill(String skillname,int damage){
this.damage=damage;
this.skillname=skillname;
}
public Skill(){}
public String getSkillname() {
return skillname;
}
public void setSkillname(String skillname) {
this.skillname = skillname;
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
//叠加伤害
public abstract int sumDamage(Hero hero);
}
(2)、FashuSkill.java
package sanguosha.skill;
import sanguosha.hero.Hero;
public class FashuSkill extends Skill{
@Override
public int sumDamage(Hero hero) {
return this.getDamage()+hero.getMp()/10;
}
//IStageImpl中调用了此构造方法
//构造器
public FashuSkill(String skillname,int damage){
super(skillname,damage);
}
}
(3)、WuliSkill.java
package sanguosha.skill;
import sanguosha.hero.Hero;
public class WuliSkill extends Skill{
@Override
public int sumDamage(Hero hero) {
return this.getDamage()+hero.getHp()/10;
}
}
5、stage专场:IStage和IStageImpl
(1)、IStage.java
package sanguosha.stage;
/**
舞台有很多种,不能继承,只能用接口
*/
public interface IStage {
void startGame();
}
(2)、IStageImpl.java
package sanguosha.stage;
import sanguosha.core.PKAction;
import sanguosha.hero.Hero;
import sanguosha.hero.WuliHero;
import sanguosha.hero.ZhiliHero;
import sanguosha.skill.FashuSkill;
import sanguosha.skill.Skill;
import sanguosha.skill.WuliSkill;
public class IStageImpl implements IStage{
//多态的理解
@Override
public void startGame() {
/*2种赋值方式*/
//1、(1)物理技能
Skill wuliSkill1=new WuliSkill();
wuliSkill1.setSkillname("飞龙在天");
wuliSkill1.setDamage(100);
Skill wuliSkill2=new WuliSkill();
wuliSkill2.setSkillname("众神下凡");
wuliSkill2.setDamage(120);
Skill wuliSkill3=new WuliSkill();
wuliSkill3.setSkillname("狂风式");
wuliSkill3.setDamage(150);
//1、(2)法术技能
Skill fashuSkill1=new FashuSkill("万剑穿心",100);
Skill fashuSkill2=new FashuSkill("雷霆万均",120);
Skill fashuSkill3=new FashuSkill("呼风唤雨",150);
//2、(1)英雄1
Hero wulihero=new WuliHero();
wulihero.setHeroname("张辽");
wulihero.setHp(800);
wulihero.setMp(300);
//向上转型
wulihero.setFashuSkill(new Skill[]{fashuSkill1,fashuSkill2,fashuSkill3});
wulihero.setWuliSkill(new Skill[]{wuliSkill1,wuliSkill2,wuliSkill3});
//2、(2)英雄2
Hero zhilihero=new ZhiliHero();
zhilihero.setHeroname("诸葛亮");
zhilihero.setHp(500);
zhilihero.setMp(550);
zhilihero.setFashuSkill(new Skill[]{fashuSkill1,fashuSkill2,fashuSkill3});
zhilihero.setWuliSkill(new Skill[]{wuliSkill1,wuliSkill2,wuliSkill3});
//3、PK
PKAction action=new PKAction();
action.pk(wulihero, zhilihero);
}
}
6、test专场
package sanguosha;
import sanguosha.stage.IStage;
/*
目的:深入的了解继承和多态
core::PK的动作
hero:英雄(智力型,物理型)
skill:技能(物理技能,法术技能)
stage:舞台(把英雄,技能都拿出来调用)
* */
import sanguosha.stage.IStageImpl;
public class Test {
public static void main(String[] args){
IStage stage=new IStageImpl();
stage.startGame();
}
}
7、运行效果图: