Есть пара вещей, которые необходимо изменить, чтобы заставить код работать:
В классе Hand
, HandValue
и HandRating
оба имеют сеттеры, которые ничего не делают, и должен иметь следующий вид:
public int HandValue { get; private set; }
public HandRating HandRating { get; private set; }
В то же время удалите поля _handValue
и _handRating
, так как они не обязательны, и замените их указанными выше свойствами.
In CalculateHandValue()
, есть ошибка, которая вводит исключение IndexOutOfRange
(<= в для l oop должно быть <). <code>CalculateHandValue() может быть реорганизован для использования foreach l oop, как показано ниже:
private void CalculateHandValue()
{
foreach (var card in _cardsInHand)
{
ReturnValue(card);
}
}
ReturnValue()
не охватывает все значения карт (например, 7, который использовался в ваша консоль. Кроме того, приращение было сделано неправильно (должно быть + = 2 вместо = +2). Так будет выглядеть, если мы добавим новый вариант использования и исправим приращение:
private void ReturnValue(ICard card)
{
if (card.Value == CardValue.Two)
{
HandValue += 2;
}
else if (card.Value == CardValue.Three)
{
HandValue += 3;
}
else if (card.Value == CardValue.Four)
{
HandValue += 4;
}
else if (card.Value == CardValue.Seven)
{
HandValue += 7;
}
}
Я оставлю это на ваше усмотрение, чтобы заполнить остальные значения рук, и, возможно, рассмотрим преобразование его в оператор switch
.
Создайте новый метод CalculateHandRating()
, который будет используйте большую часть logi c от установщика HandRating
, но с изменениями, чтобы гарантировать, что не произойдет IndexOutOfRangeException
:
private void CalculateHandRating()
{
//TripleSeven
if (_cardsInHand.Count == 3 &&
_cardsInHand[0].Value == CardValue.Seven &&
_cardsInHand[1].Value == CardValue.Seven &&
_cardsInHand[2].Value == CardValue.Seven)
{
HandRating = HandRating.TripleSeven;
}
//BlackJack
else if (_cardsInHand.Count == 2 &&
_cardsInHand[0].Value == CardValue.Jack &&
_cardsInHand[1].Value == CardValue.Ace)
{
HandRating = HandRating.BlackJack;
}
//Busted
else if (HandValue > 21)
{
HandRating = HandRating.Busted;
}
//None
else
{
HandRating = HandRating.None;
}
}
Обратите внимание на предложения _cardsInHand.Count
в каждом блоке if для перед оценкой убедитесь, что у нас в руках правильное количество карт.
Наконец, в AddCard
добавьте следующее:
public void AddCard(ICard card)
{
_cardsInHand.Add(card);
CalculateHandValue();
CalculateHandRating();
}
Класс должен выглядеть следующим образом :
public class Hand
{
private List<ICard> _cardsInHand = new List<ICard>();
public int HandValue { get; private set; }
public HandRating HandRating { get; private set; }
public IEnumerable<ICard> CardsInHand
{
get
{
return _cardsInHand;
}
}
public void CardsInHandConsole()
{
foreach (ICard card in _cardsInHand)
{
Console.WriteLine(card.ToString());
}
}
public void AddCard(ICard card)
{
_cardsInHand.Add(card);
CalculateHandValue();
CalculateHandRating();
}
public void ClearHand()
{
_cardsInHand.Clear();
HandValue = 0;
HandRating = HandRating.None;
}
private void CalculateHandValue()
{
foreach (var card in _cardsInHand)
{
ReturnValue(card);
}
}
private void CalculateHandRating()
{
//TripleSeven
if (_cardsInHand.Count == 3 &&
_cardsInHand[0].Value == CardValue.Seven &&
_cardsInHand[1].Value == CardValue.Seven &&
_cardsInHand[2].Value == CardValue.Seven)
{
HandRating = HandRating.TripleSeven;
}
//BlackJack
else if (_cardsInHand.Count == 2 &&
_cardsInHand[0].Value == CardValue.Jack &&
_cardsInHand[1].Value == CardValue.Ace)
{
HandRating = HandRating.BlackJack;
}
//Busted
else if (HandValue > 21)
{
HandRating = HandRating.Busted;
}
//None
else
{
HandRating = HandRating.None;
}
}
private void ReturnValue(ICard card)
{
if (card.Value == CardValue.Two)
{
HandValue += 2;
}
else if (card.Value == CardValue.Three)
{
HandValue += 3;
}
else if (card.Value == CardValue.Four)
{
HandValue += 4;
}
else if (card.Value == CardValue.Seven)
{
HandValue += 7;
}
}
}