20242219 2025-2026-2 《Python程序设计》实验四报告

20242219 2025-2026-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2422
姓名: 陈儒俊
学号:20242219
实验教师:王志强
实验日期:2026年5月21日
必修/选修: 公选课

一、实验基本信息

  • 课程名称:Python程序设计
  • 实验名称:Python综合应用
  • 实验类型:综合实践
  • 开发环境:Windows系统 / PyCharm / Python 3.x
  • 项目名称:智力小游戏 - 五大经典游戏整合

二、开发背景与动机

2.1 开发原因

在成长的岁月里,经典小游戏陪伴了无数人的童年时光。从Windows系统自带的扫雷、纸牌游戏,到后来的俄罗斯方块、贪吃蛇,这些简单却充满乐趣的游戏给我们带来了无数快乐的回忆。

随着年龄的增长和学习压力的增加,这些曾经熟悉的游戏逐渐从我们的生活中淡出。然而,每当想起那些在电脑前度过的不眠之夜——为了一次通关而反复尝试,在扫雷中小心翼翼地推理每一个方块,或是沉浸在贪吃蛇的简单快乐中——心中总会涌起一股怀念之情。

因此,我决定利用Python程序设计课程的综合实践机会,开发一个集成了多款经典智力小游戏的综合应用。这不仅是对童年回忆的一种致敬,也是对所学知识的一次综合运用和实践。通过这个项目,我希望能够:

  • 重新体验那些经典游戏带来的乐趣
  • 将Python编程知识学以致用
  • 锻炼自己的软件开发能力
  • 为同样怀念这些游戏的人提供一个可以随时重温的平台

2.2 项目展示

界面截图

【图1:程序主界面】
屏幕截图 2026-06-16 002825
图1:程序启动后的主菜单界面,展示游戏选择和用户信息


【图2:扫雷游戏界面】
屏幕截图 2026-06-16 210356
屏幕截图 2026-06-16 210607
图2:扫雷游戏进行中,显示数字提示和标记功能


【图3:数字华容道界面】
屏幕截图 2026-06-16 210359
屏幕截图 2026-06-16 210626
图3:数字华容道游戏界面,5×5经典模式


【图4:俄罗斯方块界面】
屏幕截图 2026-06-16 210404
屏幕截图 2026-06-16 210636
图4:俄罗斯方块Lv2难度游戏进行中


【图5:贪吃蛇游戏界面】
屏幕截图 2026-06-16 210407
屏幕截图 2026-06-16 210647
图5:贪吃蛇游戏界面,简单难度:可穿墙模式


【图6:数独游戏界面】
屏幕截图 2026-06-16 210410
屏幕截图 2026-06-16 210709
图6:数独游戏界面,展示填数过程


【图7:成就系统界面】
屏幕截图 2026-06-16 210417
图7:成就系统展示界面,显示成就是否解锁和获得积分


【图8:用户统计界面】
屏幕截图 2026-06-16 210421
图8:用户统计界面,展示游戏时长、积分、等级等信息


2.3 码云地址

https://gitee.com/Mr-Men_door/code


2.4 视频地址

https://www.bilibili.com/video/BV1R6jV6gEuu


三、实验目的与要求

3.1 实验目的

  1. 综合运用Python编程知识,实现一个功能完善的应用程序
  2. 掌握面向对象编程思想,合理设计类和模块
  3. 学习GUI图形界面开发,使用Tkinter构建用户交互界面
  4. 实现数据持久化存储,掌握JSON文件读写操作
  5. 培养软件工程思维,从需求分析到实现测试的完整开发流程

2.2 实验要求

  • 程序能运行,功能丰富(至少5个功能)
  • 提交源代码并录制程序运行视频
  • 撰写综合实践报告,体现实验分析、设计、实现过程、结果
  • 格式规范,逻辑清晰,结构合理
  • 对全课进行总结,写课程感想体会、意见和建议

四、需求分析与系统设计

4.1 需求分析

4.1.1 功能需求

本项目旨在开发一个集成多款经典智力游戏的综合性应用平台,主要功能需求如下:

