文章目錄
- 前言
- 一、設計表
- 二、關鍵代碼
- 三、運行結果
- 小地圖,容易難度:
- 中地圖,中等難度:
- 大地圖,困難難度:
- 四、完整代碼鏈接
- 總結
前言
這是一個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)
三、運行結果
小地圖,容易難度:
中地圖,中等難度:
大地圖,困難難度:
四、完整代碼鏈接
代碼下載鏈接
總結
@作者:加辣椒了嗎?
簡介:憨批大學生一枚,喜歡在博客上記錄自己的學習心得,也希望能夠幫助到你們!