今天我們用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的亂數並將之存入陣列中,後來產生的亂數存入陣列 前必須先檢查陣列中是否已有重複的數字,如果有這個數就不存入,...