# 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,...