You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:为扫雷游戏添加存档加载功能及复选框计数器

扫雷游戏功能实现方案

一、复选框计数器实现

复选框计数器用于统计已标记的地雷数量,和剩余地雷数对比,实现步骤如下:

  • 游戏初始化时,记录总地雷数 total_mines,并初始化已标记数 marked_count = 0
  • 给每个地雷标记按钮绑定点击事件:
    • 玩家标记地雷时,marked_count += 1,更新计数器显示
    • 玩家取消标记时,marked_count -= 1,更新计数器显示
  • 在界面添加文本控件,实时显示 剩余地雷数: {total_mines - marked_count}

示例代码片段:

# 初始化计数器
total_mines = 10
marked_count = 0

# 标记按钮点击事件
def on_mark_button_click(button):
    global marked_count
    if button.is_marked:
        button.is_marked = False
        marked_count -= 1
    else:
        button.is_marked = True
        marked_count += 1
    # 更新界面显示
    counter_label.config(text=f"剩余地雷: {total_mines - marked_count}")

二、存档与加载功能实现

1. 存档数据结构

需要保存的核心数据:

  • 棋盘尺寸(行数、列数)
  • 总地雷数
  • 每个格子的状态:是否已翻开、是否是地雷、周围地雷数、是否被标记
  • 当前游戏时间(可选)

2. 存档功能

  • 选择存档文件路径(比如 save_data.json)
  • 将数据序列化为JSON格式写入文件
  • 若文件不存在,自动创建新文件

示例代码片段:

import json
import os

def save_game(board_data, total_mines, marked_count, game_time):
    save_path = "save_data.json"
    # 构造存档字典
    save_data = {
        "board_size": (len(board_data), len(board_data[0])),
        "total_mines": total_mines,
        "marked_count": marked_count,
        "game_time": game_time,
        "grid_states": []
    }
    # 遍历棋盘收集格子状态
    for row in board_data:
        row_states = []
        for cell in row:
            row_states.append({
                "is_mine": cell.is_mine,
                "is_revealed": cell.is_revealed,
                "is_marked": cell.is_marked,
                "adjacent_mines": cell.adjacent_mines
            })
        save_data["grid_states"].append(row_states)
    
    # 写入文件,不存在则创建
    with open(save_path, "w") as f:
        json.dump(save_data, f, indent=4)

3. 加载功能

  • 检查存档文件是否存在,若不存在则初始化新游戏
  • 读取文件内容,反序列化为字典
  • 根据加载的数据恢复棋盘状态、计数器、游戏时间等

示例代码片段:

def load_game():
    save_path = "save_data.json"
    if not os.path.exists(save_path):
        # 文件不存在,返回新游戏初始数据
        return None
    
    with open(save_path, "r") as f:
        save_data = json.load(f)
    
    # 解析数据,恢复棋盘状态
    board_size = save_data["board_size"]
    total_mines = save_data["total_mines"]
    marked_count = save_data["marked_count"]
    game_time = save_data["game_time"]
    grid_states = save_data["grid_states"]
    
    # 根据grid_states重新创建棋盘对象
    board = []
    for row_idx in range(board_size[0]):
        row = []
        for col_idx in range(board_size[1]):
            cell_state = grid_states[row_idx][col_idx]
            cell = Cell(
                is_mine=cell_state["is_mine"],
                adjacent_mines=cell_state["adjacent_mines"]
            )
            cell.is_revealed = cell_state["is_revealed"]
            cell.is_marked = cell_state["is_marked"]
            row.append(cell)
        board.append(row)
    
    return board, total_mines, marked_count, game_time

三、功能整合建议

  • 在游戏菜单添加“保存游戏”和“加载游戏”选项,绑定对应函数
  • 加载游戏时,若存档文件不存在,直接启动新游戏
  • 实时更新复选框计数器,确保数据和界面同步

内容的提问来源于stack exchange,提问作者Даня Волков

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:46:04