Существует очевидное числовое значение для пип-карт, и мы можем добавить J = 11, Q = 12, K = 13.
Может быть удобнее иметь A = 14, чем A = 1в зависимости от моделируемой игры (таким образом, можно более просто вычислить различные относительные значения рук).
Перечисления не дают реального преимущества, особенно потому, что перечисления допускают значения вне допустимого диапазона, если вы явно не проверяете их (например,ничто не мешает кому-то присвоить (CardValue)54
значению перечисления значений карты).
ToString может помочь с массивом значений {null,"1","2","3","4","5","6","7","8","9","10","J","Q","K"}
.Точно так же {'♥','♦','♠','♣'}
может дать более хороший вывод.
Анализ всегда сложнее, чем вывод строки, даже если вы очень строги в том, что принимаете, так как вам приходится иметь дело с возможностью неправильного ввода.Простым подходом может быть:
private Card(string input)
{
if(input == null)
throw new ArgumentNullException();
if(input.length < 2 || input.length > 3)
throw new ArgumentException();
switch(input[input.Length - 1])
{
case 'H': case 'h': case '♥':
_suit = Suit.Hearts;
break;
case 'D': case 'd': case '♦':
_suit = Suit.Diamonds;
break;
case 'S': case 's': case '♠':
_suit = Suit.Spades;
break;
case 'C': case 'c': case '♣':
_suit = Suit.Clubs;
break;
default:
throw new ArgumentException();
}
switch(input[0])
{
case "J": case "j":
_cardValue = 11;
break;
case "Q": case "q":
_cardValue = 12;
break;
case "K": case "k":
_cardValue = 13;
break;
case "A": case "a":
_cardValue = 1;
break;
default:
if(!int.TryParse(input.substring(0, input.Length - 1), out _cardValue) || _cardValue < 2 || _cardVaue > 10)
throw new ArgumentException;
break;
}
}
public static Card Parse(string cardString)
{
return new Card(cardString);
}
Возможно, вы захотите добавить статический метод, который читает большую строку, yield return
карты при ее разборе, чтобы упростить кодирование нескольких карт.