From 47ca7473ec8eaeec8885163db4460e10e09d45b7 Mon Sep 17 00:00:00 2001 From: Qi-huanye <2728290997@qq.com> Date: Sun, 26 Apr 2026 16:06:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E6=96=87?= =?UTF-8?q?=E4=BB=B6=20=E6=95=B4=E7=90=86README=E7=AD=89=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dev-C++运行说明.md | 205 +++++++++++++++++------------------------- README.md | 219 +++++++++++++++++++++++++++------------------ VSCode运行说明.md | 159 ++++++++++++++++---------------- image.png | Bin 8630 -> 0 bytes 4 files changed, 290 insertions(+), 293 deletions(-) delete mode 100644 image.png diff --git a/Dev-C++运行说明.md b/Dev-C++运行说明.md index 8864698..2a2b1dd 100644 --- a/Dev-C++运行说明.md +++ b/Dev-C++运行说明.md @@ -1,26 +1,8 @@ # Dev-C++ 运行说明 -本说明适用于需要在 `Dev-C++` 环境下编译本项目的情况。 +本项目可以尝试在 Dev-C++ 中运行,但更推荐使用 VS Code 和 `build-mingw.ps1` 脚本。Dev-C++ 对资源文件、Unicode 入口和链接库的处理更容易出现环境差异。 -结论先说: - -- 可以运行 -- 但不如 VS Code + 脚本方式稳定 -- 如果只是为了交作业或课堂展示,优先推荐使用项目自带的 MinGW 脚本 - -## 1. 适用环境 - -- Windows -- Dev-C++ -- MinGW-w64 - -建议 Dev-C++ 所使用的编译器支持: - -- `C++17` -- `windres` -- `-municode` - -## 2. 建议工程类型 +## 1. 工程类型 新建工程时请选择: @@ -30,152 +12,127 @@ Windows Application 不要选择控制台程序。 -## 3. 需要加入工程的文件 +## 2. 需要加入工程的源码 -### 源文件 +源文件: -把以下文件加入工程: +```text +src/source/stdafx.cpp +src/source/Tetris.cpp +src/source/TetrisLogic.cpp +src/source/TetrisRender.cpp +src/source/TetrisRogue.cpp +``` -- `src/source/stdafx.cpp` -- `src/source/Tetris.cpp` -- `src/source/TetrisLogic.cpp` -- `src/source/TetrisRender.cpp` -- `src/source/TetrisRogue.cpp` - -### 头文件 - -头文件不一定要加入编译列表,但建议加入工程树,便于浏览: - -- `src/include/stdafx.h` -- `src/include/Tetris.h` -- `src/include/TetrisLogicInternal.h` -- `src/include/targetver.h` -- `src/include/resource.h` - -### 资源文件 - -如果当前 Dev-C++ 环境支持资源编译,可以再加入: - -- `src/resources/Tetris.rc` - -## 4. 需要配置的选项 - -### 头文件搜索路径 - -加入: +头文件目录: ```text src/include ``` -### 链接库 - -确保链接以下库: - -- `winmm` -- `gdi32` -- `user32` -- `comdlg32` -- `ole32` -- `gdiplus` - -### 编译标准 - -建议设置为: +建议把以下头文件加入工程树,便于查看: ```text -C++17 +src/include/stdafx.h +src/include/Tetris.h +src/include/TetrisLogicInternal.h +src/include/targetver.h +src/include/resource.h ``` -### 预处理宏 +## 3. 资源文件 -建议定义: - -- `UNICODE` -- `_UNICODE` -- `_WINDOWS` - -### 建议参数 - -如果需要手动补充: - -- `-mwindows` -- `-municode` - -## 5. 资源文件注意事项 - -Dev-C++ 下最容易出问题的是资源编译。 - -本项目资源包括: - -- 图标 -- 菜单 -- 关于框 - -资源脚本为: +资源文件为: ```text src/resources/Tetris.rc ``` -如果 Dev-C++ 对该资源文件编译不稳定,最稳妥的做法有两种。 +如果 Dev-C++ 能正常编译资源,可以加入该文件。 +如果资源编译失败,可以先不加入资源文件,只编译 C++ 源码。这样程序主体仍可运行,但图标、菜单等资源可能不完整。 -### 做法一:不编译资源文件 +## 4. 编译设置 -先只编译 C++ 源文件。 +建议: -这样: +- C++ 标准:`C++17` +- 工程类型:Windows 程序 +- 字符集:Unicode -- 程序主体通常能正常运行 -- 但窗口图标、菜单等资源可能缺失 +建议预处理宏: -### 做法二:优先使用脚本构建 - -先在项目根目录执行: - -```powershell -powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 +```text +UNICODE +_UNICODE +_WINDOWS ``` -确认脚本方式可构建后,再视需要把 Dev-C++ 作为备用方案。 +建议编译 / 链接参数: -## 6. 资源目录不要遗漏 +```text +-mwindows +-municode +``` -无论你用哪种方式运行,下面这些目录都不要删: +## 5. 链接库 -- `assets/icons/` -- `assets/images/` -- `assets/audio/` -- `assets/video/` +需要链接以下库: -否则会影响: +```text +winmm +gdi32 +user32 +comdlg32 +ole32 +gdiplus +shell32 +``` -- 图标显示 +如果出现 `undefined reference`,优先检查这些库是否正确加入。 + +## 6. 资源目录 + +运行时请保留: + +```text +assets/icons/ +assets/images/ +assets/audio/ +assets/video/ +``` + +这些资源用于: + +- 程序图标 - 背景图片 - 背景音乐 - 视频复活 +如果工作目录设置不正确,程序可能找不到这些资源。 + ## 7. 常见问题 -### 1)能编译但没有图标或菜单 +### 资源文件编译失败 -通常是资源文件没有正确编译进程序。 +Dev-C++ 的 `windres` 对资源文件编码和路径比较敏感。可以先不加入 `Tetris.rc`,或者改用项目自带脚本构建。 -### 2)编译时报 `gdiplus` 或 `winmm` 未定义引用 +### 无法识别 `_tWinMain` -说明缺少链接库,请检查工程链接设置。 +说明工程类型或 Unicode 参数不正确。请确认使用 Windows Application,并启用 Unicode 相关宏和 `-municode`。 -### 3)运行时没有背景图 / 音乐 / 视频 +### 背景、音乐或视频缺失 -说明程序找不到 `assets/` 目录,通常是工作目录不对,或者运行时只复制了 `exe` 没带资源。 +说明运行目录找不到 `assets/`。建议从项目根目录运行,或保持 exe 与资源目录的相对位置。 + +### 链接失败 + +检查是否加入了 `winmm`、`gdiplus`、`shell32` 等库。 ## 8. 建议 -如果你的目标是: +Dev-C++ 适合作为备用运行方式。 +如果要稳定构建、调试和课堂展示,建议优先使用: -- 交作业 -- 本地演示 -- 快速稳定运行 - -请优先使用本项目已经配好的 `build-mingw.ps1` 和 VS Code 配置。 -Dev-C++ 更适合作为兼容环境,而不是主开发环境。 +```powershell +powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 +``` diff --git a/README.md b/README.md index 4aa2ca8..221d718 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,121 @@ # Tereis -基于 C++、Win32 API 和 GDI/GDI+ 实现的俄罗斯方块课程大作业。 +Tereis 是一个基于 C++、Win32 API、GDI/GDI+ 实现的桌面版俄罗斯方块课程大作业。 -项目提供两种主要玩法: +项目在经典俄罗斯方块玩法上扩展了 Rogue 模式,加入等级成长、强化选择、主动技能、特殊方块、视频复活、鼠标交互和视觉特效。程序不依赖游戏引擎,主要使用 Win32 消息循环和 GDI 绘图完成。 -- `经典模式`:标准俄罗斯方块,强调移动、旋转、消行和生存。 -- `Rogue 模式`:在标准玩法基础上加入升级、强化、主动技能、危险等级和局内构筑。 +## 功能概览 -当前工程可直接在 Windows 下编译运行,适合作为课程展示、实验报告和源码答辩使用。 - -## 项目特点 - -- Win32 图形界面程序,不依赖第三方游戏引擎 -- 支持键盘操作、暂停、重开和返回主菜单 -- 支持主菜单、帮助页、升级选择界面和结算反馈 -- Rogue 模式包含强化系统、主动技能和特殊方块机制 -- 支持背景图、图标、背景音乐和视频复活功能 -- 提供 MinGW 构建脚本,以及 VS Code / Dev-C++ 运行说明 - -## 当前已实现内容 - -### 1. 基础玩法 +### 经典模式 +- 标准俄罗斯方块规则 - 方块生成、移动、旋转、软降、硬降 -- 碰撞检测、落地固定、消行、游戏结束判定 +- 方块落地固定、消行、计分和死亡判定 - 预测落点显示 -- 重新开始、暂停、返回菜单 +- 暂停、重开、返回主菜单 -### 2. 界面与资源 +### Rogue 模式 -- 自定义窗口界面 -- 图标资源 +Rogue 模式是本项目的主要扩展玩法。 + +- 消行获得分数和 EXP +- EXP 满后进入强化选择界面 +- 支持普通三选一强化 +- 支持双重抉择,同屏选择两个强化 +- 支持命运轮盘,同屏展示六个强化并选择两个 +- 随时间提升危险等级,底部封锁区会压缩可用空间 +- 支持多种强化联动和构筑方向 + +### 强化与技能 + +项目中包含多类强化效果: + +- 基础成长:得分倍率、EXP 倍率、预览数量、下落速度调整 +- 生存强化:最后一搏、时间缓流、稳定结构 +- 主动技能:备用仓、清屏炸弹、黑洞奇点、空中换形 +- 特殊方块:爆破核心、棱镜激光、十字方块、彩虹方块 +- 进阶联动:连锁火花、连环炸弹、雷霆四消、雷霆棱镜 +- 风险收益:高压悬赏、豪赌四消、极限玩家、赌徒契约 +- 升级联动:双重抉择、命运轮盘、升级冲击波、进化冲击 + +具体效果可在游戏主菜单的 `帮助 -> 强化图鉴` 中查看。 + +### 鼠标交互 + +除键盘操作外,项目也支持鼠标点击: + +- 主菜单项目可点击 +- 帮助页项目可点击 +- 升级卡片可点击选择 +- 多选强化可点击标记 +- 暂停和结算界面按钮可点击 +- 非主菜单界面左上角有返回按钮,可点击回到主菜单 +- 右下角音乐按钮可点击开关背景音乐 + +### 视听与资源 + +- 自定义图标 - 背景图片 - 背景音乐 -- 帮助页与强化图鉴 +- 消行和技能清除特效 +- 死亡后可播放本地视频复活一次 -### 3. Rogue 模式 +## 操作说明 -- EXP 与等级系统 -- 三选一 / 六选二强化系统 -- 升级后强化选择 -- 危险等级和底部封锁区 -- 主动技能: - - `C / Shift` 备用仓 - - `Z` 黑洞奇点 - - `X` 清屏炸弹 - - `V` 空中换形 -- 特殊方块与连锁效果: - - 爆破核心 - - 棱镜激光 - - 十字方块 - - 彩虹方块 - - 方块改造 +### 通用键盘操作 -### 4. 额外功能 +| 按键 | 功能 | +| --- | --- | +| `← / A` | 左移 | +| `→ / D` | 右移 | +| `↑ / W` | 旋转 | +| `↓ / S` | 软降 | +| `Space` | 硬降 | +| `P` | 暂停 / 继续 | +| `R` | 重开当前对局 | +| `M` | 返回主菜单 | -- 死亡后看本地视频复活一次 -- 消除与技能清除特效 -- 升级冲击波 / 进化冲击等升级联动效果 +### Rogue 模式额外按键 -## 目录结构 +| 按键 | 功能 | +| --- | --- | +| `C / Shift` | 备用仓 | +| `Z` | 黑洞奇点 | +| `X` | 清屏炸弹 | +| `V` | 空中换形 | +| 死亡后 `V` | 看视频复活一次 | + +### 升级选择 + +- 普通升级:方向键 / WASD 切换,Enter 或 Space 确认 +- 双重抉择 / 命运轮盘:Space 标记,Enter 确认已选强化 +- 鼠标操作:直接点击升级卡片即可选择或标记 + +## 项目结构 ```text Tereis/ ├─ src/ │ ├─ include/ 头文件 │ ├─ source/ 源文件 -│ └─ resources/ Windows 资源文件 +│ └─ resources/ Windows 资源脚本 ├─ assets/ -│ ├─ audio/ 音频资源 -│ ├─ icons/ 图标资源 -│ ├─ images/ 图片资源 -│ └─ video/ 复活视频资源 -├─ report/ 报告与整理材料 +│ ├─ audio/ 背景音乐 +│ ├─ icons/ 程序图标 +│ ├─ images/ 背景图片 +│ └─ video/ 复活视频 +├─ report/ 报告相关材料 ├─ .vscode/ VS Code 配置 ├─ .vscode-build/ 本地构建输出目录 ├─ build-mingw.ps1 MinGW 构建脚本 -├─ README.md 项目总说明 -├─ VSCode运行说明.md VS Code 运行说明 -└─ Dev-C++运行说明.md Dev-C++ 运行说明 +├─ README.md 项目说明 +├─ VSCode运行说明.md VS Code 构建运行说明 +└─ Dev-C++运行说明.md Dev-C++ 兼容运行说明 ``` -## 环境要求 +## 构建环境 + +推荐环境: - Windows - PowerShell @@ -90,7 +124,11 @@ Tereis/ - `windres.exe` - 如需调试:`gdb.exe` -脚本会优先使用系统 `PATH` 中的 MinGW;如果没有加入 `PATH`,也兼容常见安装路径 `C:\mingw64\bin\`。 +构建脚本会优先使用系统 `PATH` 中的 MinGW。如果没有加入 `PATH`,脚本也会尝试使用: + +```text +C:\mingw64\bin\ +``` ## 构建与运行 @@ -100,63 +138,66 @@ Tereis/ powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 ``` -构建成功后,生成文件位于: +构建成功后生成: ```text .vscode-build\mingw\Tetris.exe ``` -如果希望构建后直接运行: +构建后直接运行: ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 -Run ``` -注意: +## 常见问题 -- 如果提示 `Tetris.exe: Permission denied`,通常是程序还在运行,先关闭游戏窗口再重新构建。 -- 项目依赖 `assets/` 下的图标、图片、音频和视频资源,提交或运行时不要删掉这些文件。 +### 1. 提示 `Tetris.exe: Permission denied` -## 操作说明 +说明游戏程序仍在运行,链接器无法覆盖旧文件。 -### 通用操作 +处理方式: -- `← / A`:左移 -- `→ / D`:右移 -- `↑ / W`:旋转 -- `↓ / S`:软降 -- `Space`:硬降 -- `P`:暂停 / 继续 -- `R`:重开当前对局 -- `M`:返回主菜单 +- 关闭正在运行的游戏窗口 +- 重新执行构建命令 -### Rogue 模式附加操作 +### 2. 没有背景图、音乐或视频 -- `C / Shift`:备用仓 -- `Z`:黑洞奇点 -- `X`:清屏炸弹 -- `V`:空中换形 +请确认运行时保留了 `assets/` 目录。项目会从资源目录读取背景、音乐和复活视频。 -### 复活 +### 3. 视频复活播放失败 -- 死亡后按 `V` 播放本地视频,可复活一次 +项目会优先查找: -## 文档说明 +- `assets/video/video.avi` +- `assets/video/video.mp4` -- [VSCode运行说明.md](./VSCode运行说明.md):适合直接在 VS Code 中构建、运行和调试 -- [Dev-C++运行说明.md](./Dev-C++运行说明.md):适合作为备用运行方案 -- [report/list.md](./report/list.md):项目阶段清单 +如果系统不支持对应格式,可能会播放失败。建议保留项目中已提供的视频文件。 + +### 4. 鼠标点击不生效 + +请确认运行的是最新构建结果。若构建时 `Tetris.exe` 被占用,实际运行的可能仍是旧版本。 ## 课程展示建议 -如果用于课堂演示,建议优先展示以下内容: +建议按以下顺序展示: -1. 主菜单与帮助页 +1. 主菜单、帮助页和鼠标点击 2. 经典模式基础玩法 -3. Rogue 模式升级界面 -4. 特殊方块与主动技能 -5. 视频复活功能 +3. Rogue 模式升级选择 +4. 双重抉择或命运轮盘的多选界面 +5. 主动技能:黑洞、炸弹、换形、备用仓 +6. 特殊方块和消除特效 +7. 死亡后视频复活 -## 说明 +## 实现说明 -本项目为课程设计 / 大作业用途,代码风格以过程式实现为主,便于和课程内容对照理解,不以复杂架构设计为目标。 +本项目以过程式 C++ 写法为主,核心逻辑分布如下: + +- `src/source/Tetris.cpp`:窗口、消息循环、输入和鼠标交互 +- `src/source/TetrisLogic.cpp`:基础方块逻辑、消行和状态重置 +- `src/source/TetrisRogue.cpp`:Rogue 模式、强化、技能和成长系统 +- `src/source/TetrisRender.cpp`:界面绘制、面板、动画和特效 +- `src/include/Tetris.h`:主要结构体、全局状态和函数声明 + +项目适合作为程序设计课程大作业展示,也便于在答辩时讲解窗口程序、游戏循环、碰撞检测、状态管理和功能扩展。 diff --git a/VSCode运行说明.md b/VSCode运行说明.md index 0c54187..e319366 100644 --- a/VSCode运行说明.md +++ b/VSCode运行说明.md @@ -1,56 +1,72 @@ # VS Code 运行说明 -本说明适用于 `Windows + VS Code + MinGW-w64` 环境。 +本项目推荐使用 `VS Code + MinGW-w64 + PowerShell` 构建和调试。 -## 1. 推荐环境 +## 1. 环境准备 -建议已安装: +需要安装: -- VS Code +- Visual Studio Code - Microsoft C/C++ 扩展 -- PowerShell - MinGW-w64 +- PowerShell + +MinGW 中至少需要: + - `g++.exe` -- `gdb.exe` - `windres.exe` +- `gdb.exe`,仅调试时需要 -## 2. 正确打开方式 +## 2. 打开项目 -请直接用 VS Code 打开项目根目录,也就是包含以下内容的目录: +请在 VS Code 中打开项目根目录,也就是包含以下文件和目录的位置: -- `build-mingw.ps1` -- `.vscode/` -- `src/` -- `assets/` +```text +build-mingw.ps1 +src/ +assets/ +.vscode/ +README.md +``` -不要只打开 `src/` 子目录,否则: +不要只打开 `src/` 子目录,否则 VS Code 任务和调试配置无法正常工作。 -- 构建任务不可用 -- 调试配置不可用 -- 路径和资源引用可能失效 +## 3. 使用 VS Code 任务构建 -## 3. 构建方法 +按: -### 方法一:快捷键 - -按 `Ctrl + Shift + B` +```text +Ctrl + Shift + B +``` 默认会执行项目中的 MinGW 构建任务。 -### 方法二:运行任务 - -打开命令面板,执行: +也可以打开命令面板,选择: ```text Tasks: Run Task ``` -然后选择: +然后运行: - `build Tetris MinGW` - `run Tetris MinGW` -## 4. 调试方法 +## 4. 使用命令行构建 + +在 VS Code 终端中进入项目根目录,执行: + +```powershell +powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 +``` + +构建后直接运行: + +```powershell +powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 -Run +``` + +## 5. 调试 按 `F5`,选择: @@ -58,91 +74,74 @@ Tasks: Run Task Debug Tetris MinGW ``` -该配置会先构建,再启动: +调试配置会先构建项目,再启动: ```text .vscode-build\mingw\Tetris.exe ``` -## 5. 输出位置 +如果提示找不到 `gdb.exe`,说明 MinGW 的调试器没有安装或没有加入 `PATH`。 -构建成功后,程序位于: +## 6. 构建输出 + +最终程序: ```text .vscode-build\mingw\Tetris.exe ``` -中间产物位于同一目录下,例如: +构建中间文件: -- `Tetris.utf8.rc` -- `Tetris.res.o` - -## 6. 推荐命令 - -在 VS Code 终端中,也可以直接执行: - -```powershell -powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 +```text +.vscode-build\mingw\Tetris.utf8.rc +.vscode-build\mingw\Tetris.res.o ``` -如果构建后要立即运行: +这些中间文件不需要手动维护。 -```powershell -powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 -Run +## 7. 资源文件 + +项目运行依赖: + +```text +assets/icons/ +assets/images/ +assets/audio/ +assets/video/ ``` -## 7. 常见问题 +如果只移动 `Tetris.exe` 而不带 `assets/`,会影响背景图、音乐和视频复活功能。 -### 1)提示找不到 `g++.exe` +## 8. 常见问题 -说明 MinGW 没有正确安装,或者没有加入系统 `PATH`。 +### 找不到 `g++.exe` 处理方式: -- 把 MinGW 的 `bin` 目录加入 `PATH` -- 或安装到 `C:\mingw64\bin\` +- 将 MinGW 的 `bin` 目录加入系统 `PATH` +- 或将 MinGW 安装到 `C:\mingw64\bin\` -### 2)提示找不到 `windres.exe` +### 找不到 `windres.exe` -说明资源文件无法编译进程序。 +资源文件无法编译,图标和菜单资源可能缺失。请检查 MinGW 安装是否完整。 -结果通常是: +### `Tetris.exe: Permission denied` -- 主体代码可能还能编译 -- 但图标、菜单等资源会出问题 - -### 3)提示 `Tetris.exe: Permission denied` - -通常是因为游戏程序还在运行,导致链接器无法覆盖旧的 `exe`。 +说明程序正在运行,构建时无法覆盖旧 exe。 处理方式: -- 先关闭正在运行的游戏窗口 -- 再重新执行构建 +1. 关闭游戏窗口 +2. 重新构建 -### 4)按 `F5` 无法调试 +### 鼠标点击、按钮或界面不是最新版 -一般是因为: +通常是因为构建失败后仍在运行旧 exe。请确认构建命令成功完成。 -- 没安装 `gdb.exe` -- 打开的不是项目根目录 -- VS Code 没有加载 `.vscode` 配置 +## 9. 推荐运行流程 -## 8. 资源说明 - -项目运行依赖以下资源目录: - -- `assets/icons/` -- `assets/images/` -- `assets/audio/` -- `assets/video/` - -如果只是拷贝 `exe` 而不带资源目录,部分功能会缺失,例如: - -- 背景图 -- 背景音乐 -- 复活视频 - -## 9. 适用场景 - -如果你主要在本机开发、调试和演示,VS Code 是本项目最推荐的运行方式。当前任务配置、构建脚本和资源处理流程都已经围绕 VS Code 配好。 +1. 打开项目根目录 +2. 关闭旧的游戏窗口 +3. 执行构建 +4. 运行 `.vscode-build\mingw\Tetris.exe` +5. 如果要调试,按 `F5` diff --git a/image.png b/image.png deleted file mode 100644 index 58b16c6085a259475f745f27ddf202e77d3be750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8630 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