贴吧看到的一个求助题,大致需求是:3个人摇骰子,每人摇3次,点数之和最大的获胜,支持玩家名称输入。我觉得这个题目挺有意思的,做了个界面程序,欢迎大家交流指正~
1#!usr/bin/env python
2# -*- coding: utf-8 -*-
3
4# author: ***
5# date: 2020/06/10
6
7fromtkinterimport*
8importtkinterastk
9importrandom
10importtime
11fromthreadingimportThread
12
13root = Tk()
14root.geometry('620x660')
15root.title('摇骰子')
16sigpic = PhotoImage(file='signature.png')
17shake_cup = PhotoImage(file='touzi/box.png')
18crown = PhotoImage(file='touzi/win.png')
19readystate =3
20playing =False
21used_name = set()
22result_dict = dict()
23remain =3
24esv_A = StringVar()
25esv_B = StringVar()
26esv_C = StringVar()
27
28pi_list = list()
29foriinrange(1,7):
30pi = PhotoImage(file=r'touzi/t%s.png'% i)
31pi_list.append(pi)
32
33
34defset_name(cw, ew, nw):
35globalreadystate
36entryV = ew.get()
37ifentryV:
38ifentryVinused_name:
39default = nw['text']
40nw.config(text="名称已存在!")
41cw.config(state=tk.DISABLED)
42font_shake(nw, default)
43cw.config(state=tk.ACTIVE)
44else:
45used_name.add(entryV)
46nw.config(text=entryV)
47ew.config(state=tk.DISABLED)
48cw.config(state=tk.DISABLED)
49readystate -=1
50ifreadystate ==:
51foriin"ABC":
52eval('play_btn_%s.config(state=tk.ACTIVE, text="第一次机会")'% i)
53
54
55defthrow_touzi(pw, rw, nw):
56globalplaying
57globalremain
58ifpw['text']=="第一次机会":
59playing =True
60pbStack.remove(pw)
61forwidgetinpbStack:
62widget.config(state=tk.DISABLED)
63pw.config(state=tk.DISABLED, text='第二次机会')
64elifpw['text']=="第二次机会":
65pw.config(state=tk.DISABLED, text='第三次机会')
66else:
67playing =False
68remain -=1
69pw.config(state=tk.DISABLED, text='play')
70thread = Thread(target=change_img, args=[pw, rw, nw])
71thread.start()
72
73
74defchange_img(pw, rw, nw):
75result_number = random.randint(1,6)
76ranum_list = list()
77times =5
78whiletimes:
79ranum = random.randint(1,6)
80ifranumnotinranum_list:
81ranum_list.append(ranum)
82times = times -1
83foriinranum_list:
84time.sleep(0.3)
85throw_label.config(image=pi_list[i-1])
86time.sleep(0.3)
87throw_label.config(image=pi_list[result_number-1])
88time.sleep(0.5)
89ifrw['text'] =="结果":
90rw['text'] = str(result_number)
91else:
92rw['text'] = str(rw['text']) +"+%s"% result_number
93time.sleep(0.5)
94rw['text'] = eval(rw['text'])
95ifpw['text'] !="play":
96pw.config(state=tk.ACTIVE)
97ifplaying ==False:
98result_dict[nw['text']] = rw['text']
99forwidgetinpbStack:
100widget.config(state=tk.ACTIVE)
101ifnotremain:
102result_list = sorted(result_dict.items(), reverse=True, key=lambdart: rt[1])
103ifresult_list[][1] == result_list[1][1]:
104ifresult_list[1][1] == result_list[2][1]:
105throw_winner['text'] =">> 平局
106else:
107winner = result_list[][] +", "+ result_list[1][]
108throw_winner['text'] ="Winner: %s"% winner
109else:
110winner = result_list[][]
111throw_winner['text'] ="Winner: %s"% winner
112throw_label['image'] = crown
113reset_btn.config(state=tk.ACTIVE, text='重新开始', relief='raised')
114
115
116deffont_shake(nw, default):
117nw.config(foreground='red')
118foriinrange(5):
119ifi%2==:
120time.sleep(0.05)
121nw.config(anchor='n')
122else:
123time.sleep(0.05)
124nw.config(anchor='s')
125root.update()
126nw.config(anchor='c')
127root.update()
128time.sleep(0.5)
129nw.config(text=default, foreground='black')
130
131
132defrestart():
133globalreadystate, used_name, result_dict, remain, pbStack
134throw_label['image'] = shake_cup
135readystate =3
136used_name = set()
137result_dict = dict()
138remain =3
139pbStack =
140reset_btn.config(state=tk.DISABLED, relief='flat', text='')
141foriin"ABC":
142eval('name_%s.config(text="player %s")'% (i, i))
143eval('entry_%s.config(state=tk.NORMAL)'% i)
144eval('esv_%s.set("")'% i)
145eval('confirm_btn_%s.config(state=tk.ACTIVE)'% i)
146eval('result_%s.config(text="结果")'% i)
147throw_winner['text'] =""
148
149
150box_frame_A = Frame(root)
151box_frame_A.grid(column=1, ipadx=3)
152name_A = Label(box_frame_A, text='player A', height=2)
153name_A.pack()
154signature_A = Label(box_frame_A, image=sigpic)
155signature_A.pack()
156play_btn_A = Button(box_frame_A, text='play', command=lambda: throw_touzi(play_btn_A, result_A, name_A))
157play_btn_A.pack(side=BOTTOM, pady=3)
158result_A = Label(box_frame_A, text='结果')
159result_A.pack(side=BOTTOM)
160entry_A = Entry(box_frame_A, textvariable=esv_A)
161entry_A.pack(side=LEFT, padx=5)
162confirm_btn_A = Button(box_frame_A, text='确定', command=lambda: set_name(confirm_btn_A, entry_A, name_A))
163confirm_btn_A.pack(side=LEFT)
164
165center_frame = Frame(root)
166center_frame.grid(row=1, column=1, pady=20)
167throw_label = Label(center_frame, image=shake_cup)
168throw_label.pack()
169throw_winner = Label(center_frame)
170throw_winner.pack()
171reset_btn = Button(center_frame, state=tk.DISABLED, relief='flat', command=restart)
172reset_btn.pack()
173
174box_frame_B = Frame(root)
175box_frame_B.grid(row=3, padx=10)
176name_B = Label(box_frame_B, text='player B', height=2)
177name_B.pack()
178signature_B = Label(box_frame_B, image=sigpic)
179signature_B.pack()
180play_btn_B = Button(box_frame_B, text='play', command=lambda: throw_touzi(play_btn_B, result_B, name_B))
181play_btn_B.pack(side=BOTTOM)
182result_B = Label(box_frame_B, text='结果')
183result_B.pack(side=BOTTOM)
184entry_B = Entry(box_frame_B, textvariable=esv_B)
185entry_B.pack(side=LEFT, padx=5)
186confirm_btn_B = Button(box_frame_B, text='确定', command=lambda: set_name(confirm_btn_B, entry_B, name_B))
187confirm_btn_B.pack(side=LEFT)
188
189
190box_frame_C = Frame(root)
191box_frame_C.grid(row=3, column=2, padx=10)
192name_C = Label(box_frame_C, text='player C', height=2)
193name_C.pack()
194signature_C = Label(box_frame_C, image=sigpic)
195signature_C.pack()
196play_btn_C = Button(box_frame_C, text='play', command=lambda: throw_touzi(play_btn_C, result_C, name_C))
197play_btn_C.pack(side=BOTTOM)
198result_C = Label(box_frame_C, text='结果')
199result_C.pack(side=BOTTOM)
200entry_C = Entry(box_frame_C, textvariable=esv_C)
201entry_C.pack(side=LEFT, padx=5)
202confirm_btn_C = Button(box_frame_C, text='确定', command=lambda: set_name(confirm_btn_C, entry_C, name_C))
203confirm_btn_C.pack(side=LEFT)
204
205
206if__name__ =='__main__':
207pbStack =
208foriin"ABC":
209eval('play_btn_%s.config(state=tk.DISABLED)'% i)
210root.mainloop()
程序界面截图:
1.初始界面
2.就绪界面
3.结果界面
领取专属 10元无门槛券
私享最新 技术干货