猜数游戏
在游戏中,程序随机生成1024以内的数字,再让玩家去猜,如果猜的数字过大过小都会进行提示,程序还会统计玩家猜的次数。
这个程序使用了图形化界面,主要是对图形化编程进行学习,使用的模块是Tkinter。
界面UI的设计
信息提示在图形框的最上方(即top),默认各组件是在中间部署的(即center),输入框按钮从左到右依次排列。
root = tk.Tk(className="猜数游戏") # 创建Tk对象
root.geometry("400x90+200+200") # 设置图形框大小
各标签组件的创建
label_val_q = tk.Label(root,width="80") # 创建提示标签
label_val_q.pack(side="top") # 放置于最顶端
entry_a = tk.Entry(root,width="40") # 单行输入文本框
entry_a.pack(side="left") # 靠左方
entry_a.bind('<Return>',eBtnGuess) # 绑定事件,将输入框的回车与猜按钮事件绑定
btnGuess = tk.Button(root,text="猜") # 创建猜按钮
btnGuess.pack(side="left") # 靠左放置
btnGuess.bind('<Button-1>',eBtnGuess) # 绑定猜事件
btnClose = tk.Button(root,text="关闭") # 创建关闭按钮
btnClose.pack(side="left") # 靠左放置
btnClose.bind('<Button-1>',eBtnClose) # 绑定关闭事件
进入主循环,打开图形框
labelqval("请输入0~1024的任意整数:") # 打印提示信息
entry_a.focus_set() # 将光标聚焦到文本框里
root.mainloop() # 进入图形循环,类似于进入主函数
信息提示函数实现
使用了提示标签的config()函数进行提示文本的更改。
def labelqval(vText):
label_val_q.config(label_val_q, text=vText) # 修改提示标签文字
显示次数函数实现
def numGuess():
if num == 1:
labelqval("厉害!一次答对!")
elif num < 10:
labelqval("=_= 十次内就答对了,很棒...尝试次数:"+str(num))
else:
labelqval("你就是个菜鸡,尝试次数超过十次了...尝试次数:"+str(num))
猜数事件函数实现
这是整个猜数的核心代码,所有的判断在这里进行。
def eBtnGuess(event):
# 调用全局变量
global nmax
global nmin
global num
global running
if running:
val_a = int(entry_a.get()) # 获取猜的数字并转换成数字
if val_a == number:
labelqval("恭喜答对了!")
num += 1
running = False
numGuess() # 显示猜的次数
elif val_a < number: # 猜小了
if val_a > nmin: # 大于最小数时
nmin = val_a # 修改提示猜测范围的最小数
num += 1
labelqval("小了,请输入"+str(nmin)+"到"+str(nmax)+"之间的任意整数:")
else:
if val_a < nmax:
nmax = val_a # 修改提示猜测范围的最大数
num += 1
labelqval("大了,请输入"+str(nmin)+"到"+str(nmax)+"之间的任意整数:")
else:
labelqval("你已经答对啦......")
关闭事件函数实现
def eBtnClose(event):
root.destroy() # 将对象进行销毁
完整代码
import tkinter as tk
import random
number = random.randint(0,1024) # 玩家要猜的数字
running = True
num = 0 # 猜的次数
nmax = 1024 # 猜测范围的最大数
nmin = 0 # 猜测范围的最小数
def eBtnGuess(event):
global nmax
global nmin
global num
global running
if running:
val_a = int(entry_a.get())
if val_a == number:
labelqval("恭喜答对了!")
num += 1
running = False
numGuess()
elif val_a < number:
if val_a > nmin:
nmin = val_a
num += 1
labelqval("小了,请输入"+str(nmin)+"到"+str(nmax)+"之间的任意整数:")
else:
if val_a < nmax:
nmax = val_a
num += 1
labelqval("大了,请输入"+str(nmin)+"到"+str(nmax)+"之间的任意整数:")
else:
labelqval("你已经答对啦......")
def numGuess():
if num == 1:
labelqval("厉害!一次答对!")
elif num < 10:
labelqval("=_= 十次内就答对了,很棒...尝试次数:"+str(num))
else:
labelqval("你好菜呀,尝试次数超过十次...尝试次数:"+str(num))
def labelqval(vText):
label_val_q.config(label_val_q, text=vText)
def eBtnClose(event):
root.destroy()
root = tk.Tk(className="猜数游戏")
root.geometry("400x90+200+200")
label_val_q = tk.Label(root,width="80")
label_val_q.pack(side="top")
entry_a = tk.Entry(root,width="40")
entry_a.pack(side="left")
entry_a.bind('<Return>',eBtnGuess)
btnGuess = tk.Button(root,text="猜")
btnGuess.pack(side="left")
btnGuess.bind('<Button-1>',eBtnGuess)
btnClose = tk.Button(root,text="关闭")
btnClose.pack(side="left")
btnClose.bind('<Button-1>',eBtnClose)
labelqval("请输入0~1024的任意整数:")
entry_a.focus_set()
print(number)
root.mainloop()