diff --git a/list.md b/list.md index d5695e8..75f1b68 100644 --- a/list.md +++ b/list.md @@ -1,51 +1,53 @@ # 函数 TODO 分阶段清单 +说明:项目整体仍划分为 6 个阶段,便于按模块推进;每个阶段内的函数顺序尽量与源码实现顺序和依赖关系保持一致。 + ## 第一阶段:窗口创建与程序框架搭建 -简要说明:完成程序入口、主窗口创建、消息循环和基础对话框处理。 +简要说明:完成程序入口、窗口类注册、主窗口创建、消息循环以及基础对话框处理。 -- [x] `_tWinMain` - `src/source/Tetris.cpp` -- [x] `MyRegisterClass` - `src/source/Tetris.cpp` -- [x] `InitInstance` - `src/source/Tetris.cpp` -- [x] `WndProc` - `src/source/Tetris.cpp` -- [x] `About` - `src/source/Tetris.cpp` +- [x] `1. _tWinMain` - `src/source/Tetris.cpp` +- [x] `2. MyRegisterClass` - `src/source/Tetris.cpp` +- [x] `3. InitInstance` - `src/source/Tetris.cpp` +- [x] `4. WndProc` - `src/source/Tetris.cpp` +- [x] `5. About` - `src/source/Tetris.cpp` -## 第二阶段:游戏区域与状态初始化 +## 第二阶段:基础碰撞判断 -简要说明:完成游戏初始状态建立和重新开始相关逻辑。 +简要说明:先完成活动方块的基础移动可行性判断,为后续移动、旋转和落地逻辑提供前置条件。 -- [ ] `Restart` - `src/source/TetrisLogic.cpp` +- [x] `6. CanMoveDown` - `src/source/TetrisLogic.cpp` +- [ ] `7. CanMoveLeft` - `src/source/TetrisLogic.cpp` +- [ ] `8. CanMoveRight` - `src/source/TetrisLogic.cpp` -## 第三阶段:方块生成、移动与旋转 +## 第三阶段:方块移动与旋转 -简要说明:完成方块的基础操作,包括下落、左右移动、旋转和快速到底。 +简要说明:在可移动判断完成后,实现方块的下移、左移、右移、旋转和一键到底操作。 -- [ ] `MoveDown` - `src/source/TetrisLogic.cpp` -- [ ] `MoveLeft` - `src/source/TetrisLogic.cpp` -- [ ] `MoveRight` - `src/source/TetrisLogic.cpp` -- [ ] `Rotate` - `src/source/TetrisLogic.cpp` -- [ ] `DropDown` - `src/source/TetrisLogic.cpp` +- [ ] `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` -## 第四阶段:碰撞检测与方块固定 +## 第四阶段:方块固定与游戏状态 -简要说明:完成越界判断、碰撞检测、方块落地固定和结束判定。 +简要说明:完成方块落地后的固定、游戏结束判断、预测落点与重新开始等状态控制逻辑。 -- [ ] `CanMoveDown` - `src/source/TetrisLogic.cpp` -- [ ] `CanMoveLeft` - `src/source/TetrisLogic.cpp` -- [ ] `CanMoveRight` - `src/source/TetrisLogic.cpp` -- [ ] `Fixing` - `src/source/TetrisLogic.cpp` -- [ ] `GameOver` - `src/source/TetrisLogic.cpp` +- [ ] `14. Fixing` - `src/source/TetrisLogic.cpp` +- [ ] `17. GameOver` - `src/source/TetrisLogic.cpp` +- [ ] `18. ComputeTarget` - `src/source/TetrisLogic.cpp` +- [ ] `19. Restart` - `src/source/TetrisLogic.cpp` -## 第五阶段:消除逻辑与分数系统 +## 第五阶段:消行与得分逻辑 -简要说明:完成消行、行下移和得分更新等核心反馈机制。 +简要说明:完成删除单行、批量消行以及相关分数更新逻辑。 -- [ ] `DeleteOneLine` - `src/source/TetrisLogic.cpp` -- [ ] `DeleteLines` - `src/source/TetrisLogic.cpp` +- [ ] `15. DeleteOneLine` - `src/source/TetrisLogic.cpp` +- [ ] `16. DeleteLines` - `src/source/TetrisLogic.cpp` -## 第六阶段:界面绘制与扩展功能 +## 第六阶段:界面绘制与整体完善 -简要说明:完成游戏界面绘制,并实现落点预测等增强功能。 +简要说明:完成最终游戏界面绘制,并与前面的逻辑配合形成可运行的完整项目。 -- [ ] `ComputeTarget` - `src/source/TetrisLogic.cpp` -- [ ] `TDrawScreen` - `src/source/TetrisRender.cpp` +- [ ] `20. TDrawScreen` - `src/source/TetrisRender.cpp` diff --git a/report/images/Part2/CanMoveDownAfter.png b/report/images/Part2/CanMoveDownAfter.png new file mode 100644 index 0000000..9acdb2e Binary files /dev/null and b/report/images/Part2/CanMoveDownAfter.png differ diff --git a/report/images/Part2/CanMoveDownBefore.png b/report/images/Part2/CanMoveDownBefore.png new file mode 100644 index 0000000..c6418af Binary files /dev/null and b/report/images/Part2/CanMoveDownBefore.png differ diff --git a/src/source/TetrisLogic.cpp b/src/source/TetrisLogic.cpp index a227cac..aa7bd8e 100644 --- a/src/source/TetrisLogic.cpp +++ b/src/source/TetrisLogic.cpp @@ -69,9 +69,43 @@ COLORREF BrickColor[7] = RGB(168, 0, 168) }; +/** + * @brief 判断当前方块是否可以继续向下移动。 + * + * 遍历当前处于活动状态下方块的 4x4 矩阵,计算其下落一步(Y 坐标加 1)后的位置, + * 并检查每个非空方块单元: + * 1. 是否超出了游戏工作区的底部边界(对应数组索引 >= 20)。 + * 2. 是否与工作区下方已经固定的其他方块发生碰撞(即对应位置的值不为 0)。 + * 如果遇到以上任意一种情况,则认为方块受到阻挡,无法继续下落。 + * + * @return bool 如果可以继续安全下落返回 true,否则返回 false。 + */ bool CanMoveDown() { - // TODO(作业6): 判断当前方块是否可以继续下落。 + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + if (bricks[type][state][i][j] != 0) + { + int nextY = point.y + i + 1; + int nextX = point.x + j; + + // 检查是否到达底部边界 + if (nextY >= nGameHeight) + { + return false; + } + + // 检查下方是否有其他固定方块 + if (workRegion[nextY][nextX] != 0) + { + return false; + } + } + } + } + return true; }