贴吧看到的一个求助题,大致需求是: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.结果界面

Python-使用tkinter实现的摇骰子小游戏的更多相关文章

  1. python小练习:使用循环和函数实现一个摇骰子小游戏。游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“大”,3<=总值<=10为“小”。然后告诉玩家猜对或者是猜错的结果。

    python小练习:使用循环和函数实现一个摇骰子小游戏.游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“ ...

  2. TurnipBit开发板掷骰子小游戏DIY教程实例

    转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 0x00前言 下面带大家用TurnipBit开发板实现一个简单的小游戏- ...

  3. 用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

  4. 零基础入门学习Python(4)--改进我们的小游戏

    前言 在以前的博客中有做个一个小游戏,但是太简单了,所以这次就来对我们做的小游戏进行改进,改善从以下四个方面进行: 程序猜错的时候要给出提示,例如告诉用户输入的值是大了还是小了. 以前程序每运行一次只 ...

  5. python Tkinter 写一个弹球的小游戏

    #!usr/bin/python #-*- coding:utf-8 -*- from Tkinter import * import Tkinter import random import tim ...

  6. python开发_自己开发的一个小游戏

    先看看游戏的运行效果: 看完游戏的运行情况,你可能对游戏有了一定了了解: #运行游戏后,玩家首先要进行语音的选择,1选择英语,2选择汉语,其他则默认选择英语 #根据玩家选择的语音,进入不同的语音环境 ...

  7. python新手如何编写一个猜数字小游戏

    此文章只针对新手,希望大家勿喷,感谢!话不多说先上代码: import random if __name__ == '__main__': yourname = input("你好! 你的名 ...

  8. python 打字小游戏

    最近随便用python的pygame编了这个打字小游戏 只要有字母调到窗口底部就结束 上代码: import pygame.freetype import sys import random pyga ...

  9. python 小游戏之摇骰子猜大小

    最近学习Python的随机数,逻辑判断,循环的用法,就想找一些练习题,比如小游戏猜大小,程序思路如下: 开发环境:python2.7 , 附上源代码如下: 摇骰子的函数,这个函数其实并不需要传任何参数 ...

随机推荐

  1. Java实现 LeetCode 699 掉落的方块(线段树?)

    699. 掉落的方块 在无限长的数轴(即 x 轴)上,我们根据给定的顺序放置对应的正方形方块. 第 i 个掉落的方块(positions[i] = (left, side_length))是正方形,其 ...

  2. Java实现 LeetCode 211 添加与搜索单词 - 数据结构设计

    211. 添加与搜索单词 - 数据结构设计 设计一个支持以下两种操作的数据结构: void addWord(word) bool search(word) search(word) 可以搜索文字或正则 ...

  3. (十一)DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析

    一.DVWA-SQL Injection(Blind)测试分析 SQL盲注 VS 普通SQL注入: 普通SQL注入 SQL盲注 1.执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提 ...

  4. Logstash下字段以及嵌套Json字段类型转换

    前言 从filebeat传输到Logstash的数据,某个字段需要由string类型装换成float类型.但是不管怎么改logstash的配置文件都不生效,其实官方文档都有,但是具体细节方面的东西就得 ...

  5. Qt自动生成.rc文件并配置对应属性 程序图标 版本 描述等

    Qt项目配置文件pro里需要如下配置,进行qmake,build后会自动生成.rc文件,并将对应的信息写入文件中 VERSION = 1.0.0.1 RC_ICONS = "http.ico ...

  6. TensorFlow笔记——关于MNIST数据的一个简单的例子

    这个程序参考自极客学院. from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf # MN ...

  7. redis 的简明教程

    redis 结合ssm使用 一.Redis使用 1.jedis操作redis非关系型数据库 2.spring 集成redis 二.两者区别: 一.Redis使用 1.jedis操作redis非关系型数 ...

  8. Vue中hash模式和history模式的区别

    vue-router 中hash模式和history模式. 在vue的路由配置中有mode选项,最直观的区别就是在hash模式下的地址栏里的URL夹杂着‘#’号 ,而history模式下没有.vue默 ...

  9. mysql大表在不停机的情况下增加字段该怎么处理

    MySQL中给一张千万甚至更大量级的表添加字段一直是比较头疼的问题,遇到此情况通常该如果处理?本文通过常见的三种场景进行案例说明. 1. 环境准备 数据库版本: 5.7.25-28(Percona 分 ...

  10. 在执行jar包时如何使用调优参数

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 使用时去掉换行 ...