在上一篇文章的最后,我们留了一个小作业:花果山美男子:tkinter模拟扑克牌和狼人杀发牌zhuanlan.zhihu.com
小作业2:模拟斗地主发牌,上方是牌库,实现从牌库到三个方向的动态发牌,最后揭示三张底牌(提示:可以用空白图片覆盖,或者删除指定组件)
今天我们就来完成一下斗地主发牌的模拟。
发牌的动态效果,原理和上一篇文章末尾狼人杀发牌是一样的。唯一的难点是牌库减少和揭示底牌的动画,方法就是每次更新图片时增加一个参数——tags标签,然后删除对应的图片。
另外还增加了“洗牌”、“发牌”、“亮牌”、“码牌”和“叫牌”的按钮,功能顾名思义,实现的逻辑也并不难。
具体方法请参考完整代码:
from tkinter import *
import random
from PIL import Image, ImageTk
import time
import tkinter.messagebox
n=54
player1,player2,player3,player4=[],[],[],[]
p1,p2,p3,p4=[],[],[],[]
pocker=[i for i in range(n)]
imgs=[]
root=Tk()
root.title('斗地主发牌模拟')
cv=Canvas(root,bg="White",width=800,heigh=650)
count=53 #牌堆剩余牌数(索引值,从0开始,用于tags标签的命名)
img0=ImageTk.PhotoImage(file="imgS/55.gif") #牌背图片
for i in range(1,55):
imgs.insert(i,ImageTk.PhotoImage(file="imgS/"+str(i)+".gif"))
lock=0 #是否叫地主的标记
#洗牌(用随机交换打乱牌序)
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
#将三个玩家和底牌分配到对应的列表
def mm():
global p1,p2,p3,p4
p1,p2,p3,p4=[],[],[],[]
pocker=gen_pocker(n) #打乱后的牌组编号
for m in range(0,51,3):
try:
p2.append(pocker[m])
p3.append(pocker[m+1])
p4.append(pocker[m+2])
except:
break
for m in range(51