轨道
/
Java
Java
/
练习
/
巫师与战士
巫师与战士

巫师与战士

学习练习

简介

继承

继承是 OOP(面向对象编程)中的核心概念。 它表示一种 IS-A 关系。 它在编程中的字面含义和英语中一样,都是从父级继承特性(在编程中,特性通常指函数和变量)。

看看下面这个Animal类:

//Creating an Animal class with bark() as a member function.
public class Animal {

    public void bark() {
        System.out.println("This is an animal");
    }

}

Animal是父类,因为这个类具有的属性可以扩展给所有动物。

再看一个名叫Lion的动物,它的类是这样的:

//Lion class is a child class of Animal.
public class Lion extends Animal {

    @Override
    public void bark() {
        System.out.println("Lion here!!");
    }

}
Note

Override注解用于表示子类中的方法重写了其父类的方法。 它不是严格必需的,但使用它是一种最佳实践。

现在,当我们这样写:

Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();

注意:用Lion初始化Animal类。 输出会是这样:

Lion here!!

按照 OOP 的说法,继承有很多种类型,但 Java 只支持其中一部分(多级继承和层次继承)。 想了解更多,请阅读这篇文章。

说明

在这个练习中,你正在玩一款角色扮演游戏,不同类型的战士可以互相战斗。游戏为每种类型的战士制定了不同的规则。我们将重点关注两种特定类型:巫师和战士。

对于 Warrior,规则如下:

  • Warrior 永远不会处于易伤状态。
  • 如果 Warrior 攻击的战士没有处于易伤状态,Warrior 造成6点伤害。
  • 如果 Warrior 攻击的战士处于易伤状态,Warrior 造成10点伤害。

对于 Wizard,规则如下:

  • Wizard 可以提前准备法术。
  • 除非 Wizard 提前准备了法术,否则会处于易伤状态。
  • 如果 Wizard 提前准备了法术,则造成12点伤害。
  • 如果 Wizard 没有提前准备法术,则造成3点伤害。

1. 创建 Warrior 类

创建一个名为Warrior的新类。该类应继承现有的Fighter类。

2. 描述 Warrior

更新Warrior类,使其toString()方法描述它属于哪种战士。该方法应返回字符串"Fighter is a Warrior"。

Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"

3. 让 Warrior 免疫易伤

更新Warrior类,使其isVulnerable()方法始终返回false。

Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false

4. 计算 Warrior 的伤害点数

更新Warrior类,使其getDamagePoints(Fighter)方法根据上述规则计算 Warrior 造成的伤害点数。

Warrior warrior = new Warrior();
Wizard wizard = new Wizard();

warrior.getDamagePoints(wizard);
// => 10

5. 创建 Wizard 类

再创建一个名为Wizard的新类。该类也应继承现有的Fighter类。

6. 描述 Wizard

更新Wizard类,使其toString()方法描述它属于哪种战士。该方法应返回字符串"Fighter is a Wizard"。

Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"

7. 允许 Wizard 准备法术,并在未准备法术时使其处于易伤状态

更新Wizard类,添加一个名为prepareSpell()的方法。该类应记住此方法何时被调用,并确保其isVulnerable()方法仅在法术已准备时返回false。

Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false

8. 计算 Wizard 的伤害点数

更新Wizard类,使其getDamagePoints(Fighter)方法根据上述规则计算 Wizard 造成的伤害点数。

Wizard wizard = new Wizard();
Warrior warrior = new Warrior();

wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Java Exercism

准备好开始 巫师与战士 了吗?

注册 Exercism,借助 26 个概念158 个练习 和真人导师指导,学习并掌握 Java,全部免费。