面现对象的游戏角色小功能---封装、继承、多态(来自一个小白的班门弄斧)

使用面向对象的封装、继承、多态实现的游戏角色

今天学习了面向对象的三大特征:封装、继承、多态, 作业是: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

这就是全部的代码块了,欢迎大家多多指出不足;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值