Свойства не используются - проект BlackJack (всегда один и тот же! Ложный! Результат, но он должен быть другим) - PullRequest
0 голосов
/ 29 апреля 2020

В настоящее время я кодирую игру в Блэкджек, и теперь я нахожусь в Спринте за РУКУ, и дело в том, что у Руки есть HandVALUE и HandRATING. Это значение или рейтинг представляют Handsproperties или поля. Проблема в том, что (вы увидите это больше в коде), когда я создаю новый HAND в Console.NetFramework (UI) и набираю Console.WriteLine (Console.WriteLine («Значение руки:» + рука). HandValue); или Console.WriteLine ("Рейтинг раздачи:" + hand.HandRating); они всегда равны 0 и None. 0 = HandValue, и None - это HandRating. Но они должны иметь другие значения и рейтинги, потому что ( как вы увидите в коде) есть 3 карты со значением 7 каждая = HANDVALUE: 21, и HandRating должен быть TripleSeven (потому что у нас есть 3 карты с 7 значениями) .Свойства должны быть использованы и должны установить HandValue и HandRating. (Код очень кратко показан здесь. Если бы я что-то оставил позади, никто бы не понял проблему и конструкции кода)

Console.WriteLine("HAND - TESTS");
Hand hand = new Hand();
Console.WriteLine("First, output of the cards in the hand at the beginning. If their is nothing to see, the test" +
    "is positive.");
ICard card3 = new Card(CardValue.Seven, CardSuit.Heart);
ICard card4 = new Card(CardValue.Seven, CardSuit.Spade);
ICard card5 = new Card(CardValue.Seven, CardSuit.Diamond);

Console.WriteLine("");
Console.WriteLine("Press <ENTER> to add one card to the hand:");
Console.ReadLine();
hand.AddCard(card3);
Console.WriteLine("If there is only one card ---> then this hand function is working.");
hand.CardsInHandConsole();

Console.WriteLine("Press <ENTER> to add the next card:");
Console.ReadLine();
hand.AddCard(card4);
hand.AddCard(card5);
Console.WriteLine("If there are 3 cards ---> then this hand function is working.");
hand.CardsInHandConsole();
Console.WriteLine("Press <ENTER> to continue:");
Console.ReadLine();
Console.WriteLine("The Value of the hand is: " + hand.HandValue);
Console.WriteLine("The Rating of the hand is: " + hand.HandRating);

Класс рук и последний вариант ENUM HandRating:

public class Hand
{
    private List<ICard> _cardsInHand = new List<ICard>();
    private int _handValue;
    private HandRating _handRating;


    public int HandValue
    {
        get
        {
            return _handValue;
        }
        set
        {
            CalculateHandValue();
        }
    }

    public HandRating HandRating
    {
        get
        {
            return _handRating;
        }
        set
        {
            //TripleSeven
            if (_cardsInHand[0].Value == CardValue.Seven &&
                _cardsInHand[1].Value == CardValue.Seven && 
                _cardsInHand[2].Value == CardValue.Seven)
            {
                _handRating = HandRating.TripleSeven;

            }
            //BlackJack
            else if (_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;

            }

        }
    }

    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);
    }

    public void ClearHand()
    {
        _cardsInHand.Clear();
        _handValue = 0;
        _handRating = HandRating.None;
    }

    private void CalculateHandValue()
    {
        for (int i = 0; i <= _cardsInHand.Count(); i++)
        {
            ReturnValue(i);
        }
    }

    public void ReturnValue(int index)
    {
        if (_cardsInHand[index].Value == CardValue.Two)
        {
            _handValue =+2;
        }
        else if (_cardsInHand[index].Value == CardValue.Three)
        {
            _handValue =+3;
        }
        else if (_cardsInHand[index].Value == CardValue.Four)
        {
            _handValue =+4;
        }
        else if (_cardsInHand[index].Value == CardValue.Five)
        {
            _handValue =+5;
        }
        else if (_cardsInHand[index].Value == CardValue.Six)
        {
            _handValue =+6;
        }
        else if (_cardsInHand[index].Value == CardValue.Seven)
        {
            _handValue =+7;
        }
        else if (_cardsInHand[index].Value == CardValue.Eight)
        {
            _handValue =+8;
        }
        else if (_cardsInHand[index].Value == CardValue.Nine)
        {
            _handValue =+9;
        }
        else if (_cardsInHand[index].Value == CardValue.Queen)
        {
            _handValue =+10;
        }
        else if (_cardsInHand[index].Value == CardValue.King)
        {
            _handValue =+10;
        }
        else if (_cardsInHand[index].Value == CardValue.Jack)
        {
            _handValue =+10;
        }
        else if (_cardsInHand[index].Value == CardValue.Ace)
        {
            if ((_handValue + 11) > 21)
            {
                _handValue =+1;
            }
            else
            {
                _handValue =+11;
            }
        }
    }
    #endregion
}

public enum HandRating
{
  BlackJack,
  TripleSeven,
  Busted,
  None,
}

1 Ответ

0 голосов
/ 29 апреля 2020

Есть пара вещей, которые необходимо изменить, чтобы заставить код работать:

В классе 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;
        }
    }
}
...