3

所以我正在用Java开发一个游戏,我对我应该如何去做有点困惑。这是一个集换式卡牌游戏,有点像魔术,所以到目前为止我有

  • 游戏驱动
  • 狼卡
  • 拉里昂卡

我希望我能够拥有至少 50 种不同类型的卡片,每一种都属于自己的班级,所以一个小问题是,这是最好的方法吗?至于我的问题:

我的 GameDriver 类中有以下代码:

ArrayList<Cards>  playerHand = new ArrayList<Cards>();
playerHand.add(new WolfCard());
playerHand.add(new TheLarionCard());
System.out.println(((Cards)playerHand.get(1)));

每张卡都扩展卡,卡扩展 GameDriver,上面的代码将打印出如下内容:

TheLarionCard[panel0,0,0,0x0,invalid,layout=java.awt.FlowLayout]

但是现在,如果我想获取 TheLarionCard 的健康状况,我想我可以将 .health 添加到最后一行,例如:

System.out.println(((Cards)playerHand.get(1).health));

但显然我不能,我在这里做错了什么?

任何帮助都很棒!谢谢!

4

4 回答 4

3

我认为你有三个选择:

  1. 您希望每种不同类型的卡都有一个health属性。在这种情况下,您可以将该属性放入父类中Cards,然后请求任何扩展类的属性都是有效的Cards。如果Cards该类具有health数据字段,则问题中的代码将起作用。

  2. 您只想TheLarionCard拥有健康财产。在这种情况下,您的演员阵容将是:

    System.out.println(((TheLarionCard)playerHand.get(1).health));
    

    这样,编译器就知道在TheLarionCard类中查找健康属性,而不是Cards类。

  3. 您实际上并不需要将各个卡片类作为Cards. 如果您这样做没有真正令人信服的理由,您可以让所有卡片都属于Cards该类,并且它们的不同类型(TheLarionCard、WolfCard 等)可以由数据字段指定。例如:

    public class Card {
        String type;
    
        public Card(String inType) {
            this.type = inType;
        }
    
        public String toString() {
            return "This is a " + type;
        }
    }
    

    这样,如果您希望不同的卡片表现不同,您可以检查它们的type值并根据其值分配不同的行为,例如

    public void awesomeMethod() {
        if ("TheLarionCard".equals(type)) {
            // execute TheLarionCard code
        } else if ("WolfCard".equals(type)) {
            // execute WolfCard code
        }
    }
    

    这是其他一些答案正在讨论的抽象工厂模式设计的简化版本,因此,如果您不熟悉接口,可以尝试这种方式来查看结构是否有效,然后再添加接口。

于 2012-08-19T01:22:45.033 回答
1

在 中定义一个接口或抽象方法getHealth()方法Cards,必须由WolfCard和实现TheLarionCard。然后,你可以做playerHand.get(1).getHealth().

例如:

public abstract class BaseCard {
  protected int health;

  public abstract int getHealth();
}

public class WolfCard extends BaseCard {
  private int wolfHealthBoost;  

  public int getHealth() {
    return health + wolfHealthBoost;
  }
}

public class TheLarionCard extends BaseCard {
  public int getHealth() {
    return health;
  }
}
于 2012-08-18T23:07:07.980 回答
0

您应该检查这些类中是否有健康属性的获取器,不能从类外部访问私有属性。

只需创建一个返回健康属性的新方法 getHealth(),然后将其附加到最后一行的点之后。

顺便说一句,如果您已经使用该原型定义了 ArrayList,则不必强制转换 Cards 类。

于 2012-08-18T23:09:34.290 回答
0

您实际上并不需要接口,甚至不需要如此复杂的各种类。我猜你所有的卡片都有类似的行为。它们属于某种类型,可以执行特定操作,可以对它们进行操作和/或影响等。因此,您只需要一个 Cards 类,其中包含管理这些通用状态的所有字段和方法/行动。

然后你可以创建从 Cards 类继承的单独的类(顺便说一句,最好重命名为“Card”),就像你有效果类型的卡片(比如 MTG Mana Flare 或 Hideous Visage 等价物),然后你也有生物卡(例如 MTG 的 Shivan Dragon 或 Dragon Whelp)您可以制作诸如 EffectCard 之类的类,它可能具有自己的字段,例如“duration”和“affectedTypes”,然后用它来制作 ManFlare 实例、Hideous Visage 实例等。还可以制作一个带有生命值、firstStrike 等内容的 CreatureCard,并从中制作 ShivanDragon 实例和 DragonWhelp 实例。

也不要害怕构图。与其对每张卡片进行子类化/制作额外的类,不如像上面那样创建一个更简单的层次结构,并将其传递给指示更具体细节的“命令”或“动作”类。就像 EffectCard 类的 FirstStrike 实例可以用一个“动作”实例来初始化,该实例具体告诉它如何影响一个 CreatureCard 实例,CreatureCard 类的 ShivanDragon 实例将有一个动作告诉它如何通过使用 Red 来增加它的攻击地卡等

于 2012-08-18T23:46:19.207 回答