Python之经典案例---扑克发牌程序

目录

 

1、 用Card类表示一张牌

2、 用Hand表示一个牌手(玩家)

3、用poke类表示一幅牌,可以看做拥有全部54张牌的牌手

4、发牌主程序

5、测试结果


1、 用Card类表示一张牌

# 一张牌的抽象
class Card():
    """A playing card"""

    RANKS = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']
    SUITS = ['梅','方','红','黑']

    def __init__(self, rank, suit, face_up = True):
        self.rank = rank
        self.suit = suit
        self.is_face_up = face_up

    def __str__(self):
        if self.is_face_up:
            rep = self.suit + self.rank
        else:
            rep = "XX"
        return rep

    def pic_oder(self):         # 牌的顺序号
        if self.rank == 'A':
            FaceNum = 1
        elif self.rank == 'J':
            FaceNum = 11
        elif self.rank == 'Q':
            FaceNum = 12
        elif self.rank == 'K':
            FaceNum = 13
        else:
            FaceNum = int(self.rank)

        if self.suit == '梅':
            suit_num = 1
        elif self.suit == '方':
            suit_num = 2
        elif self.suit == '红':
            suit_num = 3
        else:
            suit_num = 4
        return (suit_num -1) *13 + FaceNum

    def flip(self):             # 翻牌方法
        self.is_face_up = not self.is_face_up

申明的类属性:RANKS 和SUITS 是两个列表,分别代表牌的点数和花色。牌的点数和花色是确定的,点数 A,2,3,4,5,6,7,8,9,10,J,Q,K一共13种,花色只有梅花、红桃、方片、黑桃四种。故而,列表的内容是可以确定的。

构造函数:def __init__(self, rank, suit, face_up=True) ,用来实例化一个对象时初始化设置私有属性。一张牌的属性有3个:点数、花色和是否翻面。注意:face_up这个参数的缺省值是True,这样调用构造函数初始化时可以不传递face_up的值,使用默认值True。

下面这种写法好奇怪,是什么意思?下划线代表什么?
def __init__(self, rank, suit, face_up=True):
    self.rank = rank
    self.suit = suit
    self.is_face_up = face_up

初次接触Python确实有点别扭,函数定义方式与java、c++等面向对象的编程语言略有不同,形式上有差别,根本上还是一致的,你依旧能找到函数名、参数列表和函数体。多写几次就习惯了,刚开始感觉别扭是正常的。

python的函数定义如果函数名前后都有"__",注意是两个下划线,表示这是私有方法。他不能通过对象名直接调用。python中定义函数以def开始,紧跟函数名,然后是参数列表,参数列表后面是":",这个冒号代替了其他编程语言中的{ }。

2、 用Hand表示一个牌手(玩家)

class Hand():
    """A hand of palying cards"""

    def __init__(self):
        self.cards = []

    def __str__(self):
        if self.cards:
            rep = ''
            for card in self.cards:
                rep += str(card) + "\t"
        else:
            rep = "无牌"
        return rep

    def clear(self):
        self.cards = []

    def add(self, card):
        self.cards.append(card)

    def give(self, card, other_hand):    # 把一张牌给其他牌手
        self.cards.reve(card)
        other_hand.add(card)

对一个牌手来说,必定要定义一个空的列表用来存放手里的cards。

方法:1、add---增加牌;

2、clear---清空手中的牌;

3、give---把手中的牌交给其他牌手。 

3、用poke类表示一幅牌,可以看做拥有全部54张牌的牌手

# from Hand import Hand
# from Card import Card
# Poke 类
from pokers.Card import Card
from pokers.Hand import Hand


class Poke(Hand):
    """a deck of playing cards"""

    def populate(self):          # 生成一幅牌
        for suit in Card.SUITS:
            for rank in Card.RANKS:
                self.add(Card(rank, suit))

    def shuffle(self):           # 洗牌
        import random
        random.shuffle(self.cards)   # 打乱牌的顺序

    def deal(self, hands, per_hand):
        for rounds in range(per_hand):
            for hand in hands:
                if self.cards:
                    top_card = self.cards[0]
                    self.cards.remove(top_card)
                    hand.add(top_card)
                else:
                    print('不能继续发牌了,牌已经发完了!')

Poke类是对一幅牌的抽象,它可以被看做是拥有全部54张的牌手,所以继承了Hand类。 

4、发牌主程序

# 主程序
from pokers.Hand import Hand
from pokers.Poke import Poke

if __name__ == "__main__":
    print('This is a module with classes for playing cards')
    # 4个玩家
    players = [Hand(), Hand(), Hand(), Hand()]
    poke1 = Poke()
    poke1.populate()
    poke1.shuffle()
    poke1.deal(players, 13)
    # 显示4个牌手的牌
    n = 1
    for hand in players:
        print("牌手 " , n ,end=':')
        print(hand)
        n = n+1
    input("\nPress the enter ket to exit")

5、测试结果

This is a module with classes for playing cards
牌手  1:方A	方10	红J	红5	方3	红9	黑7	梅Q	黑K	梅2	梅3	梅J	方7	
牌手  2:黑6	梅A	方2	梅6	梅9	梅K	红3	方6	黑5	红6	黑Q	红2	方4	
牌手  3:梅4	方5	红K	黑2	红8	红A	梅5	红10	方Q	梅8	黑J	梅10	黑8	
牌手  4:红7	黑A	黑4	黑10	黑9	红Q	方J	方8	梅7	红4	方9	黑3	方K

 

  • 1
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,您的问题是如何用Python实现一个交互式界面的扑克发牌程序。下面是一个简单的实现示例,您可以参考一下: ```python import random import tkinter as tk # 创建扑克牌的列表 suits = ['♠', '♥', '♦', '♣'] ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] deck = [rank + suit for suit in suits for rank in ranks] # 创建交互式界面 root = tk.Tk() root.title('扑克发牌程序') canvas = tk.Canvas(root, width=800, height=600) canvas.pack() # 创建玩家和底牌的标签 player_label = tk.Label(root, text='玩家:') player_label.place(x=50, y=50) deck_label = tk.Label(root, text='底牌:') deck_label.place(x=50, y=100) # 创建发牌按钮,点击后随机发一张牌给玩家或底牌 def deal_card(): card = random.choice(deck) deck.remove(card) if len(player_cards) < 5: player_cards.append(card) player_card_label.config(text=' '.join(player_cards)) else: deck_cards.append(card) deck_card_label.config(text=' '.join(deck_cards)) deal_button = tk.Button(root, text='发一张牌', command=deal_card) deal_button.place(x=50, y=150) # 创建玩家和底牌的显示标签 player_card_label = tk.Label(root, text='', font=('Arial', 20)) player_card_label.place(x=150, y=50) deck_card_label = tk.Label(root, text='', font=('Arial', 20)) deck_card_label.place(x=150, y=100) # 初始化玩家和底牌的牌组 player_cards = [] deck_cards = [] root.mainloop() ``` 这个程序使用了Tkinter库创建了一个交互式界面,包括一个发牌按钮和两个标签用于显示玩家和底牌的牌组。点击发牌按钮后,程序会随机从扑克牌列表中选取一张牌,并将其从列表中删除。如果玩家的牌组还没有满5张,则将这张牌加入玩家的牌组中,并更新玩家牌组的显示标签;否则,将这张牌加入底牌的牌组中,并更新底牌牌组的显示标签。 您可以根据自己的需求进行修改和扩展,比如增加计分功能、添加更多的按钮和标签等等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值