5.23总结

发布时间 2023-05-23 21:12:36作者: 封织云

import os
import tkinter as tk
import random
import time
class MemoryGame:
def init(self, master):
self.master = master
self.master.title("记忆测试系统")
# 初始化游戏设置
self.level = tk.StringVar()
self.level.set("初级")
self.grid_size = 4
self.icons_per_row = 2
self.icons = ["A", "B", "C", "D", "E", "F", "G", "H"]
self.icons_shown = []
self.icons_clicked = []
self.time_start = None
self.time_end = None
self.score_board = []
# 创建界面元素
self.create_widgets()
# 创建 score_board.txt 文件
if not os.path.exists("score_board.txt"):
with open("score_board.txt", "w") as f:
pass

def create_widgets(self):
    # 创建级别选择框
    level_frame = tk.Frame(self.master)
    level_frame.pack(pady=10)
    level_label = tk.Label(level_frame, text="请选择级别:")
    level_label.pack(side=tk.LEFT, padx=5)
    level_option = tk.OptionMenu(level_frame, self.level, "初级", "中级", "高级", command=self.set_level)
    level_option.pack(side=tk.LEFT)
    # 创建测试区域
    self.grid_frame = tk.Frame(self.master)
    self.grid_frame.pack(pady=10)
    # 创建记分板
    score_frame = tk.Frame(self.master)
    score_frame.pack(pady=10)
    score_label = tk.Label(score_frame, text="成绩排行榜:")
    score_label.pack(side=tk.LEFT, padx=5)
    score_button = tk.Button(score_frame, text="查看成绩", command=self.show_score_board)
    score_button.pack(side=tk.LEFT)

def set_level(self, level):
    # 根据级别设置游戏参数
    if level == "初级":
        self.grid_size = 4
        self.icons_per_row = 2
    elif level == "中级":
        self.grid_size = 12
        self.icons_per_row = 4
    elif level == "高级":
        self.grid_size = 24
        self.icons_per_row = 6
    # 生成测试区域
    self.generate_grid()

def generate_grid(self):
    # 随机生成一组图标
    self.icons_shown = []
    for i in range(self.grid_size // 2):
        icon = random.choice(self.icons)
        self.icons_shown.append(icon)
        self.icons_shown.append(icon)
    random.shuffle(self.icons_shown)
    # 创建测试区域
    for widget in self.grid_frame.winfo_children():
        widget.destroy()
    for i in range(self.grid_size):
        button = tk.Button(self.grid_frame, text="", width=5, height=2, command=lambda i=i: self.click_icon(i))
        button.grid(row=i // self.icons_per_row, column=i % self.icons_per_row)
    # 重置游戏状态
    self.icons_clicked = []
    self.time_start = None
    self.time_end = None

def click_icon(self, index):
    # 记录点击时间
    if not self.time_start:
        self.time_start = time.time()
    # 显示图标
    icon = self.icons_shown[index]
    self.icons_clicked.append(icon)
    button = self.grid_frame.winfo_children()[index]
    button.configure(text=icon)
    # 判断是否连续单击出 n 个图标相同的方块
    n = 6 if self.level.get() == "初级" else 8 if self.level.get() == "中级" else 12
    if len(self.icons_clicked) >= n:
        if all(icon == self.icons_clicked[-1] for icon in self.icons_clicked[-n:]):
            self.show_dialog()
    elif len(self.icons_clicked) > 1 and icon != self.icons_clicked[-2]:
        for i in range(-1, -len(self.icons_clicked)-1, -1):
            if self.icons_clicked[i] != icon:
                button = self.grid_frame.winfo_children()[self.icons_shown.index(self.icons_clicked[i])]
                button.configure(text="")
                self.icons_clicked.pop(i)
            else:
                break

def show_dialog(self):
    # 停止计时
    self.time_end = time.time()
    # 显示成绩对话框
    dialog = tk.Toplevel(self.master)
    dialog.title("保存成绩")
    dialog.geometry("200x150")
    time_label = tk.Label(dialog, text="用时:%.2f秒" % (self.time_end - self.time_start))
    time_label.pack(pady=10)
    save_button = tk.Button(dialog, text="保存成绩", command=lambda: self.save_score(dialog))
    save_button.pack(pady=10)

def save_score(self, dialog):
    # 保存成绩
    score = {"level": self.level.get(), "time": self.time_end - self.time_start}
    self.score_board.append(score)
    self.score_board.sort(key=lambda x: x["time"])
    if len(self.score_board) > 10:
        self.score_board = self.score_board[:10]
    with open("score_board.txt", "w") as f:
        for score in self.score_board:
            f.write("%s %.2f\n" % (score["level"], score["time"]))
    self.show_score_board()
    dialog.destroy()

def show_score_board(self):
    # 显示成绩排行榜
    dialog = tk.Toplevel(self.master)
    dialog.title("成绩排行榜")
    dialog.geometry("200x200")
    with open("score_board.txt", "r") as f:
        scores = f.readlines()
    for i, score in enumerate(scores):
        score_label = tk.Label(dialog, text="%d. %s" % (i+1, score))
        score_label.pack()

if name == "main":
root = tk.Tk()
app = MemoryGame(root)
root.mainloop()