Python使用tkinter实现摇骰子小游戏功能的代码
作者:Colliventy 发布时间:2021-03-18 09:15:16
标签: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, 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'] == "结果":
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, 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='结果')
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='结果')
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.结果界面
来源:https://www.cnblogs.com/ywfft/archive/2020/07/02/a20200702.html


猜你喜欢
- int connectDb() { EXEC SQL BEGIN DECLARE SECTION; char username[20]; c
- 利用百度api实现人像动漫化百度API地址:https://ai.baidu.com/tech/imageprocess/selfie_an
- 1、引言小 * 丝:鱼哥, 都说要想代码写的溜,Lamdba不能少。小鱼:你在项目代码多写几个lamdba试试,看看架构师找不找你喝茶水。小 * 丝
- vue + iview 实现一个手机分段的提示框,知识点还没总结,供大家参考,具体内容如下<template> &l
- 前言今天在编码中,看到了一个非常经典的接口用法如下,于是查阅了相关资料,发现此种写法为接口型函数,本文对此做了细致的阐述。// A Gett
- 在标志设计中文字与图形元素总是紧密配合,只有恰当的字体与图形搭配时才能发挥最大的视觉效果。这也意味着你不能抛开图案,只是一厢情愿地选择你自己
- 文章介绍了flask框架中的cookie和session。Session是在服务器端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存
- 对于array,如2-D的array,如何取指定元素设array为3*10的shapes = array([[ 0, 1, 2, 3, 4,
- 代码如下:ALTER function [dbo].[GetOrderNum]( @ebaystockflag varchar(20)//规
- 前言最近在学习Python的面向对象编程,以前是没有接触过其它的面向对象编程的语言,因此学习这一部分是相当带劲的,这里也总结一下。概述pyt
- php读写二进制文件可以使用pack和unpack函数。今天要处理一个二进制文件的问题,所以需要用一下,特意了解一下pack的用法,unpa
- I. 前言联邦学习(Federated Learning) 是人工智能的一个新的分支,这项技术是谷歌2016年于论文Communicatio
- 什么是recovery?在elasticsearch中,recovery指的是一个索引的分片分配到另外一个节点的过程,一般在快照恢复、索引复
- 如果你电脑是Mac的,使用homebrew安装MySQL是一个非常便捷的方式,但是还是会出现一些问题;首先保证你已经安装了mysql,如果是
- 当前的调试部分可以使用 go run filename.go 来执行。可以生成一个 build.sh 脚本,用于在指定位置产生已编译好的 可
- 前言最新需要做一个小工具,让协作部门能够获取到服务器上的一些资源讯息,因为工具是pyqt写的所以牵扯到用python链接linux的问题,这
- 写入txt文件def text_save(filename, data):#filename为写入CSV文件的路径,data为要写入数据列表
- 简介:本文介绍了图像检索的三种实现方式,均用python完成,其中前两种基于直方图比较,哈希法基于像素分布。 检索方式是:提前导入图片库作为
- 一、前言大家都知道游戏文字、文章等一些风控场景都实现了敏感词检测,一些敏感词会被屏蔽掉或者文章无法发布。今天我就分享用Go实现敏感词前缀树来
- 本文实例为大家分享了Python KNN分类算法的具体代码,供大家参考,具体内容如下KNN分类算法应该算得上是机器学习中最简单的分类算法了,