Python解决斗地主发牌问题及列表基础知识运用

Python解决斗地主发牌问题及列表基础知识运用

​ 用一张列表保存54张扑克牌,洗牌,按斗地主的发牌方式把牌
发给三个玩家,多的三张牌给第一个玩家,把每个玩家手上的牌显示出来。

​ 我们运用前面所学的列表与循环分支结构知识求解。

方法一

  • shuffle()是库random中的函数其作用为乱序,打乱顺序。
#首先我们要获得一副扑克牌
import random
cards = []#一次一次录入会比较麻烦
suites = ['♥','♦','♠','♣']# 没图形的可以输入字符表示如:方块
faces = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
for suite in suites:#做两次for循环每个花色与牌色对应
    for face in faces:
        #print(f'{suite}{face}',end=' ')
        cards.append(f'{suite}{face}')#把牌放入card
#把大小王加入其中
cards.append('大王')
cards.append('小王')
print(cards)  #获得一副新牌
random.shuffle(cards)#洗牌(随机乱序)
#做三个玩家空列表 把每次发到的牌放到对应的玩家空列表中
players_one = []
players_two = []
players_three = []
#开始发牌,每人17张
for _ in range(1,18):
    players_one.append(cards.pop())
    players_two.append(cards.pop())
    players_three.append(cards.pop())
'''函数pop()默认删除的是列表cards的最后一个元素,pop删除的过程中还会返回其删除的元素,再利用append追加到每个玩家空列表中,如要从前面发牌则用pop(0)'''
players_one.extend(cards)#extend()扩展合并,把最后三张牌拼接到第一个玩家(地主)
print(f'地主牌为{players_one}')
print(f'农民1{players_two})')
print(f'农民2{players_three}')

在这里插入图片描述

方法二

运用列表切片索引知识解决问题

import random
cards = []#一次一次录入会比较麻烦
suites = ['♥','♦','♠','♣']# 没图形的可以输入字符表示如:方块
faces = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
for suite in suites:#做两次for循环每个花色与牌色对应
    for face in faces:
        #print(f'{suite}{face}',end=' ')
        cards.append(f'{suite}{face}')#把牌放入card
#把大小王加入其中
cards.append('大王')
cards.append('小王')
print(cards)  #获得一副新牌
random.shuffle(cards)#洗牌(随机乱序)


# 与上一种方法不一样的是发牌的方式
# 开始发牌,每人17张
player_one = cards[1:52:3] #步长为3表示每人一张
players_two = cards[2:52:3]
player_three = cards[3:52:3]
last = cards[51:]   #最后三张放为一个集合
player_one = player_one + last  #把最后三张给地主
#也可以用函数extend()扩展合并
print(player_one)
print(players_two)
print(player_three)

方法三

与前两种方法不一样的是,这里我们将会用到嵌套列表

可以改变玩家的数量与玩牌的方式,比如 三个人玩炸金花

嵌套列表如:nums = [ [], [], [], [] ]

相当于大盒子里面再放一些小盒子

import random
cards = []#一次一次录入会比较麻烦
suites = ['♥','♦','♠','♣']# 没图形的可以输入字符表示如:方块
faces = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
for suite in suites:#做两次for循环每个花色与牌色对应
    for face in faces:
        #print(f'{suite}{face}',end=' ')
        cards.append(f'{suite}{face}')#把牌放入card
#把大小王加入其中
cards.append('大王')
cards.append('小王')
print(cards)  #获得一副新牌
random.shuffle(cards)#洗牌(随机乱序)

players = [[] for _ in range(3)] #可改变范围规定参与人数
for _ in range(3):#改变范围规定发牌数
    for player in players:# 遍历循环玩家,循环发牌
        player.append(porke_nums.pop())
for player in players: # 遍历循环玩家,整理发到手上的扑克
    player.sort(key=lambda x: x[1:])
    for card in player:# 循环输出玩家手里的扑克
        print(card, end=' ')
    print()

在这里插入图片描述

你可能感兴趣的:(python)