撲克牌排序 tkinter模擬撲克牌和狼人殺發牌

2021-10-25 12:50:57 字數 3542 閱讀 4875

今天我們用tkinter的canvas畫布實現撲克牌的隨機發牌:將54張牌隨機發給四位牌手,在螢幕上顯示每位牌手的牌,利用canvas將發牌結果顯示出來。

需要準備的是54張撲克牌的(gif或者png,jpg的話要經過額外的轉換),為了保證最終的牌序是按照由小到大排列的,編號要按照aaaa、2222……kkkk、大小王來排列(也許a和2應該更大,但是請忽略這一點)。

下面是完整**:

from tkinter import *

import random

n=54

(player1,player2,player3,player4)=(,,,)

(p1,p2,p3,p4)=(,,,)

pocker=[i for i in range(n)]

imgs=

root=tk()

cv=canvas(root,bg="white",width=700,height=600)

#洗牌(用隨機交換打亂牌序)

def gen_pocker(n):

x=100

while(x>0):

x=x-1

p1=random.randint(0,n-1)

p2=random.randint(0,n-1)

t=pocker[p1]

pocker[p1]=pocker[p2]

pocker[p2]=t

return pocker

pocker=gen_pocker(n) #打亂後的牌組編號

#將放入imgs列表

for i in range(1,55):

imgs.insert(i,photoimage(file="imgs/"+str(i)+".gif"))

#發牌,

for m in range(0,54,4):

try:

except:

break

#由小到大排序

p1.sort()

p2.sort()

p3.sort()

p4.sort()

#逐一顯示,其中1號和2號會發到14張牌

for x in range(0,14):

try:

img=imgs[p1[x]]

img=imgs[p2[x]]

img = imgs[p3[x]]

img = imgs[p4[x]]

except:

pass

cv.pack()

root.mainloop()

狼人殺

撲克牌

模擬結果如圖:

稍微改一改也可以用來模擬鬥地主:

再改一改也可以模擬狼人殺,邏輯比撲克牌簡單多了,不需要排序,而且通常只有12張牌。成果如下:

#洗牌(用隨機交換打亂牌序)

def gen_pocker(n):

x=10

while(x>0):

x=x-1

p1=random.randint(0,n-1)

p2=random.randint(0,n-1)

t=pocker[p1]

pocker[p1]=pocker[p2]

pocker[p2]=t

return pocker

#發牌

def mm():

global p2,p4 #list本身雖然是全域性變數,但如果不用global僅能修改元素,不能重新定義列表

cv.deldete('all')

p2,p4=,

pocker=gen_pocker(n) #打亂後的牌組編號

for m in range(0,12,2):

try:

except:

break

#先更新左邊一列

def ks(x):

if x==0:

mm()

img=imgs[p2[x]]

x+=1

#從第七張開始更新右邊一列

if x==6:

x2=0

root.after(500,ks2,x2)

return

root.after(500,ks,x)

#更新右側一列

def ks2(x2):

img = imgs[p4[x2]]

x2+=1

#最後一張之後結束

if x2==6:

return

root.after(500,ks2,x2)

button = button(root, text ="發牌", width=10,height=1,command = lambda:ks(0))

button.place(x=170, y=260)

cv.pack()

root.mainloop()

這樣就能實現動態發牌的效果了:

什麼?邊角位真的總有狼?

有了這個程式,手上沒牌也能模擬發牌、研究位置學了。

小作業1:自行實現撲克牌發牌的動態效果
cv.create_image((100,100), image=img,tags='o')

cv.delete('o')

最後為喜歡玩狼人殺的小夥伴們送上一則位置學攻略吧——

撲克牌排序 趣味撲克牌

一提到撲克牌,我們就想到神秘的魔術表演,撲克牌上有很多形狀和數字,裡面蘊藏了很多數學知識哦!瞧 subway的小朋友們正在進行趣味撲克牌的遊戲呢!好多撲克牌啊!撲克牌中間怎麼是空的呢?哇,還有這麼小的撲克牌呢!一看到teacher手中的撲克牌,小傢伙們乙個個的都興奮起來,迫不及待想要分享自己的見解呢...

撲克牌模擬

題意 東東有 a b 張撲克牌。每張撲克牌有乙個大小 整數,記為a,範圍區間是 0 到 a 1 和乙個花色 整數,記為b,範圍區間是 0 到 b 1 撲克牌是互異的,也就是獨一無二的,也就是說沒有兩張牌大小和花色都相同。一手牌 的意思是你手裡有5張不同的牌,這 5 張牌沒有誰在前誰在後的順序之分,它...

洗撲克牌 亂數排序

洗撲克牌 亂數排列 說明 洗撲克牌的原理其實與亂數排列是相同的,都是將一組數字 例如1 n 打亂重新排列,只 不過洗撲克牌多了乙個花色判斷的動作而已。解法 初學者通常會直接想到,隨機產生1 n的亂數並將之存入陣列中,後來產生的亂數存入陣列 前必須先檢查陣列中是否已有重複的數字,如果有這個數就不存入,...