1. 程式人生 > 程式設計 >Python使用tkinter實現搖骰子小遊戲功能的程式碼

Python使用tkinter實現搖骰子小遊戲功能的程式碼

TKinter

Python 的 GUI 庫非常多,之所以選擇 Tkinter,一是最為簡單,二是自帶庫,不需下載安裝,隨時使用,跨平臺相容性非常好,三則是從需求出發的,Python 在實際應用中極少用於開發複雜的桌面應用,畢竟,Python 的各種 GUI 工具包都“一般得很”,不具備優勢。

貼吧看到的一個求助題,大致需求是:3個人搖骰子,每人搖3次,點數之和最大的獲勝,支援玩家名稱輸入。我覺得這個題目挺有意思的,做了個介面程式,歡迎大家交流指正~

#!usr/bin/env python
# -*- coding: utf-8 -*-

# author: ***
# date: 2020/06/10

from tkinter import *
import tkinter as tk
import random
import time
from threading import Thread

root = Tk()
root.geometry('620x660')
root.title('搖骰子')
sigpic = PhotoImage(file='signature.png')
shake_cup = PhotoImage(file='touzi/box.png')
crown = PhotoImage(file='touzi/win.png')
readystate = 3
playing = False
used_name = set()
result_dict = dict()
remain = 3
esv_A = StringVar()
esv_B = StringVar()
esv_C = StringVar()

pi_list = list()
for i in range(1,7):
 pi = PhotoImage(file=r'touzi/t%s.png' % i)
 pi_list.append(pi)


def set_name(cw,ew,nw):
 global readystate
 entryV = ew.get()
 if entryV:
  if entryV in used_name:
   default = nw['text']
   nw.config(text="名稱已存在!")
   cw.config(state=tk.DISABLED)
   font_shake(nw,default)
   cw.config(state=tk.ACTIVE)
  else:
   used_name.add(entryV)
   nw.config(text=entryV)
   ew.config(state=tk.DISABLED)
   cw.config(state=tk.DISABLED)
   readystate -= 1
 if readystate == 0:
  for i in "ABC":
   eval('play_btn_%s.config(state=tk.ACTIVE,text="第一次機會")' % i)


def throw_touzi(pw,rw,nw):
 global playing
 global remain
 if pw['text']=="第一次機會":
  playing = True
  pbStack.remove(pw)
  for widget in pbStack:
   widget.config(state=tk.DISABLED)
  pw.config(state=tk.DISABLED,text='第二次機會')
 elif pw['text']=="第二次機會":
  pw.config(state=tk.DISABLED,text='第三次機會')
 else:
  playing = False
  remain -= 1
  pw.config(state=tk.DISABLED,text='play')
 thread = Thread(target=change_img,args=[pw,nw])
 thread.start()


def change_img(pw,nw):
 result_number = random.randint(1,6)
 ranum_list = list()
 times = 5
 while times:
  ranum = random.randint(1,6)
  if ranum not in ranum_list:
   ranum_list.append(ranum)
   times = times - 1
 for i in ranum_list:
  time.sleep(0.3)
  throw_label.config(image=pi_list[i-1])
 time.sleep(0.3)
 throw_label.config(image=pi_list[result_number-1])
 time.sleep(0.5)
 if rw['text'] == "結果":
  rw['text'] = str(result_number)
 else:
  rw['text'] = str(rw['text']) + "+%s" % result_number
 time.sleep(0.5)
 rw['text'] = eval(rw['text'])
 if pw['text'] != "play":
  pw.config(state=tk.ACTIVE)
 if playing == False:
  result_dict[nw['text']] = rw['text']
  for widget in pbStack:
   widget.config(state=tk.ACTIVE)
 if not remain:
  result_list = sorted(result_dict.items(),reverse=True,key=lambda rt: rt[1])
  if result_list[0][1] == result_list[1][1]:
   if result_list[1][1] == result_list[2][1]:
    throw_winner['text'] = ">> 平局 <<"
   else:
    winner = result_list[0][0] + "," + result_list[1][0]
    throw_winner['text'] = "Winner: %s" % winner
  else:
   winner = result_list[0][0]
   throw_winner['text'] = "Winner: %s" % winner
  throw_label['image'] = crown
  reset_btn.config(state=tk.ACTIVE,text='重新開始',relief='raised')


