当前位置: 首页 > news >正文

怎么做刷业网站怎么查网站有没有做推广

怎么做刷业网站,怎么查网站有没有做推广,免费网站优化工具,网站推广公司大家好7.8 图形界面应用案例——关灯游戏 题目#xff1a; [案例]游戏初步——关灯游戏。 关灯游戏是很有意思的益智游戏#xff0c;玩家通过单击关掉(或打开)一盏灯。如果关(掉#xff08;或打开)一个电灯#xff0c;其周围(上下左右)的电灯也会触及开关#xff0c;成… 7.8    图形界面应用案例——关灯游戏 题目 [案例]游戏初步——关灯游戏。     关灯游戏是很有意思的益智游戏玩家通过单击关掉(或打开)一盏灯。如果关(掉或打开)一个电灯其周围(上下左右)的电灯也会触及开关成功地关掉所有电灯即可过关。 图7-43 关灯游戏运行效果 分析:游戏中采用二维列表存储灯的状态you表示电灯亮(黄色的圆)wu表示电灯关掉(背景色的圆)。在Canvas画布单击事件中获取鼠标单击位置从而换算成棋盘位(x1,y1),并处理四周灯的状态转换。 案例代码: from tkinter import * from tkinter import messagebox root Tk() l [[wu, wu, you, you, you] ,[wu, you, wu, wu, wu],[wu, wu, wu, wu, wu],[wu, wu, wu, you, wu],[you, you, you, wu, wu]] #绘制灯的状态情况图 def huaqi():for i in range (0,5):for u in range (0,5):if l[i][u]you:cv.create_oval(i * 40 10,u * 40 10,(i1)* 4010,(u1)*40 10,outlinewhite, fillyellow, width2)#亮灯else:cv.create_oval(i*40 10,u*40 10,(i1) *4010,(u1)*40 10,outlinewhite, fillwhite, width2) #灭灯 #反转(x1,yl)处灯的状态 def reserve(x1,y1):if l[x1][y1] wu:l[x1][y1]youelse:l[x1][y1] wu #单击事件函数 def luozi(event):x1 (event.x - 10) // 40y1 (event.y - 10) // 40print(x1, y1)reserve(x1, y1) # 翻转(x1,y1)处灯的状态# 以下翻转(x1,yI)周围的灯的状态#左侧灯的状态反转if x1 !0:reserve(x1 - 1, y1)# 右侧灯的状态反转if x1!4:reserve(x1 1, y1)# 上侧灯的状态反转if y1!0:reserve(x1, y1 - 1)# 下侧灯的状态反转if y1!4:reserve(x1, y1 1)huaqi() # 主程序 cv Canvas(root, bgwhite, width210, height210) for i in range(0, 6): # 绘制网格线cv.create_line(10, 10 1 * 40,210, 10 i * 40, arrow none)cv.create_line(10 i * 40,10,10 1 * 40, 210, arrow none ) huaqi() # 绘制灯的状态情况图 p 0 for i in range(0, 5):for u in l[i]:if u wu:p p 1 if p 25:messagebox.showinfo(win, 你过关了) # 显示赢信息的消息窗口 cv.bind(Button-1, luozi) cv.pack() root.mainloop () 这段代码是一个基于Tkinter库的灯泡游戏。游戏界面是一个5x5的网格每个网格代表一个灯泡。初始状态下所有的灯泡都是灭的白色。玩家的目标是通过点击灯泡将所有的灯泡都点亮黄色。 代码中的主要函数和操作包括 1. huaqi()函数根据灯泡的状态情况绘制灯泡的图形。如果灯泡是亮的则绘制一个黄色的圆形如果灯泡是灭的则绘制一个白色的圆形。 2. reserve(x1, y1)函数根据给定的坐标(x1, y1)反转该位置的灯泡的状态。如果灯泡是亮的则变为灭的如果灯泡是灭的则变为亮的。 3. luozi(event)函数处理鼠标点击事件。根据点击的位置确定对应的灯泡并进行状态反转。同时还会反转该灯泡周围的灯泡状态。 4. 主程序部分创建一个画布Canvas对象并设置背景色为白色。然后使用循环绘制网格线。接着调用huaqi()函数绘制灯泡的初始状态。最后绑定鼠标左键点击事件到luozi()函数并将画布显示在窗口中。 在游戏过程中玩家通过点击灯泡来改变它的状态并且反转周围灯泡的状态。当所有的灯泡都点亮时会弹出一个消息窗口显示玩家胜利的信息。 注Tkinter库 Tkinter是Python的标准图形用户界面GUI工具包它提供了创建和管理GUI应用程序所需的组件和功能。Tkinter是基于Tcl/Tk工具包的Python接口Tcl是一种脚本语言而Tk是一个用于创建图形用户界面的工具包。 Tkinter库包含了许多常用的GUI组件比如按钮、标签、文本框、复选框、单选按钮、菜单等同时也支持布局管理器来帮助开发者设计和布局界面。开发者可以使用Tkinter来创建各种类型的应用程序从简单的工具到复杂的桌面应用程序都可以使用Tkinter来实现。 Tkinter的优点包括 1. **易于学习和使用**Tkinter是Python的标准库因此无需额外安装即可使用。它的接口简单直观适合初学者入门。 2. **跨平台性**Tkinter可以在多个平台上运行包括Windows、Linux和Mac OS等。 3. **丰富的组件**Tkinter提供了丰富的GUI组件可以满足大部分应用程序的需求。 4. **灵活性**Tkinter支持自定义组件和样式开发者可以根据自己的需求进行定制。 总之Tkinter是一个功能强大且易于使用的GUI工具包适合用于开发Python图形界面应用程序。 扩展题目 题目要求 请完成《7.8关灯游戏》课本p.170并完成以下扩展内容: 扩展内容 1. 请设计并实现界面功能允许玩家选择初始地图的大小分别为:小(5x5)中(8x8)大(12x10)玩家选择之后立即刷新窗口界面并重设地图 2. 请设计并实现界面功能允许玩家选择游戏难度分别为 容易一开始有20%的格子状态为翻转状态 中等一开始有40%的格子状态为翻转状态 困难一开始有60%的格子状态为翻转状态 3. 游戏开始之前提示玩家输入唯一的用户名用于保留该玩家的闯关记录 4. 按照玩家选择的地图大小和难度开始游戏游戏过程中记录玩家闯关的总时间以及翻转次数即开关灯的次数 5. 玩家通关成功后保存相关信息到数据库表结构可以自定但应当至少包含以下信息 - 玩家选择的地图大小 - 玩家选择的难度 - 玩家通关的日期时间 - 玩家通关所用的总时间 - 玩家通关所用的总点击次数 6. 设计窗口界面显示通关排行榜具体说明如下 - 根据不同地图大小以及不同难度显示各自排名例如大地图中等难度与中地图困难难度的排名是分开的 - 可以选择显示总排名所有玩家的记录与个人排名玩家自己的所有记录 - 可以选择根据通关时间排名以及根据点击次数排名两个排名都是按从小到大排列 扩展完第一个功能的代码 1. 请设计并实现界面功能允许玩家选择初始地图的大小分别为:小(5x5)中(8x8)大(12x10)玩家选择之后立即刷新窗口界面并重设地图 from tkinter import * from tkinter import messagebox import randomclass LightsOutGame:def __init__(self, masterNone, size5):self.master masterself.size sizeself.lights [[wu for _ in range(size)] for _ in range(size)]self.create_widgets()self.random_open_lights() # 随机打开一些灯def create_widgets(self):self.cv Canvas(self.master, bgwhite, widthself.size*4010, heightself.size*4010)self.cv.pack()self.draw_grid() # 绘制网格self.huaqi() # 绘制灯的状态情况图self.cv.bind(Button-1, self.luozi)def draw_grid(self):self.cv.delete(grid) # 清除之前的网格for i in range(self.size1): # 绘制网格线self.cv.create_line(10, 10 i * 40, 10 self.size * 40, 10 i * 40, arrownone, tagsgrid)self.cv.create_line(10 i * 40, 10, 10 i * 40, 10 self.size * 40, arrownone, tagsgrid)def huaqi(self):self.cv.delete(lights) # 清除之前的灯for i in range(self.size):for u in range(self.size):if self.lights[i][u] you:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillyellow, width2, tagslights) # 亮灯else:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillwhite, width2, tagslights) # 灭灯def reserve(self, x1, y1):if self.lights[x1][y1] wu:self.lights[x1][y1] youelse:self.lights[x1][y1] wudef luozi(self, event):x1 (event.x - 10) // 40y1 (event.y - 10) // 40print(x1, y1)self.reserve(x1, y1) # 翻转(x1,y1)处灯的状态# 以下翻转(x1,yI)周围的灯的状态#左侧灯的状态反转if x1 ! 0:self.reserve(x1 - 1, y1)# 右侧灯的状态反转if x1 ! self.size - 1:self.reserve(x1 1, y1)# 上侧灯的状态反转if y1 ! 0:self.reserve(x1, y1 - 1)# 下侧灯的状态反转if y1 ! self.size - 1:self.reserve(x1, y1 1)self.huaqi()def random_open_lights(self):num_of_lights random.randint(1, self.size*self.size) # 随机选择要打开的灯的数量positions random.sample(range(self.size*self.size), num_of_lights) # 随机选择要打开的灯的位置for pos in positions:x pos // self.sizey pos % self.sizeself.reserve(x, y)def reset_game(size):game.size sizegame.lights [[wu for _ in range(size)] for _ in range(size)]game.cv.config(widthsize*4010, heightsize*4010)game.draw_grid()game.random_open_lights()game.huaqi()def on_small():reset_game(5)def on_medium():reset_game(8)def on_large():reset_game(12)root Tk() game LightsOutGame(root)menu_frame Frame(root) menu_frame.pack()small_button Button(menu_frame, text小, commandon_small) small_button.pack(sideLEFT)medium_button Button(menu_frame, text中, commandon_medium) medium_button.pack(sideLEFT)large_button Button(menu_frame, text大, commandon_large) large_button.pack(sideLEFT)root.mainloop()扩展完功能二的代码 请设计并实现界面功能允许玩家选择游戏难度分别为 容易一开始有20%的格子状态为翻转状态 中等一开始有40%的格子状态为翻转状态 困难一开始有60%的格子状态为翻转状态 from tkinter import * from tkinter import messagebox import randomclass LightsOutGame:def __init__(self, masterNone, size5, difficultymedium):self.master masterself.size sizeself.lights [[wu for _ in range(size)] for _ in range(size)]self.create_widgets()self.random_open_lights(difficulty) # 随机打开一些灯def create_widgets(self):self.cv Canvas(self.master, bgwhite, widthself.size*4010, heightself.size*4010)self.cv.pack()self.draw_grid() # 绘制网格self.huaqi() # 绘制灯的状态情况图self.cv.bind(Button-1, self.luozi)def draw_grid(self):self.cv.delete(grid) # 清除之前的网格for i in range(self.size1): # 绘制网格线self.cv.create_line(10, 10 i * 40, 10 self.size * 40, 10 i * 40, arrownone, tagsgrid)self.cv.create_line(10 i * 40, 10, 10 i * 40, 10 self.size * 40, arrownone, tagsgrid)def huaqi(self):self.cv.delete(lights) # 清除之前的灯for i in range(self.size):for u in range(self.size):if self.lights[i][u] you:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillyellow, width2, tagslights) # 亮灯else:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillwhite, width2, tagslights) # 灭灯def reserve(self, x1, y1):if self.lights[x1][y1] wu:self.lights[x1][y1] youelse:self.lights[x1][y1] wudef luozi(self, event):x1 (event.x - 10) // 40y1 (event.y - 10) // 40print(x1, y1)self.reserve(x1, y1) # 翻转(x1,y1)处灯的状态# 以下翻转(x1,yI)周围的灯的状态#左侧灯的状态反转if x1 ! 0:self.reserve(x1 - 1, y1)# 右侧灯的状态反转if x1 ! self.size - 1:self.reserve(x1 1, y1)# 上侧灯的状态反转if y1 ! 0:self.reserve(x1, y1 - 1)# 下侧灯的状态反转if y1 ! self.size - 1:self.reserve(x1, y1 1)self.huaqi()def random_open_lights(self, difficulty):if difficulty easy:num_of_lights int(self.size * self.size * 0.2) # 20%的格子状态为翻转状态elif difficulty medium:num_of_lights int(self.size * self.size * 0.4) # 40%的格子状态为翻转状态elif difficulty hard:num_of_lights int(self.size * self.size * 0.6) # 60%的格子状态为翻转状态positions random.sample(range(self.size*self.size), num_of_lights) # 随机选择要打开的灯的位置for pos in positions:x pos // self.sizey pos % self.sizeself.reserve(x, y)def reset_game(size, difficulty):game.size sizegame.lights [[wu for _ in range(size)] for _ in range(size)]game.cv.config(widthsize*4010, heightsize*4010)game.draw_grid()game.random_open_lights(difficulty)game.huaqi()def on_small():reset_game(5, difficulty_var.get())def on_medium():reset_game(8, difficulty_var.get())def on_large():reset_game(12, difficulty_var.get())root Tk() game LightsOutGame(root)menu_frame Frame(root) menu_frame.pack()difficulty_var StringVar() difficulty_var.set(medium)small_button Button(menu_frame, text小, commandon_small) small_button.pack(sideLEFT)medium_button Button(menu_frame, text中, commandon_medium) medium_button.pack(sideLEFT)large_button Button(menu_frame, text大, commandon_large) large_button.pack(sideLEFT)difficulty_frame Frame(root) difficulty_frame.pack()easy_radio Radiobutton(difficulty_frame, text容易, variabledifficulty_var, valueeasy) easy_radio.pack(sideLEFT)medium_radio Radiobutton(difficulty_frame, text中等, variabledifficulty_var, valuemedium) medium_radio.pack(sideLEFT)hard_radio Radiobutton(difficulty_frame, text困难, variabledifficulty_var, valuehard) hard_radio.pack(sideLEFT)root.mainloop()扩展完功能三的代码 3. 游戏开始之前提示玩家输入唯一的用户名用于保留该玩家的闯关记录 from tkinter import * from tkinter import messagebox import randomclass LightsOutGame:def __init__(self, masterNone, size5, difficultymedium):self.master masterself.size sizeself.lights [[wu for _ in range(size)] for _ in range(size)]self.username None # 存储玩家的用户名self.create_widgets()self.random_open_lights(difficulty) # 随机打开一些灯def create_widgets(self):self.cv Canvas(self.master, bgwhite, widthself.size*4010, heightself.size*4010)self.cv.pack()self.draw_grid() # 绘制网格self.huaqi() # 绘制灯的状态情况图self.cv.bind(Button-1, self.luozi)self.username_label Label(self.master, text用户名)self.username_label.pack()self.username_entry Entry(self.master)self.username_entry.pack()self.username_button Button(self.master, text确认, commandself.set_username)self.username_button.pack()def set_username(self):self.username self.username_entry.get()self.username_label.config(text用户名 self.username)# 移除用户名输入框和确认按钮self.username_entry.pack_forget()self.username_button.pack_forget()def draw_grid(self):self.cv.delete(grid) # 清除之前的网格for i in range(self.size1): # 绘制网格线self.cv.create_line(10, 10 i * 40, 10 self.size * 40, 10 i * 40, arrownone, tagsgrid)self.cv.create_line(10 i * 40, 10, 10 i * 40, 10 self.size * 40, arrownone, tagsgrid)def huaqi(self):self.cv.delete(lights) # 清除之前的灯for i in range(self.size):for u in range(self.size):if self.lights[i][u] you:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillyellow, width2, tagslights) # 亮灯else:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillwhite, width2, tagslights) # 灭灯def reserve(self, x1, y1):if self.lights[x1][y1] wu:self.lights[x1][y1] youelse:self.lights[x1][y1] wudef luozi(self, event):x1 (event.x - 10) // 40y1 (event.y - 10) // 40print(x1, y1)self.reserve(x1, y1) # 翻转(x1,y1)处灯的状态# 以下翻转(x1,yI)周围的灯的状态#左侧灯的状态反转if x1 ! 0:self.reserve(x1 - 1, y1)# 右侧灯的状态反转if x1 ! self.size - 1:self.reserve(x1 1, y1)# 上侧灯的状态反转if y1 ! 0:self.reserve(x1, y1 - 1)# 下侧灯的状态反转if y1 ! self.size - 1:self.reserve(x1, y1 1)self.huaqi()def random_open_lights(self, difficulty):if difficulty easy:num_of_lights int(self.size * self.size * 0.2) # 20%的格子状态为翻转状态elif difficulty medium:num_of_lights int(self.size * self.size * 0.4) # 40%的格子状态为翻转状态elif difficulty hard:num_of_lights int(self.size * self.size * 0.6) # 60%的格子状态为翻转状态positions random.sample(range(self.size*self.size), num_of_lights) # 随机选择要打开的灯的位置for pos in positions:x pos // self.sizey pos % self.sizeself.reserve(x, y)def reset_game(size, difficulty, username):game.username usernamegame.size sizegame.lights [[wu for _ in range(size)] for _ in range(size)]game.cv.config(widthsize*4010, heightsize*4010)game.draw_grid()game.random_open_lights(difficulty)game.huaqi()def on_small():reset_game(5, difficulty_var.get(), game.username)def on_medium():reset_game(8, difficulty_var.get(), game.username)def on_large():reset_game(12, difficulty_var.get(), game.username)root Tk() game LightsOutGame(root)menu_frame Frame(root) menu_frame.pack()difficulty_var StringVar() difficulty_var.set(medium)small_button Button(menu_frame, text小, commandon_small) small_button.pack(sideLEFT)medium_button Button(menu_frame, text中, commandon_medium) medium_button.pack(sideLEFT)large_button Button(menu_frame, text大, commandon_large) large_button.pack(sideLEFT)difficulty_frame Frame(root) difficulty_frame.pack()easy_radio Radiobutton(difficulty_frame, text容易, variabledifficulty_var, valueeasy) easy_radio.pack(sideLEFT)medium_radio Radiobutton(difficulty_frame, text中等, variabledifficulty_var, valuemedium) medium_radio.pack(sideLEFT)hard_radio Radiobutton(difficulty_frame, text困难, variabledifficulty_var, valuehard) hard_radio.pack(sideLEFT)root.mainloop()扩展完功能四的代码 按照玩家选择的地图大小和难度开始游戏游戏过程中记录玩家闯关的总时间以及翻转次数即开关灯的次数 from tkinter import * from tkinter import messagebox import random import timeclass LightsOutGame:def __init__(self, masterNone, size5, difficultymedium):self.master masterself.size sizeself.lights [[wu for _ in range(size)] for _ in range(size)]self.username None # 存储玩家的用户名self.create_widgets()self.random_open_lights(difficulty) # 随机打开一些灯self.total_time 0self.flip_count 0self.start_time 0def create_widgets(self):self.cv Canvas(self.master, bgwhite, widthself.size*4010, heightself.size*4010)self.cv.pack()self.draw_grid() # 绘制网格self.huaqi() # 绘制灯的状态情况图self.cv.bind(Button-1, self.luozi)self.username_label Label(self.master, text用户名)self.username_label.pack()self.username_entry Entry(self.master)self.username_entry.pack()self.username_button Button(self.master, text确认, commandself.set_username)self.username_button.pack()def set_username(self):self.username self.username_entry.get()self.username_label.config(text用户名 self.username)# 移除用户名输入框和确认按钮self.username_entry.pack_forget()self.username_button.pack_forget()def draw_grid(self):self.cv.delete(grid) # 清除之前的网格for i in range(self.size1): # 绘制网格线self.cv.create_line(10, 10 i * 40, 10 self.size * 40, 10 i * 40, arrownone, tagsgrid)self.cv.create_line(10 i * 40, 10, 10 i * 40, 10 self.size * 40, arrownone, tagsgrid)def huaqi(self):self.cv.delete(lights) # 清除之前的灯for i in range(self.size):for u in range(self.size):if self.lights[i][u] you:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillyellow, width2, tagslights) # 亮灯else:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillwhite, width2, tagslights) # 灭灯def reserve(self, x1, y1):if self.lights[x1][y1] wu:self.lights[x1][y1] youelse:self.lights[x1][y1] wudef luozi(self, event):x1 (event.x - 10) // 40y1 (event.y - 10) // 40print(x1, y1)self.reserve(x1, y1) # 翻转(x1,y1)处灯的状态# 以下翻转(x1,yI)周围的灯的状态#左侧灯的状态反转if x1 ! 0:self.reserve(x1 - 1, y1)# 右侧灯的状态反转if x1 ! self.size - 1:self.reserve(x1 1, y1)# 上侧灯的状态反转if y1 ! 0:self.reserve(x1, y1 - 1)# 下侧灯的状态反转if y1 ! self.size - 1:self.reserve(x1, y1 1)self.huaqi()self.flip_count 1def random_open_lights(self, difficulty):if difficulty easy:num_of_lights int(self.size * self.size * 0.2) # 20%的格子状态为翻转状态elif difficulty medium:num_of_lights int(self.size * self.size * 0.4) # 40%的格子状态为翻转状态elif difficulty hard:num_of_lights int(self.size * self.size * 0.6) # 60%的格子状态为翻转状态positions random.sample(range(self.size*self.size), num_of_lights) # 随机选择要打开的灯的位置for pos in positions:x pos // self.sizey pos % self.sizeself.reserve(x, y)def reset_game(size, difficulty, username):game.username usernamegame.size sizegame.lights [[wu for _ in range(size)] for _ in range(size)]game.cv.config(widthsize*4010, heightsize*4010)game.draw_grid()game.random_open_lights(difficulty)game.huaqi()game.total_time 0game.flip_count 0game.start_time 0def on_small():reset_game(5, difficulty_var.get(), game.username)def on_medium():reset_game(8, difficulty_var.get(), game.username)def on_large():reset_game(12, difficulty_var.get(), game.username)root Tk() game LightsOutGame(root)menu_frame Frame(root) menu_frame.pack()difficulty_var StringVar() difficulty_var.set(medium)small_button Button(menu_frame, text小, commandon_small) small_button.pack(sideLEFT)medium_button Button(menu_frame, text中, commandon_medium) medium_button.pack(sideLEFT)large_button Button(menu_frame, text大, commandon_large) large_button.pack(sideLEFT)difficulty_frame Frame(root) difficulty_frame.pack()easy_radio Radiobutton(difficulty_frame, text容易, variabledifficulty_var, valueeasy) easy_radio.pack(sideLEFT)medium_radio Radiobutton(difficulty_frame, text中等, variabledifficulty_var, valuemedium) medium_radio.pack(sideLEFT)hard_radio Radiobutton(difficulty_frame, text困难, variabledifficulty_var, valuehard) hard_radio.pack(sideLEFT)root.mainloop()扩展完功能五的代码 玩家通关成功后保存相关信息到数据库表结构可以自定但应当至少包含以下信息 - 玩家选择的地图大小 - 玩家选择的难度 - 玩家通关的日期时间 - 玩家通关所用的总时间 - 玩家通关所用的总点击次数 import sqlite3 from tkinter import * from tkinter import messagebox import random from datetime import datetimeclass LightsOutGame:def __init__(self, masterNone, size5, difficultymedium):self.master masterself.size sizeself.lights [[wu for _ in range(size)] for _ in range(size)]self.username None # 存储玩家的用户名self.create_widgets()self.random_open_lights(difficulty) # 随机打开一些灯self.total_time 0self.flip_count 0self.start_time 0# 连接到数据库self.conn sqlite3.connect(game.db)self.cursor self.conn.cursor()# 创建表self.cursor.execute(CREATE TABLE IF NOT EXISTS game_records (id INTEGER PRIMARY KEY AUTOINCREMENT,map_size INTEGER,difficulty TEXT,completion_time DATETIME,total_clicks INTEGER))def create_widgets(self):self.cv Canvas(self.master, bgwhite, widthself.size*4010, heightself.size*4010)self.cv.pack()self.draw_grid() # 绘制网格self.huaqi() # 绘制灯的状态情况图self.cv.bind(Button-1, self.luozi)self.username_label Label(self.master, text用户名)self.username_label.pack()self.username_entry Entry(self.master)self.username_entry.pack()self.username_button Button(self.master, text确认, commandself.set_username)self.username_button.pack()def set_username(self):self.username self.username_entry.get()self.username_label.config(text用户名 self.username)# 移除用户名输入框和确认按钮self.username_entry.pack_forget()self.username_button.pack_forget()def draw_grid(self):self.cv.delete(grid) # 清除之前的网格for i in range(self.size1): # 绘制网格线self.cv.create_line(10, 10 i * 40, 10 self.size * 40, 10 i * 40, arrownone, tagsgrid)self.cv.create_line(10 i * 40, 10, 10 i * 40, 10 self.size * 40, arrownone, tagsgrid)def huaqi(self):self.cv.delete(lights) # 清除之前的灯for i in range(self.size):for u in range(self.size):if self.lights[i][u] you:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillyellow, width2, tagslights) # 亮灯else:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillwhite, width2, tagslights) # 灭灯def reserve(self, x1, y1):if self.lights[x1][y1] wu:self.lights[x1][y1] youelse:self.lights[x1][y1] wudef luozi(self, event):x1 (event.x - 10) // 40y1 (event.y - 10) // 40print(x1, y1)self.reserve(x1, y1) # 翻转(x1,y1)处灯的状态# 以下翻转(x1,yI)周围的灯的状态#左侧灯的状态反转if x1 ! 0:self.reserve(x1 - 1, y1)# 右侧灯的状态反转if x1 ! self.size - 1:self.reserve(x1 1, y1)# 上侧灯的状态反转if y1 ! 0:self.reserve(x1, y1 - 1)# 下侧灯的状态反转if y1 ! self.size - 1:self.reserve(x1, y1 1)self.huaqi()self.flip_count 1def random_open_lights(self, difficulty):if difficulty easy:num_of_lights int(self.size * self.size * 0.2) # 20%的格子状态为翻转状态elif difficulty medium:num_of_lights int(self.size * self.size * 0.4) # 40%的格子状态为翻转状态elif difficulty hard:num_of_lights int(self.size * self.size * 0.6) # 60%的格子状态为翻转状态positions random.sample(range(self.size*self.size), num_of_lights) # 随机选择要打开的灯的位置for pos in positions:x pos // self.sizey pos % self.sizeself.reserve(x, y)def save_game_record(self):# 保存通关信息到数据库map_size self.sizedifficulty difficulty_var.get()completion_time datetime.now()total_clicks self.flip_countself.cursor.execute(INSERT INTO game_records (map_size, difficulty, completion_time, total_clicks)VALUES (?, ?, ?, ?), (map_size, difficulty, completion_time, total_clicks))self.conn.commit()def reset_game(size, difficulty, username):game.username usernamegame.size sizegame.lights [[wu for _ in range(size)] for _ in range(size)]game.cv.config(widthsize*4010, heightsize*4010)game.draw_grid()game.random_open_lights(difficulty)game.huaqi()game.total_time 0game.flip_count 0game.start_time 0def on_small():reset_game(5, difficulty_var.get(), game.username)def on_medium():reset_game(8, difficulty_var.get(), game.username)def on_large():reset_game(12, difficulty_var.get(), game.username)root Tk() game LightsOutGame(root)menu_frame Frame(root) menu_frame.pack()difficulty_var StringVar() difficulty_var.set(medium)small_button Button(menu_frame, text小, commandon_small) small_button.pack(sideLEFT)medium_button Button(menu_frame, text中, commandon_medium) medium_button.pack(sideLEFT)large_button Button(menu_frame, text大, commandon_large) large_button.pack(sideLEFT)difficulty_frame Frame(root) difficulty_frame.pack()easy_radio Radiobutton(difficulty_frame, text容易, variabledifficulty_var, valueeasy) easy_radio.pack(sideLEFT)medium_radio Radiobutton(difficulty_frame, text中等, variabledifficulty_var, valuemedium) medium_radio.pack(sideLEFT)hard_radio Radiobutton(difficulty_frame, text困难, variabledifficulty_var, valuehard) hard_radio.pack(sideLEFT)save_button Button(root, text保存通关信息, commandgame.save_game_record) save_button.pack()root.mainloop()# 关闭数据库连接 game.conn.close()扩展完功能六的代码 设计窗口界面显示通关排行榜具体说明如下 - 根据不同地图大小以及不同难度显示各自排名例如大地图中等难度与中地图困难难度的排名是分开的 - 可以选择显示总排名所有玩家的记录与个人排名玩家自己的所有记录 - 可以选择根据通关时间排名以及根据点击次数排名两个排名都是按从小到大排列 import sqlite3 from tkinter import * from tkinter import messagebox import random from datetime import datetimeclass LightsOutGame:def __init__(self, masterNone, size5, difficultymedium):self.master masterself.size sizeself.lights [[wu for _ in range(size)] for _ in range(size)]self.username None # 存储玩家的用户名self.create_widgets()self.random_open_lights(difficulty) # 随机打开一些灯self.total_time 0self.flip_count 0self.start_time 0# 连接到数据库self.conn sqlite3.connect(game.db)self.cursor self.conn.cursor()# 创建表self.cursor.execute(CREATE TABLE IF NOT EXISTS game_records (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT,map_size INTEGER,difficulty TEXT,completion_time DATETIME,total_clicks INTEGER))def create_widgets(self):self.cv Canvas(self.master, bgwhite, widthself.size * 40 10, heightself.size * 40 10)self.cv.pack()self.draw_grid() # 绘制网格self.huaqi() # 绘制灯的状态情况图self.cv.bind(Button-1, self.luozi)self.username_label Label(self.master, text用户名)self.username_label.pack()self.username_entry Entry(self.master)self.username_entry.pack()self.username_button Button(self.master, text确认, commandself.set_username)self.username_button.pack()self.show_leaderboard_button Button(self.master, text显示排行榜, commandself.show_leaderboard)self.show_leaderboard_button.pack()def set_username(self):self.username self.username_entry.get()self.username_label.config(text用户名 self.username)# 移除用户名输入框和确认按钮self.username_entry.pack_forget()self.username_button.pack_forget()def draw_grid(self):self.cv.delete(grid) # 清除之前的网格for i in range(self.size 1): # 绘制网格线self.cv.create_line(10, 10 i * 40, 10 self.size * 40, 10 i * 40, arrownone, tagsgrid)self.cv.create_line(10 i * 40, 10, 10 i * 40, 10 self.size * 40, arrownone, tagsgrid)def huaqi(self):self.cv.delete(lights) # 清除之前的灯for i in range(self.size):for u in range(self.size):if self.lights[i][u] you:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillyellow, width2, tagslights) # 亮灯else:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillwhite, width2, tagslights) # 灭灯def reserve(self, x1, y1):if self.lights[x1][y1] wu:self.lights[x1][y1] youelse:self.lights[x1][y1] wudef luozi(self, event):x1 (event.x - 10) // 40y1 (event.y - 10) // 40print(x1, y1)self.reserve(x1, y1) # 翻转(x1,y1)处灯的状态# 以下翻转(x1,yI)周围的灯的状态#左侧灯的状态反转if x1 ! 0:self.reserve(x1 - 1, y1)# 右侧灯的状态反转if x1 ! self.size - 1:self.reserve(x1 1, y1)# 上侧灯的状态反转if y1 ! 0:self.reserve(x1, y1 - 1)# 下侧灯的状态反转if y1 ! self.size - 1:self.reserve(x1, y1 1)self.huaqi()self.flip_count 1def random_open_lights(self, difficulty):if difficulty easy:num_of_lights int(self.size * self.size * 0.2) # 20%的格子状态为翻转状态elif difficulty medium:num_of_lights int(self.size * self.size * 0.4) # 40%的格子状态为翻转状态elif difficulty hard:num_of_lights int(self.size * self.size * 0.6) # 60%的格子状态为翻转状态positions random.sample(range(self.size * self.size), num_of_lights) # 随机选择要打开的灯的位置for pos in positions:x pos // self.sizey pos % self.sizeself.reserve(x, y)def save_game_record(self):# 保存通关信息到数据库map_size self.sizedifficulty difficulty_var.get()completion_time datetime.now()total_clicks self.flip_countself.cursor.execute(INSERT INTO game_records (username, map_size, difficulty, completion_time, total_clicks)VALUES (?, ?, ?, ?, ?), (self.username, map_size, difficulty, completion_time, total_clicks))self.conn.commit() # 确保数据被写入数据库def show_leaderboard(self):leaderboard_window Toplevel(self.master)leaderboard_window.title(通关排行榜)leaderboard_frame Frame(leaderboard_window)leaderboard_frame.pack()map_size self.sizedifficulty difficulty_var.get()self.cursor.execute(SELECT username, completion_time, total_clicks FROM game_recordsWHERE map_size? AND difficulty?ORDER BY completion_time, total_clicks, (map_size, difficulty))records self.cursor.fetchall()if len(records) 0:messagebox.showinfo(提示, 暂无记录)else:for i, record in enumerate(records):username_label Label(leaderboard_frame, textrecord[0])username_label.grid(rowi, column0)completion_time_label Label(leaderboard_frame, textrecord[1])completion_time_label.grid(rowi, column1)total_clicks_label Label(leaderboard_frame, textrecord[2])total_clicks_label.grid(rowi, column2)def reset_game(size, difficulty, username):game.username usernamegame.size sizegame.lights [[wu for _ in range(size)] for _ in range(size)]game.cv.config(widthsize * 40 10, heightsize * 40 10)game.draw_grid()game.random_open_lights(difficulty)game.huaqi()game.total_time 0game.flip_count 0game.start_time 0def on_small():reset_game(5, difficulty_var.get(), game.username)def on_medium():reset_game(8, difficulty_var.get(), game.username)def on_large():reset_game(12, difficulty_var.get(), game.username)root Tk() game LightsOutGame(root)menu_frame Frame(root) menu_frame.pack()difficulty_var StringVar() difficulty_var.set(medium)small_button Button(menu_frame, text小, commandon_small) small_button.pack(sideLEFT)medium_button Button(menu_frame, text中, commandon_medium) medium_button.pack(sideLEFT)large_button Button(menu_frame, text大, commandon_large) large_button.pack(sideLEFT)difficulty_frame Frame(root) difficulty_frame.pack()easy_radio Radiobutton(difficulty_frame, text容易, variabledifficulty_var, valueeasy) easy_radio.pack(sideLEFT)medium_radio Radiobutton(difficulty_frame, text中等, variabledifficulty_var, valuemedium) medium_radio.pack(sideLEFT)hard_radio Radiobutton(difficulty_frame, text困难, variabledifficulty_var, valuehard) hard_radio.pack(sideLEFT)save_button Button(root, text保存通关信息, commandgame.save_game_record) save_button.pack()root.mainloop()# 关闭数据库连接 game.conn.close()扩展添加了一个查询次数和时间的代码最终 import sqlite3 from tkinter import * from tkinter import messagebox import random from datetime import datetimeclass LightsOutGame:def __init__(self, masterNone, size5, difficultymedium):self.master masterself.size sizeself.lights [[wu for _ in range(size)] for _ in range(size)]self.username None # 存储玩家的用户名self.create_widgets()self.random_open_lights(difficulty) # 随机打开一些灯self.total_time 0self.flip_count 0self.start_time 0# 连接到数据库self.conn sqlite3.connect(game.db)self.cursor self.conn.cursor()# 创建表self.cursor.execute(CREATE TABLE IF NOT EXISTS game_records (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT,map_size INTEGER,difficulty TEXT,completion_time DATETIME,total_clicks INTEGER))def create_widgets(self):self.cv Canvas(self.master, bgwhite, widthself.size * 40 10, heightself.size * 40 10)self.cv.pack()self.draw_grid() # 绘制网格self.huaqi() # 绘制灯的状态情况图self.cv.bind(Button-1, self.luozi)self.username_label Label(self.master, text用户名)self.username_label.pack()self.username_entry Entry(self.master)self.username_entry.pack()self.username_button Button(self.master, text确认, commandself.set_username)self.username_button.pack()self.show_leaderboard_button Button(self.master, text显示排行榜, commandself.show_leaderboard)self.show_leaderboard_button.pack()self.stats_button Button(self.master, text查询统计, commandself.show_game_stats)self.stats_button.pack()self.stats_label Label(self.master, text)self.stats_label.pack()def set_username(self):self.username self.username_entry.get()self.username_label.config(text用户名 self.username)# 移除用户名输入框和确认按钮self.username_entry.pack_forget()self.username_button.pack_forget()def draw_grid(self):self.cv.delete(grid) # 清除之前的网格for i in range(self.size 1): # 绘制网格线self.cv.create_line(10, 10 i * 40, 10 self.size * 40, 10 i * 40, arrownone, tagsgrid)self.cv.create_line(10 i * 40, 10, 10 i * 40, 10 self.size * 40, arrownone, tagsgrid)def huaqi(self):self.cv.delete(lights) # 清除之前的灯for i in range(self.size):for u in range(self.size):if self.lights[i][u] you:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillyellow, width2, tagslights) # 亮灯else:self.cv.create_oval(i * 40 10, u * 40 10, (i 1) * 40 10, (u 1) * 40 10,outlinewhite, fillwhite, width2, tagslights) # 灭灯def reserve(self, x1, y1):if self.lights[x1][y1] wu:self.lights[x1][y1] youelse:self.lights[x1][y1] wudef luozi(self, event):x1 (event.x - 10) // 40y1 (event.y - 10) // 40print(x1, y1)self.reserve(x1, y1) # 翻转(x1,y1)处灯的状态# 以下翻转(x1,yI)周围的灯的状态#左侧灯的状态反转if x1 ! 0:self.reserve(x1 - 1, y1)# 右侧灯的状态反转if x1 ! self.size - 1:self.reserve(x1 1, y1)# 上侧灯的状态反转if y1 ! 0:self.reserve(x1, y1 - 1)# 下侧灯的状态反转if y1 ! self.size - 1:self.reserve(x1, y1 1)self.huaqi()self.flip_count 1def random_open_lights(self, difficulty):if difficulty easy:num_of_lights int(self.size * self.size * 0.2) # 20%的格子状态为翻转状态elif difficulty medium:num_of_lights int(self.size * self.size * 0.4) # 40%的格子状态为翻转状态elif difficulty hard:num_of_lights int(self.size * self.size * 0.6) # 60%的格子状态为翻转状态positions random.sample(range(self.size * self.size), num_of_lights) # 随机选择要打开的灯的位置for pos in positions:x pos // self.sizey pos % self.sizeself.reserve(x, y)def save_game_record(self):# 保存通关信息到数据库map_size self.sizedifficulty difficulty_var.get()completion_time datetime.now()total_clicks self.flip_countself.cursor.execute(INSERT INTO game_records (username, map_size, difficulty, completion_time, total_clicks)VALUES (?, ?, ?, ?, ?), (self.username, map_size, difficulty, completion_time, total_clicks))self.conn.commit() # 确保数据被写入数据库def show_leaderboard(self):leaderboard_window Toplevel(self.master)leaderboard_window.title(通关排行榜)leaderboard_frame Frame(leaderboard_window)leaderboard_frame.pack()map_size self.sizedifficulty difficulty_var.get()self.cursor.execute(SELECT username, completion_time, total_clicks FROM game_recordsWHERE map_size? AND difficulty?ORDER BY completion_time, total_clicks, (map_size, difficulty))records self.cursor.fetchall()if len(records) 0:messagebox.showinfo(提示, 暂无记录)else:for i, record in enumerate(records):username_label Label(leaderboard_frame, textrecord[0])username_label.grid(rowi, column0)completion_time_label Label(leaderboard_frame, textrecord[1])completion_time_label.grid(rowi, column1)total_clicks_label Label(leaderboard_frame, textrecord[2])total_clicks_label.grid(rowi, column2)def get_game_stats(self):self.cursor.execute(SELECT SUM(completion_time), SUM(total_clicks) FROM game_recordsWHERE username?, (self.username,))result self.cursor.fetchone()return resultdef show_game_stats(self):stats self.get_game_stats()total_time stats[0]total_clicks stats[1]self.stats_label.config(textf总时间{total_time} 秒翻转次数{total_clicks} 次)def reset_game(size, difficulty, username):game.username usernamegame.size sizegame.lights [[wu for _ in range(size)] for _ in range(size)]game.cv.config(widthsize * 40 10, heightsize * 40 10)game.draw_grid()game.random_open_lights(difficulty)game.huaqi()game.total_time 0game.flip_count 0game.start_time 0game.stats_label.config(text)def on_small():reset_game(5, difficulty_var.get(), game.username)def on_medium():reset_game(8, difficulty_var.get(), game.username)def on_large():reset_game(12, difficulty_var.get(), game.username)root Tk() game LightsOutGame(root)menu_frame Frame(root) menu_frame.pack()difficulty_var StringVar() difficulty_var.set(medium)small_button Button(menu_frame, text小, commandon_small) small_button.pack(sideLEFT)medium_button Button(menu_frame, text中, commandon_medium) medium_button.pack(sideLEFT)large_button Button(menu_frame, text大, commandon_large) large_button.pack(sideLEFT)difficulty_frame Frame(root) difficulty_frame.pack()easy_radio Radiobutton(difficulty_frame, text容易, variabledifficulty_var, valueeasy) easy_radio.pack(sideLEFT)medium_radio Radiobutton(difficulty_frame, text中等, variabledifficulty_var, valuemedium) medium_radio.pack(sideLEFT)hard_radio Radiobutton(difficulty_frame, text困难, variabledifficulty_var, valuehard) hard_radio.pack(sideLEFT)save_button Button(root, text保存通关信息, commandgame.save_game_record) save_button.pack()root.mainloop()# 关闭数据库连接 game.conn.close()相关问题 请描述你的系统详细设计提示按照需求分析列出概要功能点 答系统详细设计 创建一个名为LightsOutGame的类用于实现Lights Out游戏的逻辑和界面。 在初始化方法中设置游戏的大小、难度并创建一个二维数组来表示灯的状态。 创建游戏界面包括一个Canvas用于绘制网格和灯的状态一个Label用于显示用户名一个Entry和一个Button用于输入和确认用户名以及一些按钮用于选择游戏难度和操作。 实现灯的状态翻转和绘制网格、灯的方法。 实现随机打开一些灯的方法根据难度设置打开的灯的数量。 实现保存通关记录到数据库的方法包括用户名、地图大小、难度、完成时间和翻转次数。 实现显示排行榜和查询统计的方法从数据库中获取相应的记录并展示在界面上。 实现重置游戏的方法根据选择的地图大小和难度重新设置游戏参数并清空灯的状态和统计数据。 创建一个主窗口并将游戏对象放入其中启动主循环。 请通过原型图说明的方式展示你的界面详细设计 答 界面详细设计 主界面包括一个Canvas用于绘制网格和灯的状态一个Label用于显示用户名一个Entry和一个Button用于输入和确认用户名以及一些按钮用于选择游戏难度和操作。 用户名输入框和确认按钮位于顶部用于输入和确认用户名。 网格和灯的状态绘制在Canvas上根据灯的状态绘制不同的颜色和形状。 游戏难度选择按钮位于中间用于选择不同的难度。 排行榜和查询统计按钮位于底部用于显示排行榜和查询统计信息。 请通过ER图表结构说明的方式展示你的数据库详细设计 答 数据库详细设计 创建一个名为game_records的表用于存储通关记录。 表中包含以下字段id主键自增username用户名map_size地图大小difficulty难度completion_time完成时间total_clicks翻转次数。 使用SQLite数据库通过Python的sqlite3模块连接和操作数据库。 在游戏开始时创建表如果表已存在则不创建。 在保存通关记录时将相关信息插入到game_records表中。 在显示排行榜和查询统计时从game_records表中查询相应的记录并按照完成时间和翻转次数排序。 请按功能点顺序1-6依次展示你的程序运行截图答功能1 功能2 功能3 功能4 功能5 功能6 请讨论说明图形界面设计(GUI)包括哪些重要组成部分答图形界面设计(GUI)的重要组成部分包括 窗口用于承载界面的容器提供标题栏、边框和关闭按钮等功能。 组件用于构建界面的可视化元素如按钮、标签、文本框、下拉框等。 布局管理器用于控制组件在窗口中的位置和大小如pack、grid和place等。 事件处理用于响应用户的操作如点击按钮、输入文本等触发相应的事件处理函数。 图形绘制用于绘制图形元素如绘制网格、绘制灯的状态等。 2、请讨论说明在本实验中你应如何使用数据库支撑整个应用程序的正确运行 答在本实验中数据库用于支持整个应用程序的正确运行具体包括 创建数据库表game_records用于存储游戏记录。 在游戏通关时将通关信息插入到game_records表中。 在显示排行榜时从game_records表中查询对应难度和地图大小的游戏记录并在界面上显示。 3、其他关于完成本次实验作业中的心得与讨论 答本次实验是一个简单的游戏的实现通过使用Tkinter库构建了一个图形界面并使用SQLite数据库存储游戏记录。通过这个实验我学习到了如何使用Tkinter库创建图形界面以及如何使用SQLite数据库进行数据存储和查询。同时我也了解到了图形界面设计的重要组成部分和数据库的应用场景。这个实验对于我进一步掌握Python编程和图形界面开发有很大的帮助也提升了我的数据库操作能力。
http://www.yutouwan.com/news/389995/

