python定义一个列表、模拟发牌_Python发牌案例几个问题求解答

importrandomclassCard(object):"""一张牌"""def__init__(self,suite,face):self._suite=suiteself._face=face@propertydefface(self):returnself._face@propertydefsuite(self):retu...

import random

class Card(object):

"""一张牌"""

def __init__(self, suite, face):

self._suite = suite

self._face = face

@property

def face(self):

return self._face

@property

def suite(self):

return self._suite

def __str__(self):

if self._face == 1:

face_str = 'A'

elif self._face == 11:

face_str = 'J'

elif self._face == 12:

face_str = 'Q'

elif self._face == 13:

face_str = 'K'

else:

face_str = str(self._face)

return '%s%s' % (self._suite, face_str)

def __repr__(self):

return self.__str__()

class Poker(object):

"""一副牌"""

def __init__(self):

self._cards = [Card(suite, face)

for suite in '♠♥♣♦'

for face in range(1, 14)]

self._current = 0

@property

def cards(self):

return self._cards

def shuffle(self):

"""洗牌(随机乱序)"""

self._current = 0

random.shuffle(self._cards)

@property

def next(self):

"""发牌"""

card = self._cards[self._current]

self._current += 1

return card

@property

def has_next(self):

"""还有没有牌"""

return self._current < len(self._cards)

class Player(object):

"""玩家"""

def __init__(self, name):

self._name = name

self._cards_on_hand = []

@property

def name(self):

return self._name

@property

def cards_on_hand(self):

return self._cards_on_hand

def get(self, card):

"""摸牌"""

self._cards_on_hand.append(card)

def arrange(self, card_key):

"""玩家整理手上的牌"""

self._cards_on_hand.sort(key=card_key)

# 排序规则-先根据花色再根据点数排序

def get_key(card):

return (card.suite, card.face)

def main():

p = Poker()

p.shuffle()

players = [Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')]

for _ in range(13):

for player in players:

player.get(p.next)

for player in players:

print(player.name + ':', end=' ')

player.arrange(get_key)

print(player.cards_on_hand)

if __name__ == '__main__':

main()

问题: 1. 33行为什么要调用__repr__()

2. 39行~40行怎么解释?

3. 84行~90行排序规则没看懂啊!

展开

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值