用python实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)

1、namedtuple:命名元组,可以创建一个没有方法只有属性的类

from collections import namedtuple
card = namedtuple('card',['rank','suit'])  # rank 牌面大小,suit牌面的花色
# card其实就是namedtuple创建的一个类,其属性就是rank和suit
c1 = card(2,'红心 ')
# c1是实例化的对象
print(c1)
print(c1.suit)

运行结果:

card(rank=2, suit='红心 ')
红心2

2、按照循环顺序,通过对象[索引]任意取牌

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from collections import namedtuple
Card = namedtuple('Card',['rank','suit'])  # rank 牌面大小,suit牌面的花色
class FranchDeck:
    ranks = [str(n) for n in range(2,11)]+list('JQKA')
    suits = ['红心','方板','梅花','黑桃']
    def __init__(self):
        self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]
        # 嵌套循环,每循环一次都拿到一张牌,并且都会存到一个列表中,这个里面的牌是按照循环的顺序的
    def __getitem__(self, item):
        return self._cards[item]
    
deck = FranchDeck()
print(deck[10])  # 出现对象加索引的的取法就是触发__getitem__方法

运行结果:

Card(rank='4', suit='梅花')

Process finished with exit code 0

3、choice实现随机抽取一张纸牌的过程

from collections import namedtuple
Card = namedtuple('Card',['rank','suit'])  # rank 牌面大小,suit牌面的花色
class FranchDeck:
    ranks = [str(n) for n in range(2,11)]+list('JQKA')
    suits = ['红心','方板','梅花','黑桃']
    def __init__(self):
        self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]
        # 嵌套循环,每循环一次都拿到一张牌,并且都会存到一个列表中,这个里面的牌是按照循环的顺序的

    def __getitem__(self, item):
        return self._cards[item]

    def __len__(self):
        return len(self._cards)

# 实现按照循环循序抽取对应的纸牌
deck = FranchDeck()
print(deck[10])  # 出现对象加索引的的取法就是触发__getitem__方法

# 实现随机抽取一张牌的过程
from random import choice
print(choice(deck))  
# 注意:# choice能够实现随机抽取纸牌,必须得依赖__len__方法,如果前面没有定义__len__方法就会报错,
# 即只要用到choice就会触发__len__方法

运行结果:

Card(rank='A', suit='梅花')

Process finished with exit code 0

4、shuffle实现随机洗牌的过程

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from collections import namedtuple
Card = namedtuple('Card',['rank','suit'])  # rank 牌面大小,suit牌面的花色
class FranchDeck:
    ranks = [str(n) for n in range(2,11)]+list('JQKA')
    suits = ['红心','方板','梅花','黑桃']
    def __init__(self):
        self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]
        # 嵌套循环,每循环一次都拿到一张牌,并且都会存到一个列表中,这个里面的牌是按照循环的顺序的

    def __getitem__(self, item):
         return self._cards[item]

     def __len__(self):
         return len(self._cards)  # 传纸牌的长度,是从这么多张纸牌里面抽取

    def __setitem__(self, key, value): 
        self._cards[key] = value

deck = FranchDeck()
print(deck[10])
# 通过shuffle和__setitem__实现随机洗牌的过程,如果前面没有定义__setitem__方法同样会报错
# 因为随机洗牌的过程索引对应的牌就会发生改变,所以只能通过__setitem__去改变

from random import shuffle
shuffle(deck)
print(deck[10])

运行结果:

Card(rank='4', suit='梅花')
Card(rank='K', suit='红心')

总结:

以上纸牌游戏实现随机抽牌,洗牌的过程,仅仅只是用了内置的方法,并没有用我们自己定
义的方法就实现了,需要注意的是: __getitem__与对象[索引],__len__与choice,__setitem__与shuffle

必须同时结合使用

内置函数,内置模块,内置的基础类型<---->类的内置方法,比如:== <--->__eq__,len()<--->__len__

5、总代码----纸牌游戏随机取牌以及洗牌的过程

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 按照循环顺序,通过对象[索引]任意取牌
# choice实现随机抽取一张纸牌的过程
# shuffle实现随机洗牌的过程
import json
from collections import namedtuple
Card = namedtuple('Card',['rank','suit'])  # rank 牌面大小,suit牌面的花色
class FranchDeck:
    ranks = [str(n) for n in range(2,11)]+list('JQKA')
    suits = ['红心','方板','梅花','黑桃']
    def __init__(self):
        self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]
        # 嵌套循环,每循环一次都拿到一张牌,并且都会存到一个列表中,这个里面的牌是按照循环的顺序的

    def __getitem__(self, item):  # 通过对象[索引]进行触发
         return self._cards[item]

    def __len__(self):  # 通过choice进行触发
         return len(self._cards)  # 传纸牌的长度,是从这么多张纸牌里面抽取

    def __setitem__(self, key, value):  # 通过shuffle进行触发
        self._cards[key] = value

    def __str__(self):
         return json.dumps(self._cards,ensure_ascii=False)  # 序列化

deck = FranchDeck()

# 通过对象[索引]和__getitem__实现按照循环循序抽取对应的纸牌
print(deck[10])  # 出现对象加索引的的取法就是触发__getitem__方法

# 通过choice和__len__实现随机抽取一张牌的过程
from random import choice
print(choice(deck))
# choice能够实现随机抽取纸牌,必须得依赖内置的__len__方法,如果前面没有定义__len__方法就会报错
print(deck[10])

# 通过shuffle和__setitem__实现随机洗牌的过程
from random import shuffle
shuffle(deck)
print(deck[10])
print(deck)  # 需要进行序列化才可以

print(deck[:5])  # 直接利用对象进行切片

运行结果:

