中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Python中怎么實現(xiàn)隨機抽牌、排序、洗牌功能

Python 中怎么實現(xiàn)隨機抽牌、排序、洗牌功能,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

站在用戶的角度思考問題,與客戶深入溝通,找到肥鄉(xiāng)網(wǎng)站設(shè)計與肥鄉(xiāng)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋肥鄉(xiāng)地區(qū)。

創(chuàng)建一個紙牌類

一副撲克除去大王小王之外,剩下的 52 張紙牌以花色為基準(梅花、方塊、黑桃、紅心)可分為 4 組,每組有 13 張牌組成;因此可創(chuàng)建兩個列表一個來存儲花色,一個存儲 13 個字符;通過兩個列表之間的隨機組合來生成 52 張紙牌,

代碼如下:

import collections

Card = collections.namedtuple("Card",['rank','suit'])

class FrenchDeck:
    ranks = [str(n) for n in range(2,11) ] + list("JQKA")
    suits = 'spades diamonds clubs hearts'.split()
    
    def __init__(self):
        self._cards = [Card(rank,suit) for suit in self.suits 
                       for rank in self.ranks]
    
    def __len__(self):
        return len(self._cards)
    
    def __getitem__(self, position):
        return self._cards[position]

代碼中通過 collections.namedtuple 模塊創(chuàng)建一個類來表示一幅紙牌,[’rank','suit'] 分別表示紙牌中的字符(2-10,J-A)和花色;

FranchDeck 類來建 52 張紙牌,其中有兩個特殊方法,len() 返回紙牌數(shù)量,__getitem__() 獲取 position(索引) 下的指定紙牌

# 用 Card 創(chuàng)建一張紙牌
beer_card = Card('7','diamonds')
print(beer_card) # 打印輸出

deck = FrenchDeck()
print('len is -----')
print(len(deck))

# 返回首張 紙牌
print(deck[0])

# 返回最后一張紙牌
print(deck[-1])


# Output

Card(rank='7', suit='diamonds')
len is -----
52
Card(rank='2', suit='spades')
Card(rank='A', suit='hearts')

隨機抽取一張牌

這里借助 random 模塊實現(xiàn) 隨機 抽牌的功能

from random import choice
# 利用 random.choice 隨機抽取一張紙牌
print("random choice -----------")
print(choice(deck))

print(choice(deck))
print(choice(deck))

# Output

random choice -----------
Card(rank='8', suit='clubs')
Card(rank='5', suit='hearts')
Card(rank='5', suit='spades')

列表迭代、切片

因為 __getitem__ 方法 把 [] 操作交給 self._cards 列表 ,除了上面提到的 index 定位之外,F(xiàn)ranckDeck() 類還可實現(xiàn)切片、迭代操作;

# 切片操作

print('\nslice is --')
print(deck[:3])
print(deck[8:10])

print('\n迭代操作')
for card in deck[:3]:
    print(card)

print('\n 反迭代操作')
for card in reversed(deck[:3]):
    print(card)
    

# Output

slice is --
[Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')]
[Card(rank='10', suit='spades'), Card(rank='J', suit='spades')]

迭代操作
Card(rank='2', suit='spades')
Card(rank='3', suit='spades')
Card(rank='4', suit='spades')

 反迭代操作
Card(rank='4', suit='spades')
Card(rank='3', suit='spades')
Card(rank='2', suit='spades')

排序操作

常規(guī)來說,依據(jù)點數(shù)來判斷撲克牌的大小的話,2最小,A最大。實現(xiàn)點數(shù)排序是比較簡單的,在創(chuàng)建點數(shù)列表時是以上面提到順序進行創(chuàng)建,排序時只需按照 點數(shù)所在 index 作為基準 進行排序即可,

除了 點數(shù)之外還有一個 花色也需要考慮,對于花色的話,需要建立一個映射基準(也可以稱之為權(quán)重),不同花色賦予不同值;Python 的字典類型可以很方便地滿足我們的需要

# 創(chuàng)建一個字典映射
suit_values = dict(
    spades = 3,
    hearts = 2,
    diamonds = 1,
    clubs = 0
)
def spades_high(card):
    rank_value = FrenchDeck.ranks.index(card.rank) # 索引查詢
    return rank_value*len(suit_values) + suit_values[card.suit] # index* 4 + suit.value

print('\nSorted ------------------')
# 利用 key = lambda 機制對列表進行排序
for card in sorted(deck,key = spades_high,reverse= True):
    print(card)
    
# Output

Sorted ------------------
Card(rank='A', suit='spades')
Card(rank='A', suit='hearts')
Card(rank='A', suit='diamonds')
Card(rank='A', suit='clubs')
Card(rank='K', suit='spades')
Card(rank='K', suit='hearts')
Card(rank='K', suit='diamonds')
Card(rank='K', suit='clubs')
Card(rank='Q', suit='spades')
Card(rank='Q', suit='hearts')
Card(rank='Q', suit='diamonds')

代碼解讀:

  • 1,代碼中利用字典加入了一個映射機制,黑桃為3,紅心為2,方塊次之,隨后梅花;

  • 2,創(chuàng)建 spades_high 函數(shù)來計算 每張牌的權(quán)重總值;

  • 3,利用 sorted() 函數(shù) key= spades_high 來作為排序基準,來實現(xiàn)撲克牌排序

洗牌操作

洗牌簡單來說就是對一副撲克牌重新進行無規(guī)則地排序;正常情況random.shuffle 可以很方便地實現(xiàn)這個功能,但前提需要保證對象 滿足可變協(xié)議,這里 FranchDeck() 是不滿足的,直接使用的話會報錯:

from random import shuffle
print('-------------------\n'*3)
deck  =FrenchDeck()
shuffle(deck)


# Output


    x[i], x[j] = x[j], x[i]
TypeError: 'FrenchDeck' object does not support item assignment

對于上面問題,只需要要把 此類由 不變 變成 可變的 即可,創(chuàng)建一個函數(shù)賦值為 __setitem__ 屬性

from random import shuffle
print('-------------------\n'*3)


def set_deck(deck,position,card):
    deck._cards[position] = card

deck1 = FrenchDeck()
print('打亂前\n')
print(deck1[:5])
FrenchDeck.__setitem__ = set_deck
shuffle(deck1)

# Output


打亂前
Card(rank='2', suit='spades')
Card(rank='3', suit='spades')
Card(rank='4', suit='spades')
Card(rank='5', suit='spades')
Card(rank='6', suit='spades')

打亂后:
Card(rank='6', suit='diamonds')
Card(rank='4', suit='hearts')
Card(rank='Q', suit='diamonds')
Card(rank='K', suit='clubs')
Card(rank='8', suit='spades')

這里抽取到打亂前后紙牌的前 5 個元素,已經(jīng)實現(xiàn) 洗牌 的功能了!

根據(jù)以上的代碼部分,可以進一步開發(fā), 提前設(shè)計好 54 張撲克牌的可視化圖片,

Python 中怎么實現(xiàn)隨機抽牌、排序、洗牌功能

創(chuàng)建一個 key:value 映射關(guān)系,對撲克牌字符與可視化圖片之間創(chuàng)建一個映射關(guān)系,如下圖所示,把此關(guān)系集存儲到指定數(shù)據(jù)庫或文件中,方便后面使用時可直接調(diào)用

看完上述內(nèi)容,你們掌握Python 中怎么實現(xiàn)隨機抽牌、排序、洗牌功能的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

文章題目:Python中怎么實現(xiàn)隨機抽牌、排序、洗牌功能
分享地址:http://www.rwnh.cn/article40/jsceeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、商城網(wǎng)站、企業(yè)網(wǎng)站制作、搜索引擎優(yōu)化、自適應(yīng)網(wǎng)站、標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
甘孜| 大竹县| 来安县| 宾川县| 孝感市| 潍坊市| 中山市| 太仆寺旗| 当阳市| 连南| 广丰县| 富宁县| 彭州市| 通海县| 南陵县| 乌审旗| 河北省| 奇台县| 同仁县| 蕉岭县| 延边| 新民市| 吐鲁番市| 芷江| 城口县| 沙洋县| 天柱县| 恩平市| 务川| 忻城县| 松滋市| 兰坪| 衡阳县| 西和县| 拜城县| 木兰县| 崇阳县| 水城县| 德格县| 九台市| 沽源县|