未使用属性 - BlackJack 项目(始终相同!false!结果但应该不同)

Properties are not being used - BlackJack Project (always same !false! result but it should be different)

我目前正在编写一个 BlackJack 游戏,现在我正处于 HAND 的 Sprint,问题是 Hand 有一个 HandVALUE 和一个 HandRATING。此值或评级表示 Handsproperties 或字段。问题是(你会在代码中看到更多)当我在 Console.NetFramework (UI) 中创建一个新的 HAND 并键入 Console.WriteLine(Console.WriteLine("The Value of the hand is: " + hand.HandValue); 或 Console.WriteLine("The Rating of the hand is: " + 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);

手牌class和最后一手牌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,
}

为了使代码正常工作,需要更改一些内容:

Hand class、HandValueHandRating 中都有 setter 什么都不做,应该重构为:

public int HandValue { get; private set; }
public HandRating HandRating { get; private set; }

同时,删除不需要的 _handValue_handRating 字段,并替换为上面的属性。

CalculateHandValue()中,有一个错误引入了IndexOutOfRange异常(for循环中的<=应该是<)。 CalculateHandValue() 可以重构为使用 foreach 循环,如下所示:

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(),它将使用 HandRating setter 中的大部分逻辑,但要进行修改以确保不会 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;
    }
}

注意每个 if 块中的 _cardsInHand.Count 子句,以确保我们在评估之前拥有正确数量的手牌。

最后,在AddCard中添加如下内容:

public void AddCard(ICard card)
{
    _cardsInHand.Add(card);
    CalculateHandValue();
    CalculateHandRating();
}

class 应该是这样的:

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