相关文章:

  • 网站后台如何登陆设计网站大全
  • 河南网站建设服务公司广州越秀区口腔医院
  • vs2017 如何做网站怎么自己做个网站
  • 国外网站模版旅游网站大全
  • 在ps中如何做网站框架wordpress 评论 重复
  • 女网友叫我一起做优惠券网站方正悠黑使用网站建设侵权么
  • 给我免费看播放片优化网站标题名词解释
  • 所见即所得网站管理系统wordpress 不能登录
  • jsp网站开发四酷全书昆明网签备案查询
  • 做seo网站不用域名网站怎么搭建
  • 公司网站制作制作杭州室内设计公司排行榜
  • 网站开发 方案 报价单网站做推广页需要什么
  • 建设网站 (公司)网站建设及维护合同
  • 在线代理服务器网站什么网站可以自己做字
  • 公司网站自己创建百度网址大全pc版怎么下载
  • 镇江企业网站制作丽江网站开发找千素网
  • 一级a做爰片免费网站 小说男和女做暖暖网站
  • 可以做微信推文的网站万网阿里云域名查询
  • 河南网站建设运营域名注册公司搭建网站需要什么
  • 珠海微网站进入淘宝电商运营基础知识
  • 国内外html5网站建设状况wordpress 魔客
  • 本站3天更换一次域名yw补习吧 一家专门做家教的网站
  • 蓝众建站_专业网站建设网站没有内容 备案能成功吗
  • 广州网站设计服务商微信小程序商城需要多少钱
  • 有没有转门做乐器演奏的网站手机网页视频下载软件
  • 企业网站的价值建设银行新加坡招聘网站
  • 侠客推 网站建设增城网站开发
  • 网站专题策划页面怎么做手机兼职快递录单员
  • 境外电商平台入驻seo管理与优化期末试题
  • 桃城区网站制作公司下载中国建设银行app