使用面向对象的封装、继承、多态实现的游戏角色
今天学习了面向对象的三大特征:封装、继承、多态, 作业是:Java(封装、继承、多态、接口)创建三个类,组成一个继承树,表示游戏中的角色练习题
代码如下:
Role 接口
public interface Role {//角色接口
int attack();//普通的攻击
void practise();//表示练习
}
Weapon接口:
Weapon 接口
public interface Weapon {//战士武器的接口
void setSoldier(Soldier s);
int fire();//战士的武器的属性
}
法师接口:
MagicStick 接口
public interface MagicStick {//法师
int fire();//法杖的属性
NamedRole角色类,所有职业的父类,继承了Role接口
NamedRole
public abstract class NamedRole implements Role {//角色类,所有职业的父类
private String name;//名字
private int age;//年龄
@Override
public int attack() {//返回值为角色的攻击对敌人的基本伤害
return 0;
}
@Override
public void practise() {//练习方法,练习后会提升伤害
}
public NamedRole() {
super();
}
public NamedRole(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "NamedRole{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
法师类—继承了NamedRole :
Magicer 类
public class Magicer extends NamedRole {//法师类
private int level=1;//魔法等级,范围为1--10
private MagicStick stick=null;//法师的法杖
public int attack(){//返回法师攻击的伤害值
int basicValue=5;//法师法杖的基本伤害
return level * basicValue;
}
public void practise(){
if(level<10){//当法杖大的等级达到了最大限制 将不会在提升
if (stick==null){//但没有法杖的时候,提升魔法伤害等级+1
level++;
return;
}
level += 1+stick.fire();//有法杖时,按法杖的属性进行提升法师等级
return;
}
return;
}
public Magicer(String name, int age, int level, MagicStick stick) {
super(name, age);
this.level = level;
this.stick = stick;
}
public Magicer() {
super();
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public MagicStick getStick() {
return stick;
}
public void setStick(MagicStick stick) {
this.stick = stick;
}
@Override
public String toString() {
return "Magicer [Name =" + getName() + ", Age =" + getAge() + ", level =" + level + ", stick =" + stick
+ ", attack =" + attack() + "]";
}
战士类—继承了NamedRole:
Soldier接口
public class Soldier extends NamedRole {//战士类
private int hurt=0;//攻击伤害值
private Weapon weapon=null; //
public int attack(){//返回战士攻击对敌人造成的伤害值
int att=hurt+weapon.fire();
return att;
}
public void practise(){//练习方法,练习后会提升伤害
hurt+=10;//每次练习,战士的攻击伤害值提升10
}
public Soldier(String name, int age, int hurt, Weapon weapon) {
super(name, age);
this.hurt = hurt;
this.weapon = weapon;
this.weapon.setSoldier(this);
}
public Soldier() {
super();
}
public int getHurt() {
return hurt;
}
public void setHurt(int hurt) {
this.hurt = hurt;
}
public Weapon getWeapon() {
return weapon;
}
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
@Override
public String toString() {
return "Soldier [Name =" + getName() + ", Age =" + getAge() + ", hurt =" + hurt + ", weapon=" + weapon
+ ", attack=" + attack() + "]";
}
黑矛(武器)–实现了MagicStick:
BlackStick 类
public class BlackStick implements MagicStick {//法师的黑杖
@Override
public int fire() {//法杖黑色的武器
Calendar cal=Calendar.getInstance();
int month=cal.get(Calendar.MARCH)+1;
if (month%2==0) {//当前的月份为偶数,提升法杖的伤害
return 2;
}else {
return 1;//反之为奇数法杖伤害为1
}
}
@Override
public String toString() {
return "BlackStick{}";
}
绿矛(武器)—实现了MagicStick :
GreenStick 类
public class GreenStick implements MagicStick {//法杖绿色的武器
@Override
public int fire() {//法杖绿色的武器
Calendar cal=Calendar.getInstance();
int month=cal.get(Calendar.MARCH) +1;//接受系统的时间
if (month==6 || month==7||month==8){//当系统时间为6.7.8月份时会提升魔法等级伤害
return 2;
}
return 1;//法杖伤害默认为1
}
@Override
public String toString() {
return "GreenStick{}";
}
战士的大刀(武器)—继承了Weapon:
Bolo
public class Bolo implements Weapon {//战士的大刀
Soldier soldier =null;//武器的持有者
@Override
public void setSoldier(Soldier s) {//绑定武器的使用者
soldier=s;
}
@Override
public int fire() {//武器的属性
if (soldier.getAge()<18){//大刀的使用者年龄小于18时,伤害值为50
return 50;
}else {
return 100;
}
}
@Override
public String toString() {
return "Bolo{}";
}
战士的长矛(武器)—继承了Weapon:
Pike 类
public class Pike implements Weapon { //战士的长矛
String name="Alex";//长矛的名字
Soldier soldier=null;
@Override
public void setSoldier(Soldier s) {//绑定武器的持有者
soldier=s;
}
@Override
public int fire() {//武器的属性
if( this.name.equals( soldier.getName() ) == true) {//当长矛的名字和战士的名字一致时,伤害值为1000
return 1000;
}else {
return 25;//否则伤害值为25
}
}
@Override
public String toString() {
return "Pike{}";
}
组队:
Team 类
public class Team {//组队类
NamedRole[] team=new NamedRole[6];//团队的最大人数
int teamMenberNumber=0;//团队的上伤害
public void addMember(NamedRole role){//组队增加一个成员
if (role==null){//判断传入的角色是否是无效的
return;
}
if (teamMenberNumber==6){//判断组队成员是否已达上限
return;
}
if (role.getClass()!=(new Magicer()).getClass()&&
role.getClass() != (new Soldier()).getClass()){//确保成员是有职业的
return;
}
team[teamMenberNumber] = role;//将成员加入团队
teamMenberNumber++;//团队成员数量加一
}
public int attackSum() {
int sum = 0;
for(int i = 0 ; i < teamMenberNumber ; i++) {
if(team[i].getClass() == (new Magicer()).getClass()) {//判断角色的真实职业,并将伤害值相加
Magicer r = (Magicer)team[i];
sum += r.attack();
}else{
Soldier r = (Soldier)team[i];
sum += r.attack();
}
}
return sum;
}
测试类:
Test 类
public class Test {
public static void main(String[] args) {
Team[] teams = new Team[2];
System.out.println("-----欢迎来到Test-----");
System.out.println("---您现在有两个个冒险团---");
System.out.println("-----战士冒险团成员-----");
Soldier[] soldiers = showSoldier();
teams[0] = addTeam(soldiers);
System.out.println("战士冒险团的总合伤害值为:" + teams[0].attackSum());
System.out.println("\n-----法师冒险团成员-----");
Magicer[] magicers = showMagicer();
teams[1] = addTeam(magicers);
System.out.println("法师冒险团的总合伤害值为:" + teams[1].attackSum());
System.out.println("\n两个冒险团练习后,伤害值为:");
practise(teams[0]);
practise(teams[1]);
System.out.println("-----战士冒险团成员-----");
for(int i = 0 ; i < soldiers.length ; i++) {
System.out.println(soldiers[i].toString());
}
System.out.println("战士冒险团的总合伤害值为:" + teams[0].attackSum());
System.out.println("\n-----法师冒险团成员-----");
for(int i = 0 ; i < magicers.length ; i++) {
System.out.println(magicers[i]);
}
System.out.println("法师冒险团的总合伤害值为:" + teams[1].attackSum());
}
public static Soldier[] showSoldier() {
Soldier[] soldiers = new Soldier[] {
new Soldier("Tom", 16 , 20 , new Bolo()),
new Soldier("Jake", 35 , 15 , new Bolo()),
new Soldier("Bill", 24 , 25 , new Pike()),
new Soldier("Alex", 22 , 20 , new Pike())
};
for(int i = 0 ; i < soldiers.length ; i++) {
System.out.println(soldiers[i].toString());
}
return soldiers;
}
public static Magicer[] showMagicer() {
Magicer[] magicers = new Magicer[] {
new Magicer("Jane", 18 , 2 , new GreenStick()),
new Magicer("Rose", 20 , 4 , new GreenStick()),
new Magicer("annie", 19 , 5 , new BlackStick()),
new Magicer("Angle", 16 , 2 , new BlackStick()),
};
for(int i = 0 ; i < magicers.length ; i++) {
System.out.println(magicers[i]);
}
return magicers;
}
public static Team addTeam(Object[] objs) {
Team team = new Team();
for(int i = 0 ; i < objs.length ; i++) {
if(objs[i].getClass() == (new Soldier()).getClass()) {
Soldier soldier = (Soldier)objs[i];
team.addMember(soldier);
}
if(objs[i].getClass() == (new Magicer()).getClass()) {
Magicer magicer = (Magicer)objs[i];
team.addMember(magicer);
}
}
return team;
}
public static void practise(Team team) {
for(int i = 0 ; i < team.teamMenberNumber ; i++) {
if(team.team[i].getClass() == (new Soldier()).getClass()) {
Soldier soldier = (Soldier)team.team[i];
soldier.practise();;
}
if(team.team[i].getClass() == (new Magicer()).getClass()) {
Magicer magicer = (Magicer)team.team[i];
magicer.practise();;
}
}
}
最后的输出为:
-----欢迎来到Test-----
---您现在有两个个冒险团---
-----战士冒险团成员-----
Soldier [Name =Tom, Age =16, hurt =20, weapon=Bolo{}, attack=70]
Soldier [Name =Jake, Age =35, hurt =15, weapon=Bolo{}, attack=115]
Soldier [Name =Bill, Age =24, hurt =25, weapon=Pike{}, attack=50]
Soldier [Name =Alex, Age =22, hurt =20, weapon=Pike{}, attack=1020]
战士冒险团的总合伤害值为:1255
-----法师冒险团成员-----
Magicer [Name =Jane, Age =18, level =2, stick =GreenStick{}, attack =10]
Magicer [Name =Rose, Age =20, level =4, stick =GreenStick{}, attack =20]
Magicer [Name =annie, Age =19, level =5, stick =BlackStick{}, attack =25]
Magicer [Name =Angle, Age =16, level =2, stick =BlackStick{}, attack =10]
法师冒险团的总合伤害值为:65
两个冒险团练习后,伤害值为:
-----战士冒险团成员-----
Soldier [Name =Tom, Age =16, hurt =30, weapon=Bolo{}, attack=80]
Soldier [Name =Jake, Age =35, hurt =25, weapon=Bolo{}, attack=125]
Soldier [Name =Bill, Age =24, hurt =35, weapon=Pike{}, attack=60]
Soldier [Name =Alex, Age =22, hurt =30, weapon=Pike{}, attack=1030]
战士冒险团的总合伤害值为:1295
-----法师冒险团成员-----
Magicer [Name =Jane, Age =18, level =5, stick =GreenStick{}, attack =25]
Magicer [Name =Rose, Age =20, level =7, stick =GreenStick{}, attack =35]
Magicer [Name =annie, Age =19, level =7, stick =BlackStick{}, attack =35]
Magicer [Name =Angle, Age =16, level =4, stick =BlackStick{}, attack =20]
法师冒险团的总合伤害值为:115