diff --git a/list.md b/list.md index 8652613..f0d928e 100644 --- a/list.md +++ b/list.md @@ -24,11 +24,11 @@ 简要说明:在可移动判断完成后,实现方块的下移、左移、右移、旋转和一键到底操作。 -- [ ] `9. MoveDown` - `src/source/TetrisLogic.cpp` -- [ ] `10. MoveLeft` - `src/source/TetrisLogic.cpp` -- [ ] `11. MoveRight` - `src/source/TetrisLogic.cpp` -- [ ] `12. Rotate` - `src/source/TetrisLogic.cpp` -- [ ] `13. DropDown` - `src/source/TetrisLogic.cpp` +- [x] `9. MoveDown` - `src/source/TetrisLogic.cpp` +- [x] `10. MoveLeft` - `src/source/TetrisLogic.cpp` +- [x] `11. MoveRight` - `src/source/TetrisLogic.cpp` +- [x] `12. Rotate` - `src/source/TetrisLogic.cpp` +- [x] `13. DropDown` - `src/source/TetrisLogic.cpp` ## 第四阶段:方块固定与游戏状态 diff --git a/report/README.md b/report/README.md deleted file mode 100644 index 5fed20b..0000000 --- a/report/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# 实验报告目录 - -本目录用于整理《大学计算》程序设计大作业实验报告材料。 - -建议工作流程: - -1. 先在 `report.md` 中撰写正文。 -2. 截图放到 `images/`。 -3. 需要引用的代码片段整理到 `code-snippets/`。 -4. 最终再同步到 Word 模板,导出到 `submission/`。 - -目录说明: - -- `report.md`:实验报告正文草稿 -- `outline.md`:按模板拆好的章节提纲 -- `notes.md`:写作要点和待补充内容 -- `images/`:界面截图、流程图、结果图 -- `code-snippets/`:准备放入报告的关键代码 -- `submission/`:最终提交版文档 - diff --git a/report/code-snippets/Part3/part3CodeAfter.png b/report/code-snippets/Part3/part3CodeAfter.png new file mode 100644 index 0000000..8a93bda Binary files /dev/null and b/report/code-snippets/Part3/part3CodeAfter.png differ diff --git a/report/code-snippets/Part3/part3CodeBefore.png b/report/code-snippets/Part3/part3CodeBefore.png new file mode 100644 index 0000000..d87f3d7 Binary files /dev/null and b/report/code-snippets/Part3/part3CodeBefore.png differ diff --git a/report/notes.md b/report/notes.md deleted file mode 100644 index 737db54..0000000 --- a/report/notes.md +++ /dev/null @@ -1,20 +0,0 @@ -# 写作备注 - -后续补充这些内容: - -- 封面姓名、学号、教师、学院 -- 摘要压缩到 500 字以内 -- 依据实际代码把第 3、4 章的小节标题改成更准确的模块名 -- 插入总体框架流程图 -- 插入程序运行截图 -- 插入关键代码片段并配说明 -- 补充完整系统测试结果与分析 -- 最终同步到 Word 模板并更新目录 - -建议可改成的模块标题: - -- 窗口创建与消息处理 -- 游戏逻辑设计与实现 -- 图形绘制与界面显示 -- 工程构建与资源配置 - diff --git a/report/outline.md b/report/outline.md deleted file mode 100644 index 69c0a39..0000000 --- a/report/outline.md +++ /dev/null @@ -1,81 +0,0 @@ -# 实验报告提纲 - -## 封面信息 - -- 课程:大学计算 -- 实验名称:程序设计大作业 -- 姓名: -- 学号: -- 授课教员: -- 所属学院: - -## 摘要 - -- 背景和意义 -- 实验对象或目标 -- 实验方法 -- 实验结果 - -## 关键词 - -- 关键词 1 -- 关键词 2 -- 关键词 3 - -## 1 引言 - -- 项目背景和意义 -- 相关工作或同类实现概况 -- 本实验要解决的问题 -- 本实验的主要内容与结果 - -## 2 总体框架 - -- 技术选型 -- 项目整体结构 -- 主要模块划分 -- 开发进度安排 -- 总体流程图 - -## 3 功能模块一 - -### 3.1 实验内容 - -- 实验思路 -- 实验代码 -- 实验结果 - -### 3.2 实验内容 - -- 实验思路 -- 实验代码 -- 实验结果 - -## 4 功能模块二 - -### 4.1 实验内容 - -- 实验思路 -- 实验代码 -- 实验结果 - -### 4.2 实验内容 - -- 实验思路 -- 实验代码 -- 实验结果 - -## 5 实验结果与分析 - -- 完整系统测试结果 -- 性能或功能达成度分析 -- 图表与现象说明 -- 影响因素与改进方向 - -## 6 结论 - -- 方法总结 -- 结果总结 -- 收获与体会 -- 问题与建议 - diff --git a/report/report.md b/report/report.md deleted file mode 100644 index df72fa6..0000000 --- a/report/report.md +++ /dev/null @@ -1,110 +0,0 @@ -# 大学计算实验报告 - -## 封面信息 - -- 姓名: -- 学号: -- 授课教员: -- 所属学院: - -## 摘要 - -本文围绕 `Tereis` 项目的设计与实现展开。项目目标是实现一个基于 Windows API 与 C++ 的俄罗斯方块程序,完成基础游戏逻辑、界面绘制、输入响应与结果展示等功能。实验过程中,采用模块化设计方式,将程序拆分为窗口管理、游戏逻辑、渲染绘制和资源配置等部分,并通过 MinGW 构建脚本完成编译与运行验证。最终实现了程序的基本运行,并能够完成方块生成、移动、旋转、消行与结束判定等核心功能。后续可继续在资源管理、界面表现与可维护性方面进行优化。 - -## 关键词 - -俄罗斯方块;C++;Windows API;MinGW;程序设计 - -## 1 引言 - -本实验的目标是完成一个桌面端俄罗斯方块程序,并通过实际编码过程加深对 C++ 程序结构设计、Windows 图形界面开发以及模块化实现方式的理解。俄罗斯方块作为经典游戏,具有规则明确、逻辑完整、适合分模块实现等特点,适合作为程序设计综合实验项目。 - -在本项目中,程序以 Windows API 为基础,结合消息循环、图形绘制和键盘输入处理完成交互式游戏窗口。实验重点不仅在于实现游戏功能本身,也在于梳理一个完整程序从工程组织、编译运行到功能验证的开发过程。 - -## 2 总体框架 - -项目源码位于 `src/` 目录,按照工程结构进一步划分为 `include`、`source` 和 `resources` 三个子目录,整体上可分为以下几个部分: - -- `src/source/Tetris.cpp`:程序入口、窗口创建与消息处理 -- `src/source/TetrisLogic.cpp`:核心游戏逻辑,如移动、旋转、消行和结束判定 -- `src/source/TetrisRender.cpp`:界面绘制 -- `src/include/Tetris.h`:全局常量、结构体与函数声明 -- `src/resources/Tetris.rc`:窗口图标、菜单与对话框等资源定义 -- `build-mingw.ps1`:MinGW 构建脚本 - -整体流程可以概括为:程序启动后创建窗口并初始化数据,随后在消息循环中响应用户输入和定时事件,驱动游戏状态更新,再由绘图模块将当前状态显示到窗口中。 - -## 3 功能模块一:游戏主体框架 - -### 3.1 窗口创建与消息处理 - -#### 实验思路 - -本部分负责创建主窗口、注册窗口类并处理 Windows 消息。通过消息循环机制,程序能够持续响应键盘输入、绘制请求以及定时器事件,从而构成游戏运行的基础框架。 - -#### 实验代码 - -此处后续补充 `Tetris.cpp` 中的窗口初始化和消息分发关键代码。 - -#### 实验结果 - -完成本部分后,程序能够正常创建游戏窗口,并具备基础的事件响应能力,为后续游戏逻辑实现提供运行环境。 - -### 3.2 游戏逻辑实现 - -#### 实验思路 - -本部分围绕俄罗斯方块的核心规则展开,实现方块生成、左右移动、下落、旋转、到底固定、消除整行以及游戏结束判定等逻辑。通过二维数组表示游戏区域,并结合方块数据结构管理当前状态。 - -#### 实验代码 - -此处后续补充 `TetrisLogic.cpp` 中的关键数据结构和函数实现。 - -#### 实验结果 - -完成本部分后,程序能够正确处理方块运动与碰撞逻辑,并在满足条件时完成消行和结束判定,达成游戏基本要求。 - -## 4 功能模块二:界面绘制与工程构建 - -### 4.1 界面绘制 - -#### 实验思路 - -绘图部分负责根据当前游戏状态刷新窗口内容,包括游戏区域、方块显示和必要的界面元素。该部分通过 Windows GDI 接口完成图形绘制。 - -#### 实验代码 - -此处后续补充 `TetrisRender.cpp` 中的绘图代码片段。 - -#### 实验结果 - -完成本部分后,程序可以将逻辑状态直观显示在窗口中,使用户能够观察游戏过程与结果。 - -### 4.2 工程构建与运行验证 - -#### 实验思路 - -为了适应当前开发环境,项目使用 `build-mingw.ps1` 作为构建脚本,统一处理源文件编译、资源文件转换与链接流程,从而保证项目能够在新的目录位置下稳定构建。 - -#### 实验代码 - -此处后续补充构建脚本中的关键步骤,如编译器定位、资源文件处理和链接流程。 - -#### 实验结果 - -完成本部分后,项目可以通过脚本一键完成构建,并生成可执行文件,说明工程配置已经满足当前实验环境要求。 - -## 5 实验结果与分析 - -从当前实验结果看,项目已经能够完成基本编译与运行,核心游戏逻辑与图形界面具备基础可用性。通过构建脚本适配和资源文件处理,项目在迁移目录后仍能保持正常构建,说明工程组织具有一定的稳定性。 - -后续在正式报告中,可以加入以下内容: - -- 程序运行截图 -- 不同操作下的界面表现 -- 消行、结束判定等测试结果 -- 可能存在的问题与改进方向 - -## 6 结论 - -本实验完成了一个基于 C++ 和 Windows API 的俄罗斯方块程序的整理与验证工作。通过对源码结构、功能模块和构建流程的分析,可以看出该项目已经具备较完整的程序框架和基础功能。实验过程中,不仅实现了游戏核心逻辑,也进一步理解了图形界面程序的组织方式和工程调试方法。后续若继续完善,可从界面效果、资源管理、可维护性和测试完整性等方面进一步优化。 diff --git a/report/submission/.gitkeep b/report/submission/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/report/submission/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/source/TetrisLogic.cpp b/src/source/TetrisLogic.cpp index 2b31148..f5cf3d0 100644 --- a/src/source/TetrisLogic.cpp +++ b/src/source/TetrisLogic.cpp @@ -189,32 +189,67 @@ bool CanMoveRight() return true; } +/** + * @brief 将当前活动方块向下移动一格。 + * + * 该函数只负责修改当前活动方块的纵坐标,将其在工作区中的位置向下推进 1 格。 + * 是否允许下移由外部配合 CanMoveDown 函数提前判断。 + */ void MoveDown() { - // TODO(作业9): 方块下移一格。 - point.y = point.y; + // 当前方块下移一格 + point.y++; } +/** + * @brief 将当前活动方块向左移动一格。 + * + * 该函数只负责修改当前活动方块的横坐标,将其在工作区中的位置向左推进 1 格。 + * 是否允许左移由外部配合 CanMoveLeft 函数提前判断。 + */ void MoveLeft() { - // TODO(作业10): 方块左移一格。 - point.x = point.x; + // 当前方块左移一格 + point.x--; } +/** + * @brief 将当前活动方块向右移动一格。 + * + * 该函数只负责修改当前活动方块的横坐标,将其在工作区中的位置向右推进 1 格。 + * 是否允许右移由外部配合 CanMoveRight 函数提前判断。 + */ void MoveRight() { - // TODO(作业11): 方块右移一格。 - point.x = point.x; + // 当前方块右移一格 + point.x++; } +/** + * @brief 旋转当前活动方块到下一种朝向。 + * + * 游戏中的每种方块都预置了 4 种旋转状态,该函数通过切换状态编号实现旋转。 + * 当状态增加到 4 时重新回到 0,形成循环旋转效果。 + */ void Rotate() { - // TODO(作业12): 旋转当前方块。 + // 切换到下一种旋转状态 + state = (state + 1) % 4; } +/** + * @brief 让当前活动方块快速下落到当前位置能够到达的最低点。 + * + * 该函数会持续检查当前方块是否还能继续下移,只要可以下移就重复调用 MoveDown, + * 直到方块到达底部或被其他固定方块阻挡为止。 + */ void DropDown() { - // TODO(作业13): 实现“一键到底”。 + // 只要还能继续下落,就不断下移 + while (CanMoveDown()) + { + MoveDown(); + } } void Fixing()