鬥地主案例 演示初始化牌 洗牌 發牌

2021-10-08 12:33:07 字數 4604 閱讀 7044

# 1. 撲克牌作為物件呈現

# 2, 建立未發牌的牌堆的列表

# 3. 建立三個玩家牌堆的列表

# 4. 建立底牌的元組

# 5. 最原始的牌堆初始化, 將54張牌加入到牌堆

# 6. 建立洗牌操作

# 7. 建立發牌操作

import random

import copy

class

poke

(object):

"""撲克類"""

# 原始牌堆

pokes =

list()

# 洗好的牌堆

washed_pokes =

list()

# 玩家一牌堆

player1 =

list()

# 玩家二牌堆

player2 =

list()

# 玩家三牌堆

player3 =

list()

# 底牌牌堆

last =

list()

def__init__

(self, flower, num)

:# 花色

self.flower = flower

# 點數

self.num = num

def__str__

(self)

:"""列印物件時, 列印花色和點數"""

return

"{}{}"

.format

(self.flower, self.num)

@classmethod

definit_pokes

(cls)

:"""初始化牌堆類方法"""

# 花色

flowers =

("♦"

,"♣"

,"♥"

,"♠"

)# 點數

nums =

("3"

,"4"

,"5"

,"6"

,"7"

,"8"

,"9"

,"10"

,"j"

,"k"

,"q"

,"a"

,"2"

)# 大小王

kings =

# 組成牌堆

for num_ in nums:

for flower_ in flowers:

# 原始牌堆列表中 放入乙個個撲克牌物件

)# 再將大小王加入原始牌堆

# 放入小王

"small"),

""))# 放入大王

"big"),

"")) @classmethod

defwash

(cls)

:"""洗牌方法"""

# 複製乙份牌, 好用於洗牌操作

cls.washed_pokes = copy.deepcopy(cls.pokes)

# 從牌堆中拿一張牌 與 隨機的一張牌交換位置

# 54張牌, 迴圈交換54次

for idx in

range(54

):# 隨機產生乙個索引, 範圍0到53

idx_random = random.randint(0,

53)# 交換牌位置

cls.washed_pokes[idx]

, cls.washed_pokes[idx_random]

= cls.washed_pokes[idx_random]

, cls.washed_pokes[idx]

@classmethod

defsend_poke

(cls)

:"""發牌方法"""

# 複製乙份洗好的牌, 用於發牌操作

washed_pokes = copy.deepcopy(cls.washed_pokes)

# 每個玩家手裡17張牌

# 發牌給玩家一

cls.player1.extend(washed_pokes[0:

51:3]

)# for _ in range(0, 17):

# # 從洗好的牌中 連續發17張牌 給到玩家

# 發牌給玩家二

cls.player2.extend(washed_pokes[1:

51:3]

)# for _ in range(0, 17):

# # 從洗好的牌中 連續發17張牌 給到玩家

# 發牌給玩家三

cls.player3.extend(washed_pokes[2:

51:3]

)# for _ in range(0, 17):

# # 從洗好的牌中 連續發17張牌 給到玩家

# 剩下三張牌 放入底牌中

cls.last.extend(washed_pokes[51:

54:1]

) @staticmethod

defshow_poke

(poke_list, action_name)

:# 展示牌堆

print

("\n"

+"-"

*100

+"\n{}:"

.format

(action_name)

, end="")

# for迴圈同時取出 索引 和 列表的值

for idx, poke_ in

enumerate

(poke_list)

:print

(poke_, end=

" ")

# 當索引一半時, 換行, 避免一行顯示過長

if idx ==54/

2:print()

print

("\n"

+"-"

*100

) @classmethod

defshow_player

(cls)

:"""展示 牌堆"""

# 展示原始牌堆

cls.show_poke(cls.pokes,

"初始化牌堆"

)# 展示洗好的牌堆

cls.show_poke(cls.washed_pokes,

"洗牌"

)# 展示三個玩家的牌堆

cls.show_poke(cls.player1,

"玩家一"

) cls.show_poke(cls.player2,

"玩家二"

) cls.show_poke(cls.player3,

"玩家三"

)# 展示底牌

cls.show_poke(cls.last,

"底牌"

) @classmethod

defsort_poke

(cls, player_poke_list)

:"""根據初始化已排序的撲克牌 對玩家的牌進行排序"""

temp_pokes =

list()

# 取出初始化已排序的撲克牌

for poke in cls.pokes:

# 取出玩家的撲克牌進行對比

for player_poke in player_poke_list:

# 判斷兩個物件的點數是否一致

if poke.__str__(

)== player_poke.__str__():

# 反轉列表, 大王排前面 ,從大到小

temp_pokes.reverse(

)# 返回排序好的牌

return temp_pokes

@classmethod

defsort_pokes_opt

(cls)

:# 給玩家一的牌排序

cls.player1 = cls.sort_poke(cls.player1)

# 給玩家二的牌排序

cls.player2 = cls.sort_poke(cls.player2)

# 給玩家三的牌排序

cls.player3 = cls.sort_poke(cls.player3)

defmain()

:"""主函式"""

# 初始化牌

poke.init_pokes(

)# 洗牌

poke.wash(

)# 發牌給三個玩家

poke.send_poke(

)# 給玩家的牌排序

poke.sort_pokes_opt(

)# 展示牌

poke.show_player(

)# print()

# print(poke.player1.__len__())

# print(poke.player2.__len__())

# print(poke.player3.__len__())

if __name__ ==

'__main__'

: main(

)

案例 鬥地主

案例分析 1 準備 準備54張牌,儲存到一的集合中,特殊牌大小王。其他52張牌 定義乙個陣列 集合,儲存4種花色 定義乙個陣列 集合,儲存13個符號1 2 3 4 5 迴圈遍歷兩個陣列 集合,組裝52張牌,儲存到乙個集合中。5,2,a 再加上大?和小?2 洗牌 使用集合工具collections的方...

集合案例 鬥地主

1.準備牌 54張牌,儲存到乙個集合中 特殊牌 大王,小王其他52張牌 定義乙個陣列 集合,儲存4種花色 黑 紅 梅 方 定義乙個陣列 集合,儲存13個序號 2,a k q 4 3 迴圈巢狀遍歷兩個陣列 集合組裝52張牌 2.洗牌 使用集合工具類collections的方法 static void ...

鬥地主案例(雙列集合)

案例介紹 按照鬥地主的規則,完成洗牌發牌的動作。具體規則 組裝54張撲克牌將 54張牌順序打亂 三個玩家參與遊戲,三人交替摸牌,每人17張牌,最後三張留作底牌。檢視三人各自手中的牌 按照牌的大小排序 底牌 規則 手中撲克牌從大到小的擺放順序 大王,小王,2,a,k,q,j,10,9,8,7,6,5,...