python成语游戏代码_用python的TK模块实现猜成语游戏(附源码)

本文介绍了一个成语猜谜游戏的界面设计与实现细节,包括游戏窗口的创建、标签与按钮的功能定义,以及游戏流程控制等关键模块。
Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

1 classGameWindow(object):2 """创建游戏运行窗口并加载相关的控件"""

3

4 def __init__(self):5 """初始化窗口"""

6 #创建一个根窗口

7 self.win =tk.Tk()8 self.win.title("史上最污猜成语") #标题

9 self.win.geometry("500x500+500+100") #设置尺寸

10 self.win.resizable(width=False, height=False) #宽高不可变

11 self.v1 = tk.StringVar(self.win) #显示答案的标签

12 self.v2 = tk.StringVar(self.win) #答案是否正确的标签

13 self.v_screen = tk.StringVar(self.win) #显示下一关的标签

14 self.v_problems = tk.StringVar(self.win) #一个显示问题的可变标签

15 self.results = [] #创建一个记录答案长度的变量

16 self.eles = [] #创建一个记录界面元素的列表

17 self.list_button = [] #存放键盘可变文字对象

18 self.screen_num = [1] #记录当前是第几关,使用可变类型将地址引用

19 self.sum_screen = len(dict_problems) #获取当前的总关卡数

20 self.player_answers = self.player_answer() #记录目前已回答的关数的情况

21

22 defcreate_label(self):23 """创建窗口所有的标签"""

24 #标签显示第几关

25 dir1 = tk.Label(self.win, bg="yellow", textvariable=self.v_screen,26 fg="blue", font=("宋体", 20, "bold"))27 dir1.pack(side=tk.TOP, fill=tk.X)28 self.eles.append(dir1)29 #创建一个标签"答案"

30 dir2 = tk.Label(self.win, bg="red", text="答案:",31 font=("宋体", 20, "bold"))32 dir2.place(x=0, y=200) #位置坐标控制

33 self.eles.append(dir2)34 #创建一个换行标签

35 dir3 = tk.Label(self.win, bg="#00F000", textvariable=self.v_problems,36 wraplength=400, justify="left",37 fg="blue", font=("宋体", 20, "bold"), height=4)38 dir3.pack(fill=tk.X)39 self.eles.append(dir3)40 #一个空白的标签等待用户输入答案

41 dir4 = tk.Label(self.win, bg="green", textvariable=self.v1,42 font=("宋体", 20, "bold"))43 dir4.place(x=100, y=200)44 self.eles.append(dir4)45 #一个空白标签显示答案错误时

46 dir5 = tk.Label(self.win, textvariable=self.v2, fg="red",47 font=("宋体", 12, "bold"))48 dir5.place(x=100, y=240)49 self.eles.append(dir5)50

51 defcreate_button(self):52 """创建游戏窗口所有的按钮"""

53 #采用嵌套循环创建4*8个按钮

54 for j in range(4):55 for g in range(8):56 button1 = ButtonNew(self.win, v1=self.v1,57 v2=self.v2, result=self.results,58 screen_num=self.screen_num)59 #设置按钮的位置

60 key_b = button1.create_button(place_b=(30 + g * 54, 280 + j * 45))61 self.list_button.append(button1.v_name) #将每一个标签加入列表

62 self.eles.append(key_b) #所有的按钮加入列表

63 self._set_key(self.screen_num[0]) #设置相应关数的值

64

65 #创建一个用来清除答案的按钮

66 cls = tk.Button(self.win, text="清除", command=self._cls_function,67 bg="black", fg="white", font=("宋体", 16, "bold"))68 cls.place(x=250, y=200)69 self.eles.append(cls)70 #创建一个用来提示答案的按钮

71 pmt = tk.Button(self.win, text="提示",72 command=lambda: self._prompt_button(self.screen_num[0]),73 bg="red", fg="white", font=("宋体", 16, "bold"))74 pmt.place(x=320, y=200)75 self.eles.append(pmt)76 #创建一个用来确定答案的按钮

77 istrue = tk.Button(self.win, text="确定", command=self._ensure_button,78 bg="red", fg="white", font=("宋体", 16, "bold"))79 istrue.place(x=390, y=200)80 self.eles.append(istrue)81 #创建一个返回上一关的按钮

82 last_sc = tk.Button(self.win, text="上一关", command=self._last_sc_button,83 bg="red", fg="white", font=("宋体", 16, "bold"))84 last_sc.place(x=250, y=155)85 self.eles.append(last_sc)86 #创建一个返回选关窗口的按钮

