未使用属性 - 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、HandValue
和 HandRating
中都有 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;
}
}
}
我目前正在编写一个 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、HandValue
和 HandRating
中都有 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;
}
}
}