2013-04-16 60 views
-1

爲了給一些背景我試圖解決項目歐拉Problem 54涉及撲克牌手。雖然有無限的方法。我想要做的是列舉一個字符串列表,例如: {「8C」,「TS」,「KC」,「9H」,「4S」};C#得到/設置解決方案

我想「獲得」類卡的實例與屬性值,並適合每個相應的字符串。我還沒有使用get/set,所以也許有一個明顯的方法來解決這個問題。最終我想要一個對象類型卡的列表,我不介意提前建立所有的卡,例如「2H」返回一個Card類型的實例,其中suit = Hearts,value = 2 , 例如。

我知道這段代碼是錯誤的,但它應該給出我想要做的事情的一個概念。任何建議,將不勝感激。

class Card 
{ 
    public string suit; 
    public int value; 
    public string cardname 
    { 
     get 
     { 
      if (cardname == "2H") Card TwoH = new Card(); 
       TwoH.suit = "Hearts" 
       TwoH.value = 2; 
       return TwoH; 
     } 
    } 
} 
+0

如果'cardname!=「2h」',你會返回什麼?而且,'Card'是'String'? – Ofiris

+0

你的問題不是很清楚。你想更好地設計卡組?去谷歌上查詢。 – tnw

+0

我不知道你在說什麼。請澄清。 –

回答

0

我會做這樣的:

public class Card 
{ 
    public string Suit { get; set; } 
    public int Value { get; set; } 

    public static Card FromString(string s) 
    { 
     if (s == "2H") return new Card() { Suit = "Hearts", Value = 2 }; 
     else if (s == "....") 
     ... 
     else return null; 
    } 
} 

我已經將您suitvalue字段的屬性,而不是一些getter方法,在你的情況下不會工作我已經添加了一個靜態方法。

您可以使用它像這樣Card card2H = Card.FromString("2H");

+0

是的,這看起來不錯,我會放棄這一點。 – user2163343

+0

而不是檢查52個字符串,我會考慮解析出套裝和值 - 'string suit = s.Substring(s.Length - 1); int.TryParse(s.Substring(0,s.Length-1),out value);返回新卡{Suit = GetSuitEnum(訴訟),Value =值);'。我會使用一個Enum作爲套裝,並讓GetSuitEnum獲取單字符字符串並返回枚舉值。 –

+0

當然可以。我想讓代碼接近原始文章中的代碼。但解析是更好的方法。 – Dirk

3

爲什麼不把基於字符串參數填充西裝和價值構造

public Card(string name) 
{ 
    switch(name) 
    { 
     case "2H": 
      this.suit = "Hearts"; 
      this.value = 2; 
      break; 
     //... 
    } 
} 
0

也許使用兩個switch語句,第一

switch (cardname[0]) 
{ 
    ... 
} 

然後

switch (cardname[1]) 
{ 
    ... 
} 

在此之前,檢查cardname.Length == 2。在每個switch中,有一個default部分,如果char值沒有意義,則會拋出異常。

1

這可能不是你似乎在詢問,但如果你會得到(例如2H,3C等)的值都是2個字符長,那麼你可以試試這個確切的解決方案:

public class Card 
{ 
    public string suit { get; set; } 
    public int value { get; set; } 

    public static Card GetCard(string cardName) 
    { 
     string tmpSuit; 
     int tmpValue; 
     char[] cardNameParts = cardName.ToCharArray(); 
     switch(charNameParts[0]) 
     { 
      case "A": 
       tmpValue = 1; 
       break; 
      case "2": 
       tmpValue = 2; 
       break; 
      ... 
     } 


     switch(charNameParts[1]) 
     { 
      case "H": 
       tmpSuit= "Hearts"; 
       break; 
      case "C": 
       tmpSuit= "Clubs"; 
       break; 
      ... 
     } 
     return new Card() { suit = tmpSuit, value = tmpValue }; 
    } 
}