# 拼图游戏 **Repository Path**: qazll/jigsaw-puzzle ## Basic Information - **Project Name**: 拼图游戏 - **Description**: 拼图游戏 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-01 - **Last Updated**: 2026-05-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 拼图游戏 (Puzzle Game) 基于 Win32 API 和 GDI+ 开发的经典拼图游戏。将随机打乱的图片块通过移动还原为完整图片。 ## 功能特性 - **加载自定义图片**:支持 BMP、JPG、JPEG、PNG、GIF 等常见格式。 - **三种难度**:3×3、4×4、5×5 网格,难度越高块数越多。 - **随机打乱**:使用 Fisher-Yates 洗牌算法完全随机排列非空块,空白块固定在右下角,并自动校验拼图可解性(保证每个生成的局面均可解)。 - **移动方式**: - 鼠标点击与空白块相邻的图片块进行交换。 - 键盘方向键控制空白块移动(按“上”空白下移,按“下”空白上移,按“左”空白右移,按“右”空白左移——可习惯性反转)。 - **游戏状态**:显示当前步数,完成拼图后弹出胜利提示。 - **重新开始**:随时使用菜单或快捷键重新打乱当前图片。 ## 开发环境 - **操作系统**:Windows Vista / 7 / 8 / 10 / 11 - **编译器**:Visual Studio 2019 / 2022 (MSVC) - **依赖库**:GDI+、Windows SDK (系统自带) - **编码格式**:UTF-8 with BOM(确保中文正常显示) ## 编译与运行 ### 1. 创建项目 在 Visual Studio 中创建新的 **Windows 桌面应用程序 (Win32 Project)** 项目,将 `PuzzleGame.cpp` 添加到项目源文件目录。 ### 2. 配置链接器 代码中已通过 `#pragma comment(lib, ...)` 自动链接 GDI+、comdlg32 和 ole32 库,无需手动设置。 ### 3. 资源文件(可选) 如需完整的菜单、图标等界面资源,需创建 `.rc` 文件并定义相应资源 ID,亦可注释掉 `WndProc` 中对应的 `WM_COMMAND` 分支以简化功能。 ### 4. 编译运行 选择 **x64** 或 **x86** 配置编译运行,通过菜单“文件”→“打开图片”加载图片即可开始游戏。 ## 操作指南 | 操作 | 效果 | |------|------| | 鼠标左键点击图片块 | 若该块与空白块相邻,则交换位置 | | 键盘 ↑ (上) | 空白块向下移动 | | 键盘 ↓ (下) | 空白块向上移动 | | 键盘 ← (左) | 空白块向右移动 | | 键盘 → (右) | 空白块向左移动 | | 菜单:文件 → 打开图片 | 加载新图片并自动开始新游戏 | | 菜单:难度 → 3x3 / 4x4 / 5x5 | 切换网格大小,重置游戏 | | 菜单:游戏 → 重新开始 | 保持当前图片,重新打乱 | ## 常见问题 ### Q1: 编译时出现 C4819 警告或中文乱码 **解决**:将源文件和资源文件保存为 **UTF-8 with BOM** 编码(Visual Studio:文件 → 高级保存选项 → 选择 “Unicode (UTF-8 with signature) - 代码页 65001”)。 ### Q2: 菜单或对话框无法显示 **解决**:创建资源文件 `.rc` 并正确添加资源定义,或临时注释掉 `WndProc` 中相关的 `WM_COMMAND` 分支。 ### Q3: 图片加载失败 **解决**:确保图片格式为 GDI+ 支持的格式(BMP、JPG、PNG、GIF 等),且文件路径不包含特殊字符。程序会自动缩放过大图片。 ### Q4: 打乱后拼图无法完成 **解决**:本程序内置可解性校验,生成的局面均为可解。遇到极小概率无解情况时,重新开始即可。 ## 代码结构 - `PuzzleGame` 类:核心游戏逻辑,包括初始化、洗牌、移动、胜利判定、绘图等 - `WndProc`:处理窗口消息(菜单、鼠标点击、键盘、重绘) - `WinMain`:程序入口,初始化 GDI+ 和主窗口