87 return_button = tk.Button(self.win, text="返回选关", command=self._return_lock,88 bg="red", fg="white", font=("宋体", 16, "bold"))89 return_button.place(x=10, y=155)90 self.eles.append(return_button)91

92 defbefore_screen(self):93 """创建一个进入游戏的窗口所有元素"""

94 #空白标签

95 label1 =self.the_label()96 #标签显示"史上最污猜成语"

97 label2 = self.the_label("史上最污猜成语")98 #空白标签

99 label3 =self.the_label()100 #显示淡绿色背景

101 label4 = self.the_label(font=("宋体", 250, "bold"), bg="#00ee00")102 #显示作者“天宇之游”

103 dirx = tk.Label(self.win, bg="#00ee00", text="----天宇之游",104 fg="blue", font=("宋体", 20, "bold"))105 dirx.place(x=250, y=200)106 list_labels =[label1, label2, label3, label4, dirx]107 #创建一个进入游戏的按钮

108 go_game = tk.Button(self.win, text="开启污旅程",109 command=lambda: self._start_game(go_game, *list_labels),110 bg="red", fg="white", activebackground="yellow",111 activeforeground="red", font=("宋体", 30, "bold"))112 go_game.place(x=130, y=300)113

114 deflock_screen(self):115 """创建一个展示所有的关卡及关卡解锁的窗口"""

116 #空白区域

117 dir_k = tk.Label(self.win, bg="#3b9dff", font=("宋体", 20, "bold"))118 dir_k.pack(fill=tk.X)119 self.eles.append(dir_k)120 #显示相关信息

121 dir1 = tk.Message(self.win, bg="blue", text="选择关卡",122 fg="red", font=("宋体", 20, "bold"),123 width=200)124 dir1.pack(fill=tk.X)125 self.eles.append(dir1)126 #创建一块画布,所有的元素都放置在画布上

127 cans = tk.Canvas(self.win, #根窗口

128 bg="#92dba0", #设置画布的颜色

129 height=500,130 borderwidth=0)131 cans.pack(fill=tk.X)132 self.eles.append(cans) #添加到列表便于删除

133

134 for i in range(self.sum_screen): #按照已有的关卡数生成相应的按钮数量

135 j = i % 10 / 10.0

136 k = i // 10 / 10

137 #传入当前的关数和加载游戏窗口的函数

138 bn_st =ButtonSelect(cans, self.screen_num,139 self._game_go, self.eles,140 self.player_answers[i])141 bn_st.create_button(place=(j, k))142 bn_st.set_name(str(i + 1))143

144 defafter_screen(self):145 """一个游戏结束的画面窗口"""

146 self.the_label() #空白标签

147 text1 = "恭喜你!"

148 text2 = "成功晋升为老司机!"

149 #标签显示结束语

150 self.the_label(text1)151 self.the_label(text2)152 self.the_label() #空白标签

153 #创建一个结束的按钮

154 go_game = tk.Button(self.win, text="再见!",155 command=lambda: exit(),156 bg="red", fg="white",157 activebackground="yellow",158 activeforeground="red",159 font=("宋体", 30, "bold"))160 go_game.place(x=170, y=300)161

162 def the_label(self, text=None, side=tk.TOP,163 font=("宋体", 40, "bold"), bg="green"):164 """创建显示标签"""

165 dir1 = tk.Label(self.win, bg=bg, text=text,166 fg="black", font=font)167 dir1.pack(side=side, fill=tk.X)168 returndir1169

170 def_return_lock(self):171 """返回选择关卡的界面"""

172 #清空标签

173 self.list_button.clear()174 #清除界面的所有元素

175 self.clear_screen()176 #清空元素记录列表

177 self.eles.clear()178 #将关数记录还原到1

179 self.screen_num[0] = 1

180 #调用界面创建函数

181 self.screen_control(1)182

183 defclear_screen(self):184 """清除界面所有元素的函数"""

185 try:186 for ele inself.eles:187 ele.destroy() #删除所有的元素

188 exceptException as re:189 print(re)190

191 def_set_key(self, num):192 """设置所有的按键变量的值"""

193 listx = rm.sample(dict_key[str(num)], len(dict_key[str(num)])) #打乱顺序

194 #设置所有的键盘上的文字

195 for j, k inenumerate(self.list_button):196 k.set(listx[j]) #获取文字设置按键值

197

198 def_next_screen(self):199 """当答案正确时生成下一关的按钮"""

200 #创建一个用来确定答案的按钮

201 next_b = tk.Button(self.win, text="下一关", command=lambda: self._next_button(next_b),202 bg="red", fg="white",203 font=("宋体", 16, "bold"))204 next_b.place(x=390, y=155)205 returnnext_b206

207 def_next_button(self, next_b):208 """当点击下一关按钮时响应函数"""

