文章目录
- 前言
- 一、设计表
- 二、关键代码
- 三、运行结果
- 小地图,容易难度:
- 中地图,中等难度:
- 大地图,困难难度:
- 四、完整代码链接
- 总结
前言
这是一个Python实验作业,内容如下:
题目要求:请完成《关灯游戏》,并完成以下扩展内容:
扩展内容:
-
请设计并实现界面功能,允许玩家选择初始地图的大小,分别为:小(5x5),中(8x8),大(12x10),玩家选择之后立即刷新窗口界面并重设地图
-
请设计并实现界面功能,允许玩家选择游戏难度,分别为:
容易:一开始有20%的格子状态为翻转状态
中等:一开始有40%的格子状态为翻转状态
困难:一开始有60%的格子状态为翻转状态 -
游戏开始之前,提示玩家输入唯一的用户名,用于保留该玩家的闯关记录
-
按照玩家选择的地图大小和难度开始游戏,游戏过程中记录玩家闯关的总时间以及翻转次数(即开关灯的次数)
-
玩家通关成功后,保存相关信息到数据库,表结构可以自定,但应当至少包含以下信息:
- 玩家选择的地图大小
- 玩家选择的难度
- 玩家通关的日期时间
- 玩家通关所用的总时间
- 玩家通关所用的总点击次数
补充说明:
(1) 你可以使用任何python相关技术实现图形界面,包括但不限于Tkinter, wxPython, pyside6等,但必须界面和功能完整,设计布局合理美观
(2) 你可以使用任何数据库进行数据保存,包括任何的关系数据库或非关系数据库,但不得直接使用文件或CSV
一、设计表
使用mysql数据库,设计两张表,user表用来记录用户基本信息,play_info表用来记录用户游戏过程信息
二、关键代码
# 注册
def register(action):username = actionwith conn.cursor() as cursor:query = "INSERT INTO user (user_name) VALUES (%s)"cursor.execute(query, username)conn.commit()print("注册登录成功!")# 登录
def login(action):username = actionwith conn.cursor() as cursor:query = "SELECT * FROM user WHERE user_name=%s"cursor.execute(query, username)if cursor.fetchall():print("登录成功!")else:print("该玩家为第一次登录,自动为其注册")register(action)# 选择地图
def get_map(prompt):while True:try:user_input = int(input(prompt))if user_input < 1 or user_input > 10:print("输入无效,请输入1-3的数字。")else:return user_input except ValueError:print("输入无效,请输入一个整数。")# 选择难度
def get_difficulty(prompt):while True:try:user_input = int(input(prompt))if user_input < 1 or user_input > 10:print("输入无效,请输入1-3的数字。")else:return user_input except ValueError:print("输入无效,请输入一个整数。")
# 画表格
def draw_table(row,width,height):for i in range(0 ,row):cv.create_line(10, 10+i*40, width, 10+i*40, arrow='none')cv.create_line(10+i*40, 10, 10+i*40, height, arrow='none') # 画灯
def draw_lamp(row,column):for i in range(0,row):for u in range(0,column):if l[i][u] == 'you':# 亮灯cv.create_oval(i*40+10, u*40+10, (i+1)*40+10,(u+1)*40+10, outline='white', fill='yellow', width=2)# 灭灯else:cv.create_oval(i*40+10, u*40+10, (i+1)*40+10,(u+1)*40+10, outline='white', fill='white', width=2)
# 单击事件函数
def do_event(event):x1 = (event.x - 10) // 40y1 = (event.y - 10) // 40# 翻转(x1,y1)处灯的状态reserve(x1, y1)# 翻转(x1,y1)周围灯的状态# 左侧灯的状态反转if x1 != 0:reserve(x1 - 1, y1)# 右侧灯的状态反转if x1 != row-1:reserve(x1 + 1, y1)# 上侧灯的状态反转if y1 != 0:reserve(x1, y1 - 1)# 下侧灯的状态反转if y1 != column-1:reserve(x1, y1 + 1)draw_lamp(row,column)
三、运行结果
小地图,容易难度:
中地图,中等难度:
大地图,困难难度:
四、完整代码链接
代码下载链接
总结
@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!