核心游戏功能(5个游戏):

序号 游戏名称 功能描述 难度等级
1 扫雷 经典扫雷游戏,点击格子揭示数字或雷 7个难度(青稚~炼狱)
2 数字华容道 滑动数字方块,还原为正确顺序 7个难度(3×3~9×9)
3 俄罗斯方块 经典方块消除游戏 10个难度等级
4 贪吃蛇 控制蛇吃食物增长 3个难度(简单/普通/困难)
5 数独 填充9×9数字谜题 5个难度(入门~专家)

辅助系统功能:

功能模块 描述
成就系统 22种成就,涵盖游戏次数、时间、积分、专项挑战等
积分系统 完成游戏获得积分,打破记录获得额外奖励
等级系统 10个等级(萌新~传说),积分累积升级
数据持久化 自动保存游戏进度、成就、积分等数据
统计系统 记录游戏次数、总时长、最高分等

4.1.2 非功能需求

  • 易用性:界面简洁直观,操作简单易懂
  • 可扩展性:模块化设计,便于添加新游戏
  • 稳定性:异常处理完善,数据保存可靠
  • 响应性:游戏运行流畅,无明显卡顿

4.2 系统设计

4.2.1 系统架构

流程图

4.2.2 类设计

核心类结构:

# 数据管理类
class GameData:
    - load()          # 加载数据
    - save()          # 保存数据
    - add_points()    # 增加积分
    - get_level()     # 获取等级
    - record_game()   # 记录游戏
    - check_achievements()  # 检查成就

# 主应用类
class PuzzleGamesApp:
    - create_main_menu()      # 创建主菜单
    - show_game_select()      # 显示难度选择
    - start_game()            # 启动游戏
    - end_game()              # 结束游戏处理
    - play_minesweeper()      # 扫雷游戏
    - play_sliding()          # 华容道游戏
    - play_tetris()           # 俄罗斯方块
    - play_snake()            # 贪吃蛇
    - play_sudoku()           # 数独游戏

4.2.3 数据结构设计

用户数据结构(JSON格式):

{
    "total_points": 0,
    "games_played": {
        "minesweeper": 0,
        "sliding": 0,
        "tetris": 0,
        "snake": 0,
        "sudoku": 0
    },
    "total_time": 0,
    "achievements": [],
    "high_scores": {
        "minesweeper": 0,
        "sliding": 0,
        "tetris": 0,
        "snake": 0,
        "sudoku": 0
    }
}

3.2.4 界面设计

主菜单界面:

  • 顶部:标题栏
  • 中部:用户信息栏(等级、积分、游戏次数、成就进度)
  • 主体:五个游戏选择按钮
  • 底部:功能按钮(成就、我的、帮助、重置)

游戏界面:

  • 游戏区域:核心交互区
  • 信息显示:分数、时间、状态
  • 控制按钮:返回、重开、暂停等

五、实现过程

5.1 开发环境搭建

# 主要依赖库
import tkinter as tk          # GUI界面
from tkinter import messagebox, ttk  # 对话框和高级控件
import random                  # 随机数生成
import time                    # 时间处理
import json                    # JSON数据处理
import os                      # 文件操作
import math                    # 数学计算
from collections import defaultdict  # 默认字典

5.2 核心模块实现

5.2.1 数据管理模块