Card(rank='4', suit='梅花')
Card(rank='A', suit='红心')
Card(rank='4', suit='梅花')
Card(rank='A', suit='梅花')
[["6", "梅花"], ["9", "梅花"], ["3", "梅花"], ["9", "方板"], ["4", "方板"], ["Q", "红心"], ["7", "红心"], ["J", "黑桃"], ["8", "梅花"], ["J", "红心"], ["A", "梅花"], ["6", "黑桃"], ["Q", "方板"], ["4", "梅花"], ["10", "红心"], ["A", "红心"], ["4", "红心"], ["7", "方板"], ["5", "黑桃"], ["K", "黑桃"], ["2", "方板"], ["Q", "梅花"], ["2", "黑桃"], ["8", "黑桃"], ["J", "梅花"], ["A", "黑桃"], ["2", "红心"], ["6", "红心"], ["5", "红心"], ["J", "方板"], ["10", "方板"], ["K", "方板"], ["K", "红心"], ["3", "红心"], ["8", "红心"], ["8", "方板"], ["5", "方板"], ["K", "梅花"], ["9", "红心"], ["5", "梅花"], ["7", "黑桃"], ["3", "方板"], ["Q", "黑桃"], ["2", "梅花"], ["7", "梅花"], ["4", "黑桃"], ["9", "黑桃"], ["10", "梅花"], ["6", "方板"], ["3", "黑桃"], ["10", "黑桃"], ["A", "方板"]]
[Card(rank='6', suit='梅花'), Card(rank='9', suit='梅花'), Card(rank='3', suit='梅花'), Card(rank='9', suit='方板'), Card(rank='4', suit='方板')]
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,这个问题我可以回答。以下是一个简单的使用Python随机实现金花纸牌游戏发牌操作的程序: ```python import random # 定义牌面和花色 faces = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] suits = ['♠', '♥', '♣', '♦'] # 生成一副牌 deck = [(face, suit) for face in faces for suit in suits] # 洗牌 random.shuffle(deck) # 发牌 player1 = [deck.pop() for _ in range(3)] player2 = [deck.pop() for _ in range(3)] player3 = [deck.pop() for _ in range(3)] # 输出结果 print("Player 1:", player1) print("Player 2:", player2) print("Player 3:", player3) ``` 这个程序会生成一副牌,然后使用`random.shuffle()`函数洗牌,最后使用列表推导式将牌分配给三个玩家。输出结果如下: ``` Player 1: [('J', '♠'), ('A', '♠'), ('Q', '♦')] Player 2: [('3', '♦'), ('4', '♠'), ('K', '♣')] Player 3: [('7', '♦'), ('2', '♣'), ('6', '♥')] ``` 希望这个程序能够帮到你! ### 回答2: 金花纸牌游戏是一种非常受欢迎的扑克牌游戏,可以使用Python随机库来实现发牌操作。下面是一个简单的程序示例: ```python import random def get_card(): suits = ['红桃', '方块', '黑桃', '梅花'] numbers = list(range(1, 14)) cards = [f'{suit}{number}' for suit in suits for number in numbers] # 构建一副牌 random.shuffle(cards) # 打乱牌的顺序 return cards.pop() # 取一张牌 def deal_cards(num_players): players = [[] for _ in range(num_players)] # 初始化每个玩家的牌 for _ in range(3): for i in range(num_players): card = get_card() players[i].append(card) # 将牌发给每个玩家 return players num_players = 4 # 假设有4个玩家 players = deal_cards(num_players) for i in range(num_players): print(f'玩家{i+1}的牌:{players[i]}') ``` 以上程序中,我们首先定义了一个`get_card`函数来获取随机一张牌。使用嵌套的循环来生成一副牌,然后使用`random.shuffle`函数打乱牌的顺序,最后使用`pop`方法取出一张牌,实现了抽取随机一张牌的功能。 接着,我们定义了一个`deal_cards`函数来实现发牌操作。通过传入玩家数量,创建了一个二维列表来表示每个玩家的牌,然后使用双重循环,依次将每轮发的牌分给每个玩家。 最后,我们定义了一个变量`num_players`表示玩家数量,并调用`deal_cards`函数将牌发给每个玩家。然后通过遍历每个玩家的牌列表,打印出每个玩家的牌。 这样,我们就用Python随机实现了金花纸牌游戏的发牌操作。 ### 回答3: 金花纸牌游戏是一种非常流行的扑克牌游戏,它需要发牌来开始游戏。我们可以用Python编写一个程序,使用随机实现金花纸牌游戏的发牌操作。 首先,我们需要引入random库来实现随机发牌。然后,我们可以定义一个包含所有扑克牌的列表,比如["红桃A", "红桃2", ... "黑桃K"]。接下来,我们可以使用random库的shuffle函数对扑克牌列表进行洗牌操作。 当洗牌完成后,我们可以根据游戏规则确定每个玩家所需要的牌数。一般来说,金花纸牌游戏每位玩家会发三张牌。我们可以创建三个空列表,分别代表三位玩家的手牌。 接下来,我们可以使用一个for循环来遍历扑克牌列表,并用range函数来限制循环次数。在循环中,我们可以使用random库的choice函数随机选取一张牌,并将其添加到玩家手牌列表中。每次循环结束后,我们可以将已经发给玩家的牌从扑克牌列表中移除。 当循环结束后,我们就完成了发牌操作。玩家手牌列表中存储的就是每个玩家的牌。我们可以将结果打印出来,以便玩家可以看到自己的牌。 这就是用Python编写的一个简单的金花纸牌游戏发牌程序。通过使用随机库和一些基本的操作,我们可以模拟出发牌的效果,并实现金花纸牌游戏的发牌操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值