2010-11-19 104 views
0

我正在嘗試編寫一個程序來模擬紙牌遊戲。我有一個名爲MagicCard的類,以及擴展卡的各種類,比如card1,card2 ...我想找到一種方法來存儲不同卡片(卡片)的列表/數組。每個card1,card2 ...都有一個「特殊」效果,當它們播放時它們會觸發,所以需要一個獨特的功能,這就是爲什麼我需要所有不同的子類。許多牌具有相似的屬性。我怎樣才能以合理和方便的方式儲存甲板? (我想讓甲板很容易被操控,這樣我就可以添加一張卡片,或者當我想要時從中移除一張卡片)。存儲不同子類的列表/數組的最佳方式

目前,這是我所:

//My Code 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace mtgDeckSimulator 
{ 

    //General properties of a magic card, extended by individual classes 
    class cardProperties 
    { 
     private String cardName; 
     /*Mana Array Aranged in the following Order: 
     * [Colorless,White,Blue,Black,Red,Green] */ 
     private int[] manaCost; 
     /* Card Type int definitions: 
     * 0-Artifact 
     * 1-Creature 
     * 2-Enchantment 
     * 3-Instant 
     * 4-Land 
     * 5-Planeswalker 
     * 6-Sorcery 
     * 7-Tribal */ 
     private int cardType; 
     public int attack; 
     public int defense; 
     private bool permBool; 
     private bool isLegen; //Or is restricted to one copy 
     public cardProperties(String cardName,int[] manaCostIn,int cardTypeIn,int attack,int defense,bool permBoolIn,bool isLegenIn) 
     { 
      this.cardName = cardName; 
      manaCost = manaCostIn; 
      cardType = cardTypeIn; 
      permBool = permBoolIn; 
      isLegen = isLegenIn; 
     } 
     //Get Variables 
     public String getCardName() 
     { 
      return cardName; 
     } 
     public int[] getManaCost() 
     { 
      return manaCost; 
     } 
     public int getCardType() 
     { 
      return cardType; 
     } 
     public bool getPermBool() 
     { 
      return permBool; 
     } 
     public bool getIsLegen() 
     { 
      return isLegen; 
     } 
     //Other Methods 
    } 

    //Interface for magic cards 
    interface MagicCard 
    { 
     int SpecialEffect(); 
    } 
    #region Magic Card List 
    class WallOfOmens : cardProperties, MagicCard 
    { 
     public WallOfOmens() 
      : base("Wall of Omens", new int[6] { 1, 1, 0, 0, 0, 0 }, 1, 0, 4, true, false) 
     { 
      ; 
     } 
     public int SpecialEfect() 
     { 
      return 1; 
      //throw new NotImplementedException(); 
     } 
    } 
    class Card2 : cardProperties, MagicCard 
    { 
     public int SpecialEfect() 
     { 
      return 2; 
      //throw new NotImplementedException(); 
     } 
    } 
    #endregion 
} 

有沒有實現這更好的辦法?代碼也不起作用,因爲它告訴我WallOfOmens和Card2不實現SpecialEffect(),爲什麼會發生這種情況?

+2

如果您在界面中將'SpecialEfect'拼寫爲'SpecialEffect',它可能會更好。 – 2010-11-19 19:27:58

+0

因爲你並不是說你的函數實現了這個接口。他們應該被稱爲MagicCard.SpecialEffect() – Stu 2010-11-19 19:28:29

+0

@Stu:在C#中,除非它不明確(即,具有相同成員的多個接口),否則不需要限定該接口 – 2010-11-19 19:29:34

回答

4

我會考慮替代方案,使用組合而不是繼承。組合比繼承更靈活,它允許你比繼承更自由地組合不同的方面。

而不是創造

abstract class BaseCard{abstract int SpecialEffect();} 
class Card1 : BaseCard{override int SpecialEffect(){return 1;}} 
class Card2 : BaseCard{override int SpecialEffect(){return 2;}} 
... 

的你在工廠

Card card1 = new Card(new SpecialEffect1()); 
Card card2 = new Card(new SpecialEffect2()); 

這聽起來好像只是一個步驟創建不同的SpecialEffect類

abstract class SpecialEffectBase{abstract int SpecialEffect();} 
class SpecialEffect1 : SpecialEffectBase{override int SpecialEffect(){return 1;}} 
class SpecialEffect2 : SpecialEffectBase{override int SpecialEffect(){return 2;}} 
... 

和組裝不同的卡間接,但如果你在不同的卡片上重複使用幾個效果,並且有ot她的性質卡之間的差異,如規則或東西,你可以將這些類似這樣的

Card card1 = new Card(new SpecialEffect1(), new Rule1()); 
Card card2 = new Card(new SpecialEffect1(), new Rule2()); 
Card card3 = new Card(new SpecialEffect2(), new Rule1()); 
Card card4 = new Card(new SpecialEffect2(), new Rule2()); 
... 

另一個好處是,它迫使你封裝在SpecialEffect類,規則,規則的SpecialEffect規則的規則 - 類,而不是讓他們遍佈在你的卡類的地方。

+0

它給我一個錯誤的代碼,強調返回並說「預期類型」。我究竟做錯了什麼? (我剛剛對編碼很陌生)。 – chetjan 2010-11-19 21:04:14

+0

它似乎工作,如果我用{return 1;}替換(返回1;),所以它似乎現在工作。 – chetjan 2010-11-19 21:06:43

+0

@chetjan,對不起,我現在修復了 – 2010-11-20 06:42:43

1

您在實現該接口的類中存在拼寫錯誤SpecialEffect。修正錯字應該有所幫助。

一旦編譯完成,您可以將MagicCard實例存儲在任何(最好是通用的)容器中。

擴展MagicCard接口可能會有所幫助,以便它具有返回對象爲cardProperties以便於訪問的屬性。雙重繼承使訪問容器元素的基類和接口變得更加棘手,因爲您只能在通用容器中存儲一個類型。似乎公平地打賭,任何MagicCard將有cardProperties

0

使用List類。其中T是cardProperties或MagicCard 此外,爲什麼不移除界面MagicCard並添加int SpecialEffect();而不是使用界面?作爲cardProperties的抽象方法:

public abstract int SpecialEffect();

抽象方法必須由子類實現,則U必須標記爲抽象太

0

也許查找Polymorphism的cardProperties。

理想情況下,您應該存儲List<Card>。所有不同的卡都從您的基類Card繼承,有些卡實現了一個名爲IMagicCard的接口。

另外,如果只有一種類型的MagicCard,它可以直接從Card

所以繼承,你可以有:

Card 
WizardCard : Card, IMagicCard 
WitchCard : Card, IMagicCard 
HumanCard : Card 

或者

Card 
MagicCard : Card 
NonMagic: Card 

我會推薦前,但取決於你的遊戲結構,兩者都可能適用。

如果我誤解了你的意圖,你將不得不原諒我。

0

我個人會將MagicCard作爲父類,而不是作爲接口。其中,您可以聲明SpecialEffect爲虛擬,以允許覆蓋,即使它不是必需的。然後,在甲板課程中,您可以使用List<MagicCard>對象,就像andrewjs建議的一樣。

相關問題