用Python编写扑克牌21点游戏程序设计。规则是:共54张扑克牌,各花色JQKA和大小王按1分计算,其他2~10各花色均按牌面实际分数计算。游戏者为A(即电脑)和B(即用户)二人,游戏开始B随机取得一张扑克牌,根据点数可决定是否要下一张。同时A也随机获得一张,并根据点数确定是否需要获取下一张。当A和B都不再要牌以后计算各自牌的分数和。超出20分均按21分计数,为输。否则与20差距越小的赢的点数越大。比较点数大的为赢家。 要求:实时显示B当前拥有的牌和总分数;显示结束时A和B各自的牌面和总分;显示比赛结果
时间: 2023-03-24 07:01:52 浏览: 463
21点扑克牌程序
以下是Python程序实现,其中包括各个部分的注释说明:
```python
import random
# 定义花色和数字的常量
SUITS = ['红桃', '方块', '黑桃', '梅花']
RANKS = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
# 定义牌的类
class Card:
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank
# 返回牌的面值
def value(self):
if self.rank in ['J', 'Q', 'K']:
return 10
elif self.rank == 'A':
return 11
else:
return int(self.rank)
# 返回牌的字符串表示
def __str__(self):
return self.suit + self.rank
# 定义牌堆的类
class Deck:
def __init__(self):
self.cards = []
for suit in SUITS:
for rank in RANKS:
self.cards.append(Card(suit, rank))
# 洗牌
def shuffle(self):
random.shuffle(self.cards)
# 从牌堆中取出一张牌
def deal_card(self):
return self.cards.pop()
# 定义玩家的类
class Player:
def __init__(self, name):
self.name = name
self.hand = []
# 增加一张牌到手牌
def add_card(self, card):
self.hand.append(card)
# 计算手牌总分
def hand_value(self):
value = sum(card.value() for card in self.hand)
# 如果手牌总分超过21分,尝试将所有A当做1分计算
for card in self.hand:
if card.rank == 'A' and value > 21:
value -= 10
return value
# 返回手牌的字符串表示
def __str__(self):
return '{}: [{}] ({})'.format(self.name, ', '.join(str(card) for card in self.hand), self.hand_value())
# 定义游戏的类
class Game:
def __init__(self):
self.deck = Deck()
self.deck.shuffle()
self.player = Player('B')
self.dealer = Player('A')
self.player.add_card(self.deck.deal_card())
self.dealer.add_card(self.deck.deal_card())
# 进行一轮游戏
def play(self):
# B取牌直到手牌总分达到17分或以上
while self.player.hand_value() < 17:
self.player.add_card(self.deck.deal_card())
# 判断B是否爆牌
if self.player.hand_value() > 21:
return '{} 爆牌,A获胜。'.format(self.player)
# A取牌直到手牌总分达到17分或以上
while self.dealer.hand_value() < 17:
self.dealer.add_card(self.deck.deal_card())
# 判断A是否爆牌
if self.dealer.hand_value() > 21:
return '{} 爆牌,
阅读全文