2013-04-16 3 views
-1

Чтобы дать некоторый фон, я пытаюсь решить Project Euler Problem 54 с участием рук в покере. Хотя есть бесконечные подходы к этому. То, что я хотел бы сделать, - перечислить список строк, например: {«8C», «TS», «KC», «9H», «4S»};C# get/set solution

Я хотел бы «получить» экземпляр класса карты со значением свойства и подходящим для каждой соответствующей строки. Я еще не использовал 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 "'? Кроме того, является ли «Карточка» «Строкой»? – 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; 
    } 
} 

Я преобразовал ваш suit и value поле в свойствах и вместо некоторого метода геттера, который в вашем случае не будет работать, я добавил статический метод.

Вы можете использовать его как этот 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); return new Card {Suit = GetSuitEnum (костюм), Value = 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 }; 
    } 
}