這一篇來加上玩家的分數計算與超過21點(爆牌)的判斷。
先在Card類別加上每張牌的數值
public class Card
{
public string Suit { get; set; } // 花色
public string SuitName { get; set; } // 花色名稱,為了顯示排堆時方便辨識
public int Rank { get; set; } // 點數
public int Seq { get; set; } // 順序
//**新增**
public int Value // 對應的數值
{
get
{
if (Rank == 1) //A計算分數時先當作11點
{
return 11;
}
else if (Rank > 10)
{ //JQK計算分數都是10點
return 10;
}
else
{
return Rank;
}
}
}
public Card(string suit, string SuitName, int rank) {
this.Suit = suit;
this.SuitName = SuitName;
this.Rank = rank;
} //建立類別
// 顯示卡片的文字表示
public override string ToString()
{
return $"{Rank} of {SuitName}";
}
}
再來在Player類別加上爆牌判斷
public class Player
{
public List<Card> cards { get; private set; }
public Player()
{
cards = new List<Card>();
Init();
}
public void Init()
{
cards.Clear();
}
public void AddCard(Card card)
{
cards.Add(card);
}
//**新增**
//計算手牌分數
public int CalculatePoints()
{
int points = 0;
int aceCount = 0; //A拿到次數
foreach (var card in cards)
{
points += card.Value;
if (card.Rank == 1) aceCount++;
}
// 調整A的值,以避免爆牌
while (points > 21 && aceCount > 0)
{
points -= 10;
aceCount--;
}
return points;
}
//**新增**
//判斷是否爆牌
public bool IsBusted()
{
return CalculatePoints() > 21;
}
}
最後要牌(Hit)按鈕按下後判斷玩家是否爆牌,若是爆牌,要牌(Hit)與停牌(Stand)按鈕無法使用。
protected void btn_hit_Click(object sender, EventArgs e)
{
DrawForPlayer();
//**新增***
//爆牌判斷
if (player.IsBusted())
{
lab_msg.Text = $"{player.CalculatePoints()}點,你爆掉了! 莊家贏!";
//牌局結束,不能再按發牌和停牌
btn_hit.Enabled = false;
btn_stand.Enabled = false;
btn_newgame.Enabled = true;
}
UpdateUI();
}
執行結果:
下一篇來設計停牌(Stand)按鈕事件(電腦要牌與莊家玩家的分數比較)。