209 try:210 #判断是否已经是最后一关

211 if self.screen_num[0] >=len(dict_problems):212 #print("这已经是最后一关")

213 #清除界面所有的元素

214 self.clear_screen()215 #加载游戏结束的界面

216 self.screen_control(3)217 else:218 if abt.the_answer isTrue:219 self.__update_screen() #更新窗口

220 else:221 self.v2.set("答案错误!")222

223 #将上一关的选关按钮变为绿色

224 self.player_answers[self.screen_num[0] - 2] = "1"

225 #同时将当前的数据同步到文件

226 file = open("./player_answers.txt", "w")227 file.write("".join(self.player_answers)) #转化成字符串

228 exceptException as re:229 print(re)230 else:231 #删除按钮本身

232 next_b.destroy()233 finally:234 file.close()235

236 def_last_sc_button(self):237 """上一关按钮的响应函数"""

238 #判断目前是不是第一关

239 if self.screen_num[0] == 1:240 self.v2.set("这是第一关!")241 else:242 self.screen_num[0] -= 2 #减少一关

243 self.__update_screen()244

245 def __update_screen(self):246 """更新窗口的的函数"""

247 #显示问题

248 self.v_problems.set(dict_problems[str(self.screen_num[0] + 1)])249 self.screen_num[0] += 1 #指针指向下一关

250 #改变关数的标签

251 self.v_screen.set("第" + str(self.screen_num[0]) + "关")252 #更新所有的按键值

253 self._set_key(self.screen_num[0])254 #清除v1和v2标签的内容

255 self._cls_function()256 self.v2.set("")257 #print("成功执行!")

258

259 def _start_game(self, *args):260 """进入游戏的响应函数"""

261 try:262 for ele inargs:263 ele.destroy() #删除所有的元素

264 exceptException as re:265 print(re)266 self.screen_control(num=1) #进入选关界面

267

268 def_game_go(self):269 str_num =str(self.screen_num[0])270 self.v_screen.set("第" + str_num + "关") #设置第几关标签

271 self.v_problems.set(dict_problems[str_num]) #设置问题

272 self.screen_control(2) #进入游戏界面

273

274 def_cls_function(self):275 """清除按钮响应事件函数"""

276 self.results.clear()277 self.v1.set("") #清空标签

278

279 def_ensure_button(self):280 """确定开关的事件函数"""

281 if abt.the_answer isTrue:282 self.v2.set("答案正确!")283 self._next_screen() #在窗口创建一个按钮

284 else:285 self.v2.set("答案错误!")286

287 def_prompt_button(self, key):288 """提示开关的事件函数"""

289 if abt.the_answer is True: #将可能打开的开关关闭

290 abt.the_answer =False291 self.results.clear() #先清空原来的答案

292 self.results.append(list_answer[int(key)]) #加入提示

293 self.v1.set(list_answer[int(key)]) #设置提示答案

294

295 def screen_control(self, num=0):296 """创建一个窗口控件显示的控制函数"""

297 if num ==0:298 self.before_screen() #开始显示游戏进入界面

299 elif num == 1:300 self.lock_screen() #进入选关界面

301 elif num == 2:302 self.create_label() #传入所有可变的参数创建所有的标签

303 self.create_button() #传入空白标签对象创建所有的按钮

304 elif num == 3:305 self.after_screen() #进入游戏结束界面

306

307 defrun(self):308 self.win.mainloop() #窗口运行

309

310 defplayer_answer(self):311 """更新记录的玩家回答的状态"""

312 #获取目前的总关数

313 number1 =self.sum_screen314 try:315 #读取文件中的关数信息,如果数目不变则不更新文件,改变则初始化文件

316 f = open("./player_answers.txt", "r")317 str3 =f.read()318 #print(str3)

319 exceptException as re:320 print(re)321 finally:322 f.close()323

324 if number1 ==len(str3):325 returnlist(iter(str3))326 else: #初始化

327 str2 = "0" *number1328 try:329 f1 = open("./player_answers.txt", "w")330 f1.write(str2) #更新信息

331 exceptException as re:332 print(re)333 finally:334 f1.close()335 returnlist(iter(str2))336

337

338 win =GameWindow()339 sc =win.screen_control340 bs =win.before_screen341 as_ =win.after_screen342 ls =win.lock_screen343 run =win.run344

345

346 defmain():347 sc()348 run() #游戏运行

349

350

351 if __name__ == "__main__":352 main()353 #初始化记录文件

354 #str2 = "0"*len(dict_key)

355 #f1 = open("./player_answers.txt", "w")

356 #f1.write(str2) # 更新信息

357 #f1.close()

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值