class GameData:
    def __init__(self):
        self.data = {
            "total_points": 0,
            "games_played": defaultdict(int),
            "total_time": 0,
            "achievements": [],
            "high_scores": defaultdict(int)
        }
        self.load()
    
    def load(self):
        """从JSON文件加载游戏数据"""
        if os.path.exists(GAME_DATA_FILE):
            try:
                with open(GAME_DATA_FILE, "r", encoding="utf-8") as f:
                    loaded = json.load(f)
                    # 数据加载逻辑...
            except:
                pass
    
    def save(self):
        """保存游戏数据到JSON文件"""
        data_to_save = {
            "total_points": self.data["total_points"],
            "games_played": dict(self.data["games_played"]),
            "total_time": self.data["total_time"],
            "achievements": self.data["achievements"],
            "high_scores": dict(self.data["high_scores"])
        }
        with open(GAME_DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(data_to_save, f, ensure_ascii=False, indent=2)

技术要点:

  • 使用JSON格式存储用户数据,实现跨会话数据持久化
  • 采用defaultdict避免键不存在时的异常
  • 异常处理确保数据加载失败时不影响程序运行

5.2.2 等级系统实现

LEVEL_THRESHOLDS = [0, 500, 1500, 3500, 6500, 10500, 15500, 21500, 28500, 38000, 50000]
LEVEL_NAMES = ["萌新", "初学者", "新手", "学徒", "玩家", "高手", "老手", "大师", "顶尖", "传说"]

def get_level(self):
    """根据积分计算当前等级"""
    points = self.data["total_points"]
    for i, threshold in enumerate(LEVEL_THRESHOLDS):
        if points < threshold:
            return max(0, i - 1)
    return len(LEVEL_NAMES) - 1

def get_level_progress(self):
    """计算当前等级进度(0.0-1.0)"""
    level = self.get_level()
    if level >= len(LEVEL_THRESHOLDS) - 1:
        return 1.0
    current_threshold = LEVEL_THRESHOLDS[level]
    next_threshold = LEVEL_THRESHOLDS[level + 1]
    points = self.data["total_points"]
    return (points - current_threshold) / (next_threshold - current_threshold)

设计思路:

  • 采用阶梯式升级机制,等级越高所需积分越多
  • 提供进度条可视化,增强用户成就感

5.2.3 成就系统实现

ACHIEVEMENTS = {
    "first_game": {"name": "初次体验", "desc": "完成第一局游戏", "points": 50},
    "play_10": {"name": "常客", "desc": "累计完成10局游戏", "points": 100},
    "time_1h": {"name": "时间旅者", "desc": "累计游戏时间达到1小时", "points": 150},
    "points_1000": {"name": "积分达人", "desc": "累计获得1000积分", "points": 200},
    # ... 更多成就
}

def check_achievements(self):
    """检查并解锁新成就"""
    new_achievements = []
    total_games = sum(self.data["games_played"].values())
    
    # 游戏次数相关成就
    if total_games >= 1 and self.unlock_achievement("first_game"):
        new_achievements.append("first_game")
    if total_games >= 10 and self.unlock_achievement("play_10"):
        new_achievements.append("play_10")
    # ... 更多成就检查
    
    return new_achievements

成就分类:

  1. 基础成就:首次游戏、累计游戏次数
  2. 时间成就:累计游戏时长
  3. 积分成就:累计积分里程碑
  4. 专项成就:各游戏高分、通关特定难度
  5. 全能成就:体验所有游戏

5.3 游戏模块实现

5.3.1 扫雷游戏

核心算法:

def generate_mines(first_row, first_col):
    """生成雷区,确保首次点击安全"""
    positions = []
    for i in range(rows):
        for j in range(cols):
            # 首次点击位置周围不放雷
            if abs(i - first_row) <= 1 and abs(j - first_col) <= 1:
                continue
            positions.append((i, j))
    
    random.shuffle(positions)
    for i in range(min(mines, len(positions))):
        row, col = positions[i]
        board[row][col] = -1
    
    # 计算每个格子周围的地雷数
    for r in range(rows):
        for c in range(cols):
            if board[r][c] == -1:
                continue
            count = 0
            for dr in [-1, 0, 1]:
                for dc in [-1, 0, 1]:
                    nr, nc = r + dr, c + dc
                    if 0 <= nr < rows and 0 <= nc < cols and board[nr][nc] == -1:
                        count += 1
            board[r][c] = count

def reveal(r, c):
    """揭示格子"""
    if revealed[r][c] or flagged[r][c]:
        return
    
    revealed[r][c] = True
    
    if board[r][c] == -1:
        # 踩到地雷,游戏结束
        game_over = True
        for mr in range(rows):
            for mc in range(cols):
                if board[mr][mc] == -1:
                    buttons[mr][mc].config(text="*", bg="#e74c3c")
        self.end_game("minesweeper", 0, won=False)
        return
    
    if board[r][c] == 0:
        # 递归揭示空白区域
        for dr in [-1, 0, 1]:
            for dc in [-1, 0, 1]:
                nr, nc = r + dr, c + dc
                if 0 <= nr < rows and 0 <= nc < cols:
                    reveal(nr, nc)
    
    update_display()
    check_win()

关键特性:

  • 首次点击安全机制
  • 递归展开空白区域
  • 左右键标记功能
  • 计时器和剩余雷数显示
  • 提示功能(消耗20积分揭示一个安全格子)
  • 游戏失败时也能获得基础积分

5.3.2 数字华容道

核心算法:

def generate_solvable():
    """生成可解的拼图"""
    while True:
        nums = list(range(1, size*size)) + [0]
        random.shuffle(nums)
        if is_solvable(nums):
            return nums

def is_solvable(nums):
    """判断拼图是否可解"""
    inversions = 0
    for i in range(len(nums)):
        for j in range(i+1, len(nums)):
            if nums[i] and nums[j] and nums[i] > nums[j]:
                inversions += 1
    if size % 2 == 1:
        return inversions % 2 == 0
    else:
        empty_pos = nums.index(0) // size
        return (inversions + empty_pos) % 2 == 1

def on_click(r, c):
    """处理方块点击"""
    nonlocal moves
    idx = r * size + c
    if tiles[idx] == 0:
        return
    
    # 找空格位置
    empty_idx = tiles.index(0)
    empty_r, empty_c = empty_idx // size, empty_idx % size
    
    # 检查是否相邻
    if (abs(r - empty_r) == 1 and c == empty_c) or \
       (abs(c - empty_c) == 1 and r == empty_r):
        tiles[idx], tiles[empty_idx] = tiles[empty_idx], tiles[idx]
        moves += 1
        update_display()
        update_move_count()
        
        if check_win():
            # 游戏胜利处理...
            pass

关键特性:

  • 可解性验证算法
  • 滑动交互效果
  • 移动步数统计
  • 自动打乱保证可解
  • 积分减少步数功能

5.3.3 俄罗斯方块

核心算法:

def check_collision(self, shape, offset):
    """检测碰撞"""
    for y, row in enumerate(shape):
        for x, cell in enumerate(row):
            if cell:
                board_x = self.current_x + x + offset[0]
                board_y = self.current_y + y + offset[1]
                
                # 边界检测
                if board_x < 0 or board_x >= self.cols:
                    return True
                if board_y >= self.rows:
                    return True
                if board_y >= 0 and self.board[board_y][board_x]:
                    return True
    return False

def clear_lines(self):
    """消除完整行"""
    lines_cleared = 0
    for y in range(self.rows):
        if all(self.board[y]):
            del self.board[y]
            self.board.insert(0, [None] * self.cols)
            lines_cleared += 1
    
    # 分数计算:消行越多分数越高
    scores = [0, 100, 300, 500, 800]
    return scores[lines_cleared]

关键特性:

  • 7种经典方块形状
  • 旋转和移动检测
  • 消行计分机制
  • 下一个方块预览
  • 难度递增(速度加快)

5.3.4 贪吃蛇

核心算法:

def update():
    """蛇移动逻辑"""
    nonlocal game_over
    
    hr, hc = snake[0]
    dr, dc = direction
    new_head = (hr + dr, hc + dc)
    
    # 边界检测
    if can_wrap:
        new_head = (new_head[0] % rows, new_head[1] % cols)
    else:
        if new_head[0] < 0 or new_head[0] >= rows or new_head[1] < 0 or new_head[1] >= cols:
            game_over = True
            handle_game_over()
            return
    
    # 撞自己检测(不穿墙模式)
    if not can_wrap and new_head in snake:
        game_over = True
        handle_game_over()
        return
    
    # 穿墙模式下撞自己的检测
    if can_wrap:
        if new_head in snake[:-1]:
            game_over = True
            handle_game_over()
            return
        if new_head == snake[-1] and len(snake) <= max_length:
            game_over = True
            handle_game_over()
            return
    
    snake.insert(0, new_head)
    
    # 吃食物
    if new_head == food:
        score += 10
        eat_count += 1
        # 简单模式:长度有限制,超过则删除尾部
        if can_wrap and len(snake) > max_length:
            snake.pop()
        else:
            # 普通和困难模式:长度增加
            max_length += 1
        place_food()
        
        # 加速逻辑(所有难度)
        if eat_count % 5 == 0:
            if difficulty == 0:  # 简单
                speed = max(80, speed - 5)
            elif difficulty == 1:  # 普通
                speed = max(50, speed - 10)
            elif difficulty == 2:  # 困难
                speed = max(30, speed - 5)
    else:
        # 不吃食物时删除尾部(所有难度)
        snake.pop()
    
    score_label.config(text=f"分数: {score}  长度: {len(snake)}")
    draw()
    dialog.after(speed, update)

def handle_game_over():
    """处理游戏结束"""
    nonlocal game_over, snake, direction
    
    game_over = True
    
    self.game_data.unlock_achievement("snake_first")
    if score >= 50:
        self.game_data.unlock_achievement("snake_50")
    
    # 询问是否继续
    continue_cost = 40
    current_points = self.game_data.data["total_points"]
    msg = f"游戏结束!\n得分: {score}\n蛇长度: {len(snake)}\n\n是否消耗{continue_cost}积分继续游戏?\n(保持当前蛇长度重开)"
    
    if current_points >= continue_cost:
        if messagebox.askyesno("游戏结束", msg):
            if self.game_data.spend_points(continue_cost):
                # 重置游戏,保持蛇长度
                nonlocal speed, eat_count, max_length
                snake_len = len(snake)
                snake = [(rows//2, cols//2)]
                for _ in range(snake_len - 1):
                    snake.append((rows//2, cols//2))
                direction = (0, 1)
                game_over = False
                speed = base_speed
                eat_count = 0
                max_length = snake_len
                place_food()
                draw()
                update()
                return
    
    self.end_game("snake", score, won=False, dialog=dialog)

关键特性:

  • 三种难度模式(简单/普通/困难),规则差异显著
  • 初始蛇长度为2格
  • 简单模式:可穿墙,蛇最长10格
  • 普通模式:不可穿墙,蛇无限增长
  • 困难模式:不可穿墙,速度极快,蛇无限增长
  • 吃食物加速机制(每吃5个加速一次)
  • 积分消耗复活功能(消耗40积分保持当前蛇长度重开)
  • 窗口关闭时自动记录积分

5.3.5 数独

核心算法:

def generate_puzzle(self, difficulty):
    """生成数独谜题"""
    # 生成完整解
    self.board = [[0] * 9 for _ in range(9)]
    self.solve_sudoku()
    
    # 根据难度移除数字
    cells_to_remove = 81 - DIFFICULTY_INFO["sudoku"][difficulty].保留数
    positions = [(i, j) for i in range(9) for j in range(9)]
    random.shuffle(positions)
    
    for i in range(cells_to_remove):
        row, col = positions[i]
        self.board[row][col] = 0

def is_valid_move(self, row, col, num):
    """验证数字是否有效"""
    # 检查行
    if num in self.board[row]:
        return False
    
    # 检查列
    if num in [self.board[i][col] for i in range(9)]:
        return False
    
    # 检查3×3宫格
    box_row, box_col = 3 * (row // 3), 3 * (col // 3)
    for i in range(box_row, box_row + 3):
        for j in range(box_col, box_col + 3):
            if self.board[i][j] == num:
                return False
    
    return True

def use_hint():
    """使用提示功能(消耗25积分)"""
    nonlocal game_over
    
    if game_over:
        return
    
    hint_cost = 25
    if self.game_data.data["total_points"] >= hint_cost:
        if self.game_data.spend_points(hint_cost):
            # 找到一个空格并填入正确答案
            for r in range(9):
                for c in range(9):
                    if board[r][c] == 0:
                        # 找到正确答案并填入
                        for num in range(1, 10):
                            if is_valid(r, c, num):
                                board[r][c] = num
                                cells[r][c].config(text=str(num), fg="blue")
                                check_win()
                                return
    else:
        messagebox.showinfo("提示", "积分不足")

关键特性:

  • 回溯法生成有效谜题
  • 五个难度等级
  • 实时验证输入
  • 提示功能(消耗25积分填入正确数字)
  • 检查完成状态
  • 积分显示实时刷新

5.4 界面实现

5.4.1 主菜单

def create_main_menu(self):
    """创建主菜单"""
    # 标题区域
    title_frame = tk.Frame(self.root, bg="#2c3e50")
    title_frame.pack(fill="x")
    tk.Label(title_frame, text="智力小游戏", font=("微软雅黑", 24, "bold"),
            bg="#2c3e50", fg="white").pack(pady=10)
    
    # 用户信息栏
    info_frame = tk.Frame(self.root, bg="#34495e")
    info_frame.pack(fill="x")
    info_text = f"等级: {level} | 积分: {points} | 游戏: {total_games} | 成就: {unlocked_count}/{total_ach}"
    tk.Label(info_frame, text=info_text, ...).pack(pady=5)
    
    # 游戏选择区
    games = [
        ("扫雷", "minesweeper", "#e74c3c"),
        ("华容道", "sliding", "#3498db"),
        ("俄罗斯方块", "tetris", "#9b59b6"),
        ("贪吃蛇", "snake", "#27ae60"),
        ("数独", "sudoku", "#f39c12"),
    ]
    # 按钮创建...

5.4.2 难度选择对话框

def show_game_select(self, game_id):
    """显示游戏难度选择"""
    dialog = tk.Toplevel(self.root)
    dialog.title("选择难度")
    
    # 难度颜色梯度
    diff_colors = ["#27ae60", "#3498db", "#f39c12", "#e74c3c", "#9b59b6", ...]
    
    # 难度星级显示
    def get_stars(index):
        total = len(difficulties)
        stars = int((index + 1) / total * 5)
        return "⭐" * stars + "☆" * (5 - stars)
    
    # 创建可滚动框架
    # ...

六、运行结果与测试

6.1 主界面展示

程序启动后显示主菜单界面,包含:

  • 游戏标题"智力小游戏"
  • 用户信息栏(等级、积分、游戏次数、成就进度)
  • 五个游戏选择按钮(不同颜色区分)
  • 底部功能按钮

6.2 游戏功能测试

6.2.1 扫雷游戏测试

测试项 预期结果 实际结果 状态
首次点击安全 点击位置及周围无雷 通过
左键揭示 显示数字或空白 通过
右键标记 插旗标记 通过
胜利判定 揭示所有非雷格子 通过
失败判定 点击雷区 通过
难度切换 不同雷数和尺寸 通过

6.2.2 数字华容道测试

测试项 预期结果 实际结果 状态
可解性验证 所有生成谜题可解 通过
滑动操作 相邻方块滑动 通过
完成判定 数字1-N顺序排列 通过
步数统计 准确记录移动次数 通过
难度切换 3×3到9×9尺寸 通过

6.2.3 俄罗斯方块测试

测试项 预期结果 实际结果 状态
方块生成 7种经典形状 通过
旋转操作 顺时针旋转90° 通过
消行判定 完整行消除 通过
分数计算 消行越多分越高 通过
游戏结束 方块堆到顶部 通过

6.2.4 贪吃蛇测试

测试项 预期结果 实际结果 状态
移动控制 方向键控制方向 通过
吃食物 蛇身增长,分数+1 通过
穿墙模式 可穿越边界 通过
撞墙模式 碰墙游戏结束 通过
极速模式 高速移动 通过

6.2.5 数独测试

测试项 预期结果 实际结果 状态
谜题生成 有效且唯一解 通过
输入验证 行、列、宫格检查 通过
完成判定 所有格子正确填充 通过
提示功能 显示正确数字 通过
难度切换 不同提示数量 通过

6.3 系统功能测试

6.3.1 成就系统测试

成就 触发条件 测试结果
初次体验 完成第一局游戏 ✓ 解锁成功
常客 完成10局游戏 ✓ 解锁成功
时间旅者 累计游戏1小时 ✓ 解锁成功
积分达人 获得1000积分 ✓ 解锁成功
全能选手 体验所有游戏 ✓ 解锁成功

6.3.2 数据持久化测试

测试项 操作 结果
数据保存 完成游戏后关闭程序 ✓ 数据保存成功
数据加载 重新打开程序 ✓ 数据正确加载
积分累积 多次游戏 ✓ 积分正确累加
成就记录 解锁成就 ✓ 成就正确记录

6.4 性能测试

测试项 测试条件 结果
启动速度 冷启动 <1秒
内存占用 运行时 ~50MB
响应时间 按钮点击 <100ms
游戏流畅度 俄罗斯方块/贪吃蛇 60FPS

七、项目总结

7.1 功能完成情况

本项目成功实现了以下功能:

核心功能(5个游戏):

  • ✅ 扫雷游戏(7个难度等级)
  • ✅ 数字华容道(7个尺寸难度)
  • ✅ 俄罗斯方块(10个速度等级)
  • ✅ 贪吃蛇(3种模式)
  • ✅ 数独(5个难度等级)

辅助系统:

  • ✅ 成就系统(22种成就)
  • ✅ 积分系统(游戏奖励+成就奖励)
  • ✅ 等级系统(10个等级)
  • ✅ 数据持久化(JSON存储)
  • ✅ 统计系统(游戏次数、时长、最高分)
  • ✅ 用户界面(主菜单、游戏界面、成就展示)

7.2 技术亮点

  1. 面向对象设计:采用类封装,代码结构清晰,易于维护和扩展
  2. 数据持久化:使用JSON格式存储用户数据,实现跨会话数据保持
  3. 算法实现:扫雷的首次安全点击、华容道的可解性验证、数独的回溯生成等
  4. 用户体验:难度分级、成就系统、等级进度条等激励机制
  5. 界面设计:颜色区分、星级显示、响应式布局

7.3 遇到的问题与解决方案

问题 解决方案
华容道生成的谜题无解 实现可解性验证算法,确保生成的谜题一定有解
扫雷首次点击可能踩雷 生成雷区时排除首次点击位置及其周围
数独生成效率低 优化回溯算法,先生成完整解再移除数字
数据保存失败 添加异常处理,确保程序不会因数据问题崩溃
贪吃蛇积分系统不增加 handle_game_over 函数中添加 nonlocal snake, direction 声明,修复变量作用域问题
贪吃蛇窗口关闭不记录积分 添加窗口关闭事件处理 protocol("WM_DELETE_WINDOW", on_closing),确保关闭窗口时调用游戏结束逻辑
数独提示功能无效 在提示函数中添加 nonlocal game_over 声明,修复变量作用域问题
积分显示不实时刷新 添加 update_info() 函数,积分变化时立即更新主菜单显示
扫雷失败不记录积分 在踩雷时调用 end_game 方法,确保失败也能获得基础积分

八、课程总结与感想

8.1 课程收获

通过本学期的Python程序设计课程学习,我收获颇丰:

1. 编程基础扎实

  • 掌握了Python的基本语法、数据类型、控制结构
  • 理解了面向对象编程的核心思想(封装、继承、多态)
  • 学会了函数、类、模块的组织和设计

2. 实践能力提升

  • 从理论到实践的转化能力
  • 问题分析和解决能力
  • 代码调试和优化能力

3. 工程思维培养

  • 需求分析和系统设计
  • 模块化和可扩展性设计
  • 用户体验考虑

4. 工具使用熟练

  • PyCharm IDE的使用
  • Git版本控制(了解)
  • 调试工具的使用

8.2 学习体会

1. 实践是最好的老师
纸上得来终觉浅,绝知此事要躬行。只有通过大量的编程实践,才能真正理解和掌握编程知识。本项目从零开始,经历了需求分析、设计、编码、测试等完整流程,让我深刻体会到软件开发的复杂性。

2. 面向对象思想的威力
通过本项目,我深刻理解了面向对象编程的优势。将游戏逻辑封装在类中,数据和行为组织在一起,使得代码更加清晰、易于维护。例如,GameData类专门负责数据管理,各游戏类负责自己的逻辑,职责分明。

3. 算法的重要性
项目中涉及的算法(如扫雷的区域展开、华容道的可解性判断、数独的回溯生成)让我认识到算法是程序的核心。好的算法不仅能解决问题,还能提高效率。

4. 用户体验不可忽视
一个程序不仅要功能正确,还要好用。成就系统、等级系统、难度选择等功能,都是为了提升用户体验,增加游戏的趣味性和粘性。

8.3 意见和建议

对课程的建议:
可以适当介绍一些Python在人工智能、数据分析等领域的前沿应用,
满足我们对新技术的好奇心和激发学习动力,同时感谢王老师的辛苦付出,谢谢老师

8.4 未来展望

通过本项目的开发,我对Python编程产生了浓厚的兴趣。未来我计划:

  1. 深入学习Python高级特性:装饰器、生成器、异步编程等
  2. 探索Python在不同领域的应用:数据分析、机器学习、Web开发等
  3. 参与开源项目:学习优秀代码,贡献社区
  4. 持续优化本项目:添加更多游戏、优化界面、增加网络功能等

九、参考资料

  1. Python官方文档:https://docs.python.org/zh-cn/3/
  2. Tkinter官方文档:https://docs.python.org/zh-cn/3/library/tkinter.html
  3. 《Python编程:从入门到实践》- Eric Matthes
  4. 《流畅的Python》- Luciano Ramalho
  5. 扫雷算法参考:https://en.wikipedia.org/wiki/Minesweeper_(video_game)
  6. 数独生成算法:https://www.sudoku.name/rules/zh

十、附录

附录A:项目文件结构

实验四/
├── puzzle_games.py      # 主程序文件(约1870行)
├── game_data.json       # 游戏数据文件(运行时生成)

附录B:运行说明

运行环境:

  • Python 3.6+
  • 无需额外安装第三方库(使用标准库)

运行方式:

python puzzle_games.py

操作说明:

  • 主菜单:点击游戏名称进入难度选择
  • 扫雷:左键揭示,右键标记
  • 华容道:点击相邻空格的数字滑动
  • 俄罗斯方块:方向键控制,上键旋转
  • 贪吃蛇:方向键控制移动方向
  • 数独:点击格子输入数字

附录C:成就列表

ID 名称 描述 积分
first_game 初次体验 完成第一局游戏 50
minesweeper_first 排雷新手 完成第一局扫雷 60
sliding_first 华容初试 完成第一局数字华容道 60
tetris_first 方块入门 完成第一局俄罗斯方块 60
snake_first 贪吃始动 完成第一局贪吃蛇 60
sudoku_first 数独初解 完成第一局数独 60
play_10 常客 累计完成10局游戏 100
play_50 老玩家 累计完成50局游戏 200
play_100 资深玩家 累计完成100局游戏 400
time_1h 时间旅者 累计游戏时间达到1小时 150
time_10h 时间大师 累计游戏时间达到10小时 500
points_1000 积分达人 累计获得1000积分 200
points_5000 积分富豪 累计获得5000积分 400
points_10000 积分传奇 累计获得10000积分 800
all_games 全能选手 体验所有五款游戏 300
snake_50 贪吃大师 贪吃蛇得分超过50 150
tetris_1000 方块高手 俄罗斯方块得分超过1000 150
tetris_5000 方块大师 俄罗斯方块得分超过5000 300
minesweeper_win 排雷专家 成功完成一局扫雷 150
sliding_complete 华容道解谜 完成数字华容道 150
sudoku_complete 数独破解 完成一局数独 150
minesweeper_expert 扫雷高手 完成炼狱难度扫雷 400
sliding_master 华容道大师 完成九天玄盘难度 400

posted @ 2026-06-16 00:49  这是昵称。。。  阅读(15)  评论(0)    收藏  举报