事先声明:我写的只是给初学者看的,希望给初学者提供一点参考。请大佬莫要取笑。
在学习python的过程中,看到书上有一个猜数字的小游戏设计,在没有看书中源代码之前,想想自己能否依照之前看的tkinter的知识部分写一个出来。尝试了半天,还真的写出来了,小开心一下。附上我自己的代码以及原书中的代码。代码虽然不同,但结果基本一样。不过我还加了点料,如果10次失败或者猜中了,是可以重新开始下一轮猜游戏的,点击重新开始按钮就好。
我设计的界面如下:
我写的代码略粗糙,后面有时间再打磨吧。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/3/19 14:16
# @Author : Lihua
# @Version : 1.0
# @Contact : heei3k@hotmail.com
# @File : guessdigit.py
# @Software: PyCharm
from tkinter import *
import random
root=Tk()
guess_num,max_n,min_n,a=0,1024,1,0
def init():
global guess_num,max_n,min_n,a
guess_num=0
max_n = 1024
min_n = 1
a = random.randint(min_n, max_n)
print("待猜测的数字为"+str(a))
label_str.set("请输入你所猜的数字,数字为"+str(min_n)+"到"+str(max_n)+"之间的整数")
def guess():
global guess_num,max_n,min_n,a
try:
val=int(entry.get())
print(val)
except Exception as e:
label_str.set("您的输入有误,请输入一个" + str(min_n) + "到" + str(max_n) + "之间的整数")
print(e)
return
guess_num += 1
if val>1024 or val<1:
label_str.set("您的输入有误,请输入一个"+str(min_n)+"到"+str(max_n)+"之间的整数")
elif val==a:
label_str.set("恭喜您已猜中,您用了"+str(guess_num)+"次机会")
button1["state"] = "disabled"
button3["state"] = "active"
elif val>a and guess_num<10:
max_n=val
label_str.set("请输入一个大于等于"+str(min_n)+"小于"+str(val)+"的数")
elif val<a and guess_num<10:
min_n=val
label_str.set("请输入一个大于"+str(val)+"小于等于"+str(max_n)+"的数")
else:
label_str.set("您已经猜10次未中,请重新开始游戏")
button1["state"]="disabled"
button3["state"] = "active"
def retry():
init()
button1["state"] = "active"
button3["state"] = "disabled"
def close():
root.destroy()
root.title("猜数字游戏")
root.geometry("400x100+150+150")
label_str = StringVar()
label_str.set("请输入你所猜的数字,数字为"+str(min_n)+"到"+str(max_n)+"之间的整数")
label=Label(root,textvariable=label_str)
entry=Entry(root,width=30,fg="red")
entry.place(relx=0.1,rely=0.5)
button1=Button(root,text="猜",command=guess)
button1.place(relx=0.65,rely=0.45)
button2=Button(root,text="关闭",command=close)
button2.place(relx=0.75,rely=0.45)
button3=Button(root,text="重新开始",command=retry)
button3.place(relx=0.85,rely=0.45)
button3["state"]="disabled"
label.pack()
init()
root.mainloop()
下面部分是原书的代码。书名是清华大学出版社出版的《Python项目案例开发从入门到实战》。
import tkinter as tk
import sys
import random
import re
number = random.randint(0,1024)
running = True
num = 0
nmaxn = 1024
nminn = 0
def eBtnClose(event):
root.destroy()
def eBtnGuess(event):
global nmaxn
global nminn
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 > nminn:
nminn = val_a
num+=1
label_tip_min.config(label_tip_min,text=nminn)
labelqval("小了哦")
else:
if val_a < nmaxn:
nmaxn = val_a
num+=1
label_tip_max.config(label_tip_max,text=nmaxn)
labelqval("大了哦")
else:
labelqval('你已经答对啦...')
def numGuess():
if num == 1:
labelqval('我靠!一次答对!')
elif num < 10:
labelqval('= =十次以内就答对了牛。。。尝试次数:'+str(num))
elif num < 50:
labelqval('还行哦尝试次数:'+str(num))
else:
labelqval('好吧。。。。。您都试了超过50次了。。。。尝试次数:'+str(num))
def labelqval(vText):
label_val_q.config(label_val_q,text=vText)
root = tk.Tk(className="猜数字游戏")
root.geometry("400x90+200+200")
line_a_tip = tk.Frame(root)
label_tip_max = tk.Label(line_a_tip,text=nmaxn)
label_tip_min = tk.Label(line_a_tip,text=nminn)
label_tip_max.pack(side = "top",fill = "x")
label_tip_min.pack(side = "bottom",fill = "x")
line_a_tip.pack(side = "left",fill = "y")
line_question = tk.Frame(root)
label_val_q = tk.Label(line_question,width="80")
label_val_q.pack(side = "left")
line_question.pack(side = "top",fill = "x")
line_input = tk.Frame(root)
entry_a = tk.Entry(line_input,width="40")
btnGuess = tk.Button(line_input,text="猜")
entry_a.pack(side = "left")
entry_a.bind('<Return>',eBtnGuess)
btnGuess.bind('<Button-1>',eBtnGuess)
btnGuess.pack(side = "left")
line_input.pack(side = "top",fill = "x")
line_btn = tk.Frame(root)
btnClose = tk.Button(line_btn,text="关闭")
btnClose.bind('<Button-1>',eBtnClose)
btnClose.pack(side="left")
line_btn.pack(side = "top")
labelqval("请输入0到1024之间任意整数:")
entry_a.focus_set()
print(number)
root.mainloop()