def font_shake(nw,default):
 nw.config(foreground='red')
 for i in range(5):
  if i%2 == 0:
   time.sleep(0.05)
   nw.config(anchor='n')
  else:
   time.sleep(0.05)
   nw.config(anchor='s')
  root.update()
 nw.config(anchor='c')
 root.update()
 time.sleep(0.5)
 nw.config(text=default,foreground='black')


def restart():
 global readystate,used_name,result_dict,remain,pbStack
 throw_label['image'] = shake_cup
 readystate = 3
 used_name = set()
 result_dict = dict()
 remain = 3
 pbStack = {play_btn_A,play_btn_B,play_btn_C}
 reset_btn.config(state=tk.DISABLED,relief='flat',text='')
 for i in "ABC":
  eval('name_%s.config(text="player %s")' % (i,i))
  eval('entry_%s.config(state=tk.NORMAL)' % i)
  eval('esv_%s.set("")' % i)
  eval('confirm_btn_%s.config(state=tk.ACTIVE)' % i)
  eval('result_%s.config(text="結果")' % i)
 throw_winner['text'] = ""


box_frame_A = Frame(root)
box_frame_A.grid(column=1,ipadx=3)
name_A = Label(box_frame_A,text='player A',height=2)
name_A.pack()
signature_A = Label(box_frame_A,image=sigpic)
signature_A.pack()
play_btn_A = Button(box_frame_A,text='play',command=lambda : throw_touzi(play_btn_A,result_A,name_A))
play_btn_A.pack(side=BOTTOM,pady=3)
result_A = Label(box_frame_A,text='結果')
result_A.pack(side=BOTTOM)
entry_A = Entry(box_frame_A,textvariable=esv_A)
entry_A.pack(side=LEFT,padx=5)
confirm_btn_A = Button(box_frame_A,text='確定',command=lambda : set_name(confirm_btn_A,entry_A,name_A))
confirm_btn_A.pack(side=LEFT)

center_frame = Frame(root)
center_frame.grid(row=1,column=1,pady=20)
throw_label = Label(center_frame,image=shake_cup)
throw_label.pack()
throw_winner = Label(center_frame)
throw_winner.pack()
reset_btn = Button(center_frame,state=tk.DISABLED,command=restart)
reset_btn.pack()

box_frame_B = Frame(root)
box_frame_B.grid(row=3,padx=10)
name_B = Label(box_frame_B,text='player B',height=2)
name_B.pack()
signature_B = Label(box_frame_B,image=sigpic)
signature_B.pack()
play_btn_B = Button(box_frame_B,command=lambda : throw_touzi(play_btn_B,result_B,name_B))
play_btn_B.pack(side=BOTTOM)
result_B = Label(box_frame_B,text='結果')
result_B.pack(side=BOTTOM)
entry_B = Entry(box_frame_B,textvariable=esv_B)
entry_B.pack(side=LEFT,padx=5)
confirm_btn_B = Button(box_frame_B,command=lambda : set_name(confirm_btn_B,entry_B,name_B))
confirm_btn_B.pack(side=LEFT)


box_frame_C = Frame(root)
box_frame_C.grid(row=3,column=2,padx=10)
name_C = Label(box_frame_C,text='player C',height=2)
name_C.pack()
signature_C = Label(box_frame_C,image=sigpic)
signature_C.pack()
play_btn_C = Button(box_frame_C,command=lambda : throw_touzi(play_btn_C,result_C,name_C))
play_btn_C.pack(side=BOTTOM)
result_C = Label(box_frame_C,text='結果')
result_C.pack(side=BOTTOM)
entry_C = Entry(box_frame_C,textvariable=esv_C)
entry_C.pack(side=LEFT,padx=5)
confirm_btn_C = Button(box_frame_C,command=lambda : set_name(confirm_btn_C,entry_C,name_C))
confirm_btn_C.pack(side=LEFT)

if __name__ == '__main__':
 pbStack = {play_btn_A,play_btn_C}
 for i in "ABC":
  eval('play_btn_%s.config(state=tk.DISABLED)' % i)
 root.mainloop()

程式介面截圖:

1.初始介面

Python使用tkinter實現搖骰子小遊戲功能的程式碼

2.就緒介面

Python使用tkinter實現搖骰子小遊戲功能的程式碼

3.結果介面

Python使用tkinter實現搖骰子小遊戲功能的程式碼

總結

到此這篇關於Python使用tkinter實現搖骰子小遊戲功能的程式碼的文章就介紹到這了,更多相關Python實現搖骰子小遊戲內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!