Python使用tkinter實(shí)現(xiàn)搖骰子小游戲功能的代碼
TKinter
Python 的 GUI 庫(kù)非常多,之所以選擇 Tkinter,一是最為簡(jiǎn)單,二是自帶庫(kù),不需下載安裝,隨時(shí)使用,跨平臺(tái)兼容性非常好,三則是從需求出發(fā)的,Python 在實(shí)際應(yīng)用中極少用于開(kāi)發(fā)復(fù)雜的桌面應(yīng)用,畢竟,Python 的各種 GUI 工具包都“一般得很”,不具備優(yōu)勢(shì)。
貼吧看到的一個(gè)求助題,大致需求是:3個(gè)人搖骰子,每人搖3次,點(diǎn)數(shù)之和最大的獲勝,支持玩家名稱(chēng)輸入。我覺(jué)得這個(gè)題目挺有意思的,做了個(gè)界面程序,歡迎大家交流指正~
#!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="名稱(chēng)已存在!")
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="第一次機(jī)會(huì)")' % i)
def throw_touzi(pw, rw, nw):
global playing
global remain
if pw['text']=="第一次機(jī)會(huì)":
playing = True
pbStack.remove(pw)
for widget in pbStack:
widget.config(state=tk.DISABLED)
pw.config(state=tk.DISABLED, text='第二次機(jī)會(huì)')
elif pw['text']=="第二次機(jī)會(huì)":
pw.config(state=tk.DISABLED, text='第三次機(jī)會(huì)')
else:
playing = False
remain -= 1
pw.config(state=tk.DISABLED, text='play')
thread = Thread(target=change_img, args=[pw, rw, nw])
thread.start()
def change_img(pw, rw, 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'] == "結(jié)果":
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='重新開(kāi)始', 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="結(jié)果")' % 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='結(jié)果')
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, relief='flat', 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, text='play', command=lambda : throw_touzi(play_btn_B, result_B, name_B))
play_btn_B.pack(side=BOTTOM)
result_B = Label(box_frame_B, text='結(jié)果')
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, text='確定', 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, text='play', command=lambda : throw_touzi(play_btn_C, result_C, name_C))
play_btn_C.pack(side=BOTTOM)
result_C = Label(box_frame_C, text='結(jié)果')
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, text='確定', 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_B, play_btn_C}
for i in "ABC":
eval('play_btn_%s.config(state=tk.DISABLED)' % i)
root.mainloop()
程序界面截圖:
1.初始界面

2.就緒界面

3.結(jié)果界面

總結(jié)
到此這篇關(guān)于Python使用tkinter實(shí)現(xiàn)搖骰子小游戲功能的代碼的文章就介紹到這了,更多相關(guān)Python實(shí)現(xiàn)搖骰子小游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 計(jì)算數(shù)組中每個(gè)數(shù)字出現(xiàn)多少次--“Bucket”桶的思想
這篇文章主要介紹了python 計(jì)算數(shù)組中每個(gè)數(shù)字出現(xiàn)多少次--“Bucket”桶的思想,需要的朋友可以參考下2017-12-12
python爬蟲(chóng)之利用Selenium+Requests爬取拉勾網(wǎng)
這篇文章主要介紹了python爬蟲(chóng)之利用Selenium+Requests爬取拉勾網(wǎng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python爬蟲(chóng)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
獲取CSDN文章內(nèi)容并轉(zhuǎn)換為markdown文本的python
這篇文章主要介紹了自己寫(xiě)的小工具,可以直接獲取csdn文章并轉(zhuǎn)換為markdown格式,需要的朋友可以參考下2020-09-09
Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例
今天小編就為大家分享一篇Tensorflow獲取張量Tensor的具體維數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Python圖像銳化與邊緣檢測(cè)之Sobel與Laplacian算子詳解
圖像銳化和邊緣檢測(cè)主要包括一階微分銳化和二階微分銳化,本文主要講解常見(jiàn)的圖像銳化和邊緣檢測(cè)方法,即Sobel算子和Laplacian算子,感興趣的可以了解一下2022-12-12
Django一小時(shí)寫(xiě)出賬號(hào)密碼管理系統(tǒng)
這篇文章主要介紹了Django一小時(shí)寫(xiě)出賬號(hào)密碼管理系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Python+eval函數(shù)實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式詳解
Python的 eval() 允許從基于字符串或基于編譯代碼的輸入中計(jì)算任意Python表達(dá)式。當(dāng)從字符串或編譯后的代碼對(duì)象的任何輸入中動(dòng)態(tài)計(jì)算Python表達(dá)式時(shí),此函數(shù)非常方便。本文將利用eval實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式,需要的可以參考一下2022-09-09

