21点的C#窗体应用程序,可以吗(要求显示出真实的扑克牌面),可以显示谁获胜,对面的牌显示为扑克牌图像反面,不要牌时,对面扑克牌良出来,可以看到自己的扑克牌(图像)
时间: 2025-06-21 08:26:54 浏览: 8
### 如何使用C# WinForms 开发21点纸牌游戏
#### 游戏界面设计
为了实现一个可以显示真实扑克牌面并能处理基本逻辑的21点游戏,在WinForms中可以通过PictureBox控件来加载和切换不同的图像资源,用于表示各种花色和数值组合而成的真实大小比例下的扑克牌正面图案以及背面遮挡状态。
对于胜利条件判断部分,则可以在每次玩家操作之后立即评估当前手牌总分是否超过21点或是达到特定胜局情况;当玩家决定不再要新牌时(即“停牌”),应当立即将之前被隐藏起来的庄家那张底牌翻转过来公开给玩家查看[^1]。
```csharp
// 定义卡片类
public class Card {
public string Face { get; set; } // 牌面值 (A, K, Q...)
public string Suit { get; set; } // 花色 (Hearts, Spades...)
private Image _image;
/// <summary>
/// 获取或设置卡牌对应的图片对象.
/// </summary>
public Image Image {
get => this._image ??= LoadCardImage();
set => this._image = value;
}
private Image LoadCardImage() {
var imagePath = $"cards/{this.Face}_{this.Suit}.png";
return Image.FromFile(imagePath);
}
}
```
#### 显示真实的扑克牌面
通过预先准备一套完整的PNG格式扑克牌素材文件夹`cards/`, 文件命名遵循统一规则如 `Ace_Heart.png` 表示红心A。每当需要更新界面上某位置处所代表的具体哪一张具体牌型变化时就调用相应 PictureBox 的 `.Image` 属性赋值为对应实例化的 `Card.Image`.
#### 判断胜负机制
定义两个列表分别保存玩家与电脑的手牌数据结构,并编写函数计算每一轮结束后的得分状况:
```csharp
private List<Card> playerHand = new List<Card>();
private List<Card> dealerHand = new List<Card>();
/// <summary>
/// 计算一手牌的价值.
/// </summary>
/// <param name="hand">待计分手牌.</param>
/// <returns></returns>
private int CalculateHandValue(List<Card> hand) {
int aceCount = 0;
int totalScore = 0;
foreach(var card in hand){
switch(card.Face.ToUpper()){
case "J":
case "Q":
case "K":
totalScore += 10;
break;
default:
if(int.TryParse(card.Face,out int faceValue)){
totalScore+=faceValue;
}else{
++aceCount;
totalScore+=11;
}
break;
}
}
while(totalScore > 21 && aceCount > 0){
--totalScore;
--aceCount;
}
return Math.Min(21,totalScore);
}
/// <summary>
/// 更新UI上的分数显示.
/// </summary>
private void UpdateScores(){
lblPlayerScore.Text=$"Your Score:{CalculateHandValue(playerHand)}";
lblDealerScore.Text=$"Dealer's Score:{dealerHand.Count==0?"Hidden":CalculateHandValue(dealerHand).ToString()}";
}
```
#### 玩家不要牌后展示对手的牌背图片
在用户点击按钮表达其不想再继续抽取更多牌的情况下,应该触发事件处理器去执行以下动作序列:先锁定所有输入控制防止重复提交请求,接着揭示先前未完全暴露过的那一方剩余未知数目的全部底牌信息,最后依据双方最终累积得到的有效积分高低裁定谁赢谁输并将结果反馈至前端视图层呈现出来。
```csharp
private void btnStay_Click(object sender, EventArgs e){
// 锁定按钮以防误触
btnHit.Enabled=false;
btnStay.Enabled=false;
// 揭示庄家底牌
picBoxDealerFirstCard.Image=dealerHand.First().Image;
UpdateScores();
// 比较两者的成绩以确定赢家
int playerTotal=CalculateHandValue(playerHand);
int dealerTotal=CalculateHandValue(dealerHand);
MessageBox.Show(
$"{Environment.NewLine}You scored {playerTotal}, Dealer got {dealerTotal}.{Environment.NewLine}" +
((playerTotal<=21&&playerTotal>=dealerTotal)||(dealerTotal>21)) ? "Congratulations! You win!" : "Sorry, you lost."
);
}
```
阅读全文
相关推荐

















