21点(BlackJack)扑克游戏,挑战用100行代码实现
本人平时喜欢与朋友们玩玩21点与德州扑克,特别是看了《决胜21点》后,很想自己写一款简单的21点游戏。趁着清明节小长假闲来无事在家中试着实现了一下。感兴趣的朋友可以和我一起练习!
首先我做的,就是把实现的路径规划下来,以下就是我的大致思路:
- 将游戏规则写下来
- 将规则编程化
一. 21点游戏规则
1. 四种花色,13张牌,共52张牌。然而在21点游戏中,花色没有任何权重,也没有孰强孰弱之分,所以其实就是A,2,3,4,5,6,7,8,9,10,10(J),10(Q),10(K)乘以4
2. A比较特殊,可以算作是1,也可以算作是11,要看情况来区别对待
3. Dealer进行发牌,给选手发两张牌,给自己发两张牌,选手看得到Dealer的其中一张牌
4. 选手选择是否要牌,如果要,系统发一张牌,直到爆掉之前,选手可以一直要牌
5. 选手选择是否要牌,如果不要,dealer继续给自己发牌。直到爆牌或者到21点,不到17一直要牌
二. 将规则编程化
- 首先我们看第一个规则,“四种花色,13张牌,共52张牌。然而在21点游戏中,花色没有任何权重,也没有孰强孰弱之分,所以其实就是A,2,3,4,5,6,7,8,9,10,10(J),10(Q),10(K)乘以4”。我们建立一个牌库。我们将牌库命名为cards,并且暂且先把A当成是11点。
cards = [
11,2,3,4,5,6,7,8,9,10,10,10,10,
11,2,3,4,5,6,7,8,9,10,10,10,10,
11,2,3,4,5,6,7,8,9,10,10,10,10,
11,2,3,4,5,6,7,8,9,10,10,10,10
]
- “A比较特殊,可以算作是1,也可以算作是11,要看情况来区别对待”。于是,我们为A牌专门创建一个规则。
def player_if_ace(player_cards):#判断玩家/庄家手中是否有A牌
if 11 in player_cards:#假设玩家/庄家拿到了A牌(之前我们将A预先设置成了11点)
if sum(player_cards) > 21:#当玩家/庄家的所有手牌相加超过了21点,那自然就要把11点往下降变成1点,从而避免爆牌
location = player_cards.index(11)#在list中找到玩家/庄家的11点所在的位置
player_cards[location] = 1#找到list中的11点,并替换成1点
return player_cards#将新的1点返回到玩家/庄家手牌中
else:
return player_cards#如果手牌相加并没有到21点,则A保持11点
else:
return player_cards#如果玩家/庄家并没有A,则保持现状
- “Dealer进行发牌,给选手发两张牌,给自己发两张牌,选手看得到Dealer的其中一张牌”
player_cards = [random.choice(cards), random.choice(cards)]#玩家的两张手牌随机生成
player_cards = player_if_ace(player_cards)#判断手牌中是否有A,再进行新的定义
dealer_cards = [random.choice(cards), random.choice(cards)]#庄家的两张手牌随机生成
dealer_cards = player_if_ace(dealer_cards)#判断手牌中是否有A,再进行新的定义
系统进行提示,告诉我们自己的两张牌是什么,相加后是什么,并且和我们说庄家的其中一张牌是什么
print('******* 游戏开始,你的牌是:' + str(player_cards[0]) + '和'
+ str(player_cards[1]) +