簡體   English   中英

如何使用Java訪問其值的對象的ArrayList

[英]How to make an ArrayList of objects in Java with the ability to access their values

所以我正在開發一個Java游戲,我對如何處理某些事情感到有些困惑。 這是一個交易卡游戲,有點像魔術,所以對於我到目前為止的課程

  • GameDriver
  • WolfCard
  • TheLarionCard

我希望我能夠擁有至少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));

但顯然我不能,我在這里做錯了什么?

任何幫助都很棒! 謝謝!

我認為你有三個選擇:

  1. 您希望每種不同類型的卡都具有health屬性。 在這種情況下,您可以將該屬性放入父類Cards ,然后向任何擴展Cards類請求屬性是有效的。 如果Cards類具有health數據字段,則問題中的代碼將起作用。

  2. 您只希望TheLarionCard擁有健康屬性。 在這種情況下,你的演員將是:

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

    這樣,編譯器就知道要在TheLarionCard類中查找health屬性,而不是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 } } 

    這是抽象工廠模式設計的簡化版本,其他一些答案正在討論,所以如果您是接口的新手,可以通過這種方式嘗試查看結構是否有效,然后再添加接口。

Cards定義接口或抽象方法getHealth()方法,必須由WolfCardTheLarionCard 然后,你可以做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;
  }
}

您應該檢查這些類中是否具有健康屬性的getter,無法從類外部訪問私有屬性。

只需創建一個新方法getHealth(),它返回健康屬性,然后在最后一行的點后面追加它。

順便說一下,如果已經使用該構造型定義了ArrayList,則不必轉換Cards類。

你真的不需要接口甚至是如此復雜的類。 我猜你所有的卡都有類似的行為。 它們屬於某種類型,可以執行特定操作,可以對它們執行操作和/或影響等等。因此,您只需要一個卡類,並且其中包含管理這些通用狀態的所有字段和方法/動作。

然后你可以創建從Cards類繼承的單獨的類(順便說一下,最好將其重命名為“Card”),就好像你有效果類型卡(例如MTG Mana Flare或Hideous Visage等效物)然后你也有生物卡片(如MTG的Shivan Dragon或Dragon Whelp)你可以制作像EffectCard這樣的類,它可能有自己的字段,如“duration”和“affectedTypes”,然后用它來制作ManFlare實例,Hideous Visage實例等。 CreatureCard包含hitpoints,firstStrike等內容,並從中生成ShivanDragon實例和DragonWhelp實例。

也不要害怕構圖。 不是為每張卡子類化/制作額外的類,而是制作一個比上面更簡單的層次結構,並傳遞“命令”或“動作”類,它們決定了更具體的細節。 就像EffectCard類的FirstStrike實例可以使用“action”實例初始化,該實例告訴它具體如何影響CreatureCard實例,CreatureCard類的ShivanDragon實例將有一個動作告訴它如何通過利用Red來增加它的攻擊地政卡等

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM