继承的概念:
1、在原有的类的基础上快速增加新的功能
2、不影响到原来的类,也不改变原来类的代码,方便对于功能的扩展
3、继承是一种创建新类的方式,新建的类可以继承一个或多个类
4、继承描述的是类和类之间的关系
5、新建的类称为子类,之前存在的类称为父类
继承的规则:子类和父类,有同名的方法和属性,但具体内容不同。
如果子类中不用写任何方法,运行时调用的是从父类继承来的方法!
继承的格式:关键字: extends
语法格式: class 子类 extends 父类{
子类特有的属性以及方法
}
自动转型:父类 对象变量名 = new 子类();继承后子类可以是父类类型A 子类重写父类中的方法:
重 写:在子类中重新定义父类中的方法,必须和父类中的方法同名同参。重写后,调用时,即调用子类中的方法,未重写,则调用父类中的方法。
在上篇模拟对战游戏中,只设置了两个对象1v1的情况,现在如果模拟多人对战,则需要增加对象的数量,如果利用类与对象的方法增加对象的话,则需要分别构建多个不同的类,但这些类中的方法和属性基本一致,没有必要给每个对象都构建独立的属性和方法。所以,在这篇中引用了继承的方法,创建一个父类,添加所有对象都具有的属性和方法,使每个子类调用父类中的方法和属性,子类中只需要编写各自独有的方法,如一技能的伤害和升级方法、伤害计算方法等。
package PK;
public class Hero {
// 属性:
String playerID;
String name;
int hp;//生命值
int ad;//物理伤害
int ad_1;//一技能物理伤害
int ap;//魔法伤害
int ap_1;//一技能魔法伤害
int lv; //人物等级
int lv_1;// 1技能等级
// 1级初始化
public void init(String playerID, String name){
this.playerID = playerID;
this.name = name;
this.hp = 3000;
this.ad = 150;
this.ap = 0;
this.lv = 1;
this.lv_1 = 1;
}
//1技能初始化
public void lv_1(String playerID) {
this.ad_1 = 100;
this.ap_1 = 50;
}
// 方法: 升级
public void levelUp(){
this.lv++;
this.hp += 100;
this.ad += 50;
System.out.println (this.playerID + "(" + name + ")升级了,当前等级:" + this.lv);
}
//技能升级
public void levelUp_1(){
System.out.print(this.playerID + "(" + name + ")一技能升级 等级:"+ this.lv_1);
System.out.println ("\n");
if(this.lv_1>=3) {
System.out.print("等级已满\n");
}
else {
this.lv_1++;
this.ad_1 += 60;
this.ap_1 += 20;
}
}
}
上述代码所示的是供子类调用方法和属性的父类,其中包括英雄的基础属性、升级方法。
下述子类分别调用父类中的方法和属性:
package PK;
public class LvBu extends Hero{
public void attack(Hero hero){
// 伤害计算
int num = (int) (400 + 200 * (this.lv_1 - 1) + 0.5 * this.ad);
hero.hp -= num;
System.out.println (this.playerID + "(" + name + ")对" + hero.playerID + "(" + hero.name + ")造成了" + num +"点伤害");
System.out.println ("----------" + hero.playerID + "(" + hero.name + ")剩余血量:" + hero.hp);
if(hero.hp <= 0) {
System.out.print("("+name+")胜利");
}
}
}
package PK;
public class ZHANGFEI extends Hero {
// 方法: 攻击后羿的方法 450/550/650/750/850/950(+100%物理加成)点物理伤害
public void attack(Hero hero){
int num = (int) (450 + 100 * this.lv + 1 * this.ad + this.ad_1 + this.ap_1);
hero.hp -= num;
System.out.println (this.playerID + "(" + name + ")对" + hero.playerID + "(" +hero.name + ")造成了" + num + "点伤害");
System.out.println ("----------" + hero.playerID + "(" + hero.name + ")剩余血量:" + hero.hp);
if(hero.hp <= 0) {
System.out.print("("+name+")胜利");
}
}
}
package PK;
public class HOUYI extends Hero {
// 方法: 攻击方法 造成200/240/280/320/360/400(+50%物理加成)点物理伤害
public void attack(Hero hero){
// 伤害计算
int num = (int) (200 + 40 * this.lv + 0.5 * this.ad + this.ad_1 + this.ap_1);
hero.hp -= num;
System.out.println (this.playerID + "("+name+")对" + hero.playerID + "("+hero.name+")造成了" +num + "点伤害");
System.out.println ("----------"+hero.playerID + "(" + hero.name + ")剩余血量:" + hero.hp);
if(hero.hp <= 0) {
System.out.print("("+name+")胜利");
}
}
}
最后在主函数中实现,三个对象的对战情况,先两两对战,胜者和另一个对象对战,直至有一方血量为负,结束战斗。在代码中分别添加吕布与后羿和张飞的对战程序,同样使用随机数。
package PK;
import java.util. Random; // 导入随机数类
public class GAME {
public static void main(String[] args){
// 选择英雄阶段
// 1.创建后羿对象
HOUYI hy1 = new HOUYI ();
hy1.init ("小A", "后羿");
// 2.创建张飞对象
ZHANGFEI zf1 = new ZHANGFEI ();
zf1.init ("小B", "张飞");
// 随机数
Random random = new Random ();
// 游戏对象加载完成 准备开始PK
while(hy1.hp > 0 && zf1.hp > 0){
// 先使用随机数随机 4个数 0 1 2 3 4 : 1 后羿升级 3 张升级 0 后羿攻击张飞 2张飞攻击后羿 4后羿一技能升级
int rn = random.nextInt (6);
switch(rn) {
case 0:
hy1.attack (zf1);
break;
case 1:
hy1.levelUp ();
break;
case 2:
zf1.attack (hy1);
break;
case 3:
zf1.levelUp ();
break;
case 4:
hy1.levelUp_1();
break;
case 5:
zf1.levelUp_1();
break;
}
}
LvBu lb1 = new LvBu ();
lb1.init("小C", "吕布");
lb1.hp += 1500;
if(zf1.hp <= 0){
System.out.println ("后羿胜利");
while(hy1.hp > 0 && lb1.hp > 0){
int rn = random.nextInt (6);
switch(rn) {
case 0:
hy1.attack (lb1);
break;
case 1:
hy1.levelUp ();
break;
case 2:
lb1.attack (hy1);
break;
case 3:
lb1.levelUp ();
break;
case 4:
hy1.levelUp_1();
break;
case 5:
lb1.levelUp_1();
break;
}
}
}
else {
System.out.println ("张飞胜利");
zf1.hp += 1500;
while(zf1.hp > 0 && lb1.hp > 0){
int rn = random.nextInt (6);
switch(rn) {
case 0:
zf1.attack (lb1);
break;
case 1:
zf1.levelUp ();
break;
case 2:
lb1.attack (zf1);
break;
case 3:
lb1.levelUp ();
break;
case 4:
zf1.levelUp_1();
break;
case 5:
lb1.levelUp_1();
break;
}
}
}
}
}
运行结果显示为:
小A(后羿)对小B(张飞)造成了315点伤害
----------小B(张飞)剩余血量:2685
小B(张飞)对小A(后羿)造成了700点伤害
----------小A(后羿)剩余血量:2300
小A(后羿)一技能升级 等级:1小B(张飞)升级了,当前等级:2
小B(张飞)升级了,当前等级:3
小B(张飞)对小A(后羿)造成了1000点伤害
----------小A(后羿)剩余血量:1300
小B(张飞)对小A(后羿)造成了1000点伤害
----------小A(后羿)剩余血量:300
小A(后羿)对小B(张飞)造成了395点伤害
----------小B(张飞)剩余血量:2490
小A(后羿)升级了,当前等级:2
小A(后羿)一技能升级 等级:2小B(张飞)对小A(后羿)造成了1000点伤害
----------小A(后羿)剩余血量:-600
(张飞)胜利张飞胜利
小B(张飞)一技能升级 等级:1小B(张飞)升级了,当前等级:4
小B(张飞)升级了,当前等级:5
小B(张飞)升级了,当前等级:6
小C(吕布)对小B(张飞)造成了475点伤害
----------小B(张飞)剩余血量:3815
小B(张飞)一技能升级 等级:2小B(张飞)升级了,当前等级:7
小B(张飞)对小C(吕布)造成了1760点伤害
----------小C(吕布)剩余血量:2740
小B(张飞)升级了,当前等级:8
小B(张飞)升级了,当前等级:9
小B(张飞)升级了,当前等级:10
小B(张飞)升级了,当前等级:11
小C(吕布)一技能升级 等级:1小C(吕布)升级了,当前等级:2
小C(吕布)升级了,当前等级:3
小B(张飞)一技能升级 等级:3等级已满
小B(张飞)升级了,当前等级:12
小B(张飞)对小C(吕布)造成了2510点伤害
----------小C(吕布)剩余血量:430
小C(吕布)一技能升级 等级:2小B(张飞)对小C(吕布)造成了2510点伤害
----------小C(吕布)剩余血量:-2080
(张飞)胜利