diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 0ff9cc1..43a170c 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -7,7 +7,7 @@ "intelliSenseMode": "windows-gcc-x64", "cppStandard": "c++17", "includePath": [ - "${workspaceFolder}\\src" + "${workspaceFolder}\\src\\include" ], "defines": [ "UNICODE", diff --git a/.vscode/launch.json b/.vscode/launch.json index ba6ab1d..f479702 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,7 +8,7 @@ "program": "${workspaceFolder}\\.vscode-build\\mingw\\Tetris.exe", "args": [], "stopAtEntry": false, - "cwd": "${workspaceFolder}\\src", + "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", diff --git a/README.md b/README.md index a7cdf7e..f2eb797 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,14 @@ ```text Tereis/ -├─ src/ 源代码 -├─ assets/ 图标、背景等资源文件 +├─ src/ +│ ├─ include/ 头文件 +│ ├─ source/ 源文件 +│ └─ resources/ Windows 资源脚本 +├─ assets/ +│ ├─ icons/ 图标资源 +│ ├─ images/ 图片资源 +│ └─ audio/ 音频资源 ├─ .vscode/ VS Code 配置 ├─ .vscode-build/ 本地构建输出目录 ├─ report/ 实验报告材料与草稿 @@ -88,9 +94,9 @@ powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 -Run ## 资源文件说明 -项目包含 Windows 资源文件 `src/Tetris.rc`,其中定义了图标、菜单、快捷键和关于框等内容。 +项目包含 Windows 资源文件 `src/resources/Tetris.rc`,其中定义了图标、菜单、快捷键和关于框等内容。 -由于原始 `Tetris.rc` 为 UTF-16 编码,当前构建脚本会在编译时临时转换资源文件编码,并将 `assets/` 中的图标文件一起编译进最终程序,因此资源不再被跳过。 +由于原始 `Tetris.rc` 为 UTF-16 编码,当前构建脚本会在编译时临时转换资源文件编码,并将 `assets/icons/` 中的图标文件一起编译进最终程序,因此资源不再被跳过。 ## 报告目录 @@ -119,4 +125,3 @@ powershell -NoProfile -ExecutionPolicy Bypass -File .\build-mingw.ps1 -Run - 完善分数与状态提示 - 增加创新功能 - 补充测试截图和实验分析 - diff --git a/VSCode运行说明.md b/VSCode运行说明.md index 521ef2e..f7bbd61 100644 --- a/VSCode运行说明.md +++ b/VSCode运行说明.md @@ -1,6 +1,6 @@ # VS Code 运行说明 -1. 用 VS Code 打开本文件所在文件夹: `C:\Users\27282\Desktop\src_学生版` +1. 用 VS Code 打开项目根目录。 2. 安装 VS Code 扩展: `C/C++`,发布者是 `Microsoft` 3. 按 `Ctrl+Shift+B` 编译 4. 按 `F5` 调试运行,或在命令面板执行 `Tasks: Run Task` -> `run Tetris MinGW` @@ -8,6 +8,6 @@ 说明: - 默认配置优先使用系统 `PATH` 中的 `g++.exe` / `gdb.exe`,也兼容 `C:\mingw64\bin\g++.exe`。 -- 源码目录是 `src`,资源目录是 `assets`。 +- 源码目录已按工程结构整理为 `src/include`、`src/source`、`src/resources`,资源目录已整理为 `assets/icons`、`assets/images`、`assets/audio`。 - MinGW 构建输出文件在 `.vscode-build\mingw\Tetris.exe`。 -- 由于原项目的 `Tetris.rc` 是 UTF-16,MinGW 暂不编译资源文件;这只影响图标/菜单资源,不影响源码编译运行。 +- `Tetris.rc` 位于 `src/resources`,构建脚本会在编译时临时转换编码并编译资源文件。 diff --git a/assets/background.wav b/assets/audio/background.wav similarity index 100% rename from assets/background.wav rename to assets/audio/background.wav diff --git a/assets/Tetris.ico b/assets/icons/Tetris.ico similarity index 100% rename from assets/Tetris.ico rename to assets/icons/Tetris.ico diff --git a/assets/small.ico b/assets/icons/small.ico similarity index 100% rename from assets/small.ico rename to assets/icons/small.ico diff --git a/assets/background.bmp b/assets/images/background.bmp similarity index 100% rename from assets/background.bmp rename to assets/images/background.bmp diff --git a/build-mingw.ps1 b/build-mingw.ps1 index 021f252..8b1b9ba 100644 --- a/build-mingw.ps1 +++ b/build-mingw.ps1 @@ -6,10 +6,14 @@ $ErrorActionPreference = "Stop" $Root = Split-Path -Parent $MyInvocation.MyCommand.Path $ProjectDir = Join-Path $Root "src" +$IncludeDir = Join-Path $ProjectDir "include" +$SourceDir = Join-Path $ProjectDir "source" +$ResourceDir = Join-Path $ProjectDir "resources" $AssetsDir = Join-Path $Root "assets" +$IconDir = Join-Path $AssetsDir "icons" $BuildDir = Join-Path $Root ".vscode-build\mingw" $ExePath = Join-Path $BuildDir "Tetris.exe" -$RcPath = Join-Path $ProjectDir "Tetris.rc" +$RcPath = Join-Path $ResourceDir "Tetris.rc" $RcUtf8Path = Join-Path $BuildDir "Tetris.utf8.rc" $ResObjPath = Join-Path $BuildDir "Tetris.res.o" @@ -58,22 +62,22 @@ foreach ($Candidate in $WindresCandidates) { New-Item -ItemType Directory -Force -Path $BuildDir | Out-Null $Sources = @( - (Join-Path $ProjectDir "stdafx.cpp"), - (Join-Path $ProjectDir "Tetris.cpp"), - (Join-Path $ProjectDir "TetrisLogic.cpp"), - (Join-Path $ProjectDir "TetrisRender.cpp") + (Join-Path $SourceDir "stdafx.cpp"), + (Join-Path $SourceDir "Tetris.cpp"), + (Join-Path $SourceDir "TetrisLogic.cpp"), + (Join-Path $SourceDir "TetrisRender.cpp") ) $LinkInputs = @() if ($Windres -and (Test-Path $RcPath)) { $RcContent = Get-Content -Path $RcPath -Raw -Encoding Unicode - $RcContent = $RcContent.Replace('"Tetris.ico"', ('"' + ((Join-Path $AssetsDir "Tetris.ico") -replace '\\', '/') + '"')) - $RcContent = $RcContent.Replace('"small.ico"', ('"' + ((Join-Path $AssetsDir "small.ico") -replace '\\', '/') + '"')) + $RcContent = $RcContent.Replace('"Tetris.ico"', ('"' + ((Join-Path $IconDir "Tetris.ico") -replace '\\', '/') + '"')) + $RcContent = $RcContent.Replace('"small.ico"', ('"' + ((Join-Path $IconDir "small.ico") -replace '\\', '/') + '"')) [System.IO.File]::WriteAllText($RcUtf8Path, $RcContent, [System.Text.UTF8Encoding]::new($false)) & $Windres ` - -I $ProjectDir ` + -I $IncludeDir ` $RcUtf8Path ` -O coff ` -o $ResObjPath @@ -94,7 +98,7 @@ if ($Windres -and (Test-Path $RcPath)) { -DUNICODE ` -D_UNICODE ` -D_WINDOWS ` - -I $ProjectDir ` + -I $IncludeDir ` @Sources ` @LinkInputs ` -lwinmm ` @@ -107,5 +111,5 @@ if ($LASTEXITCODE -ne 0) { } if ($Run) { - Start-Process -FilePath $ExePath -WorkingDirectory $ProjectDir + Start-Process -FilePath $ExePath -WorkingDirectory $Root } diff --git a/list.md b/list.md index c156894..ae25556 100644 --- a/list.md +++ b/list.md @@ -4,50 +4,48 @@ 简要说明:完成程序入口、主窗口创建、消息循环和基础对话框处理。 -- [ ] `_tWinMain` - `src/Tetris.cpp` -- [ ] `MyRegisterClass` - `src/Tetris.cpp` -- [ ] `InitInstance` - `src/Tetris.cpp` -- [ ] `WndProc` - `src/Tetris.cpp` -- [ ] `About` - `src/Tetris.cpp` +- [ ] `_tWinMain` - `src/source/Tetris.cpp` +- [ ] `MyRegisterClass` - `src/source/Tetris.cpp` +- [ ] `InitInstance` - `src/source/Tetris.cpp` +- [ ] `WndProc` - `src/source/Tetris.cpp` +- [ ] `About` - `src/source/Tetris.cpp` ## 第二阶段:游戏区域与状态初始化 简要说明:完成游戏初始状态建立和重新开始相关逻辑。 -- [ ] `Restart` - `src/TetrisLogic.cpp` +- [ ] `Restart` - `src/source/TetrisLogic.cpp` ## 第三阶段:方块生成、移动与旋转 简要说明:完成方块的基础操作,包括下落、左右移动、旋转和快速到底。 -- [ ] `MoveDown` - `src/TetrisLogic.cpp` -- [ ] `MoveLeft` - `src/TetrisLogic.cpp` -- [ ] `MoveRight` - `src/TetrisLogic.cpp` -- [ ] `Rotate` - `src/TetrisLogic.cpp` -- [ ] `DropDown` - `src/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` ## 第四阶段:碰撞检测与方块固定 简要说明:完成越界判断、碰撞检测、方块落地固定和结束判定。 -- [ ] `CanMoveDown` - `src/TetrisLogic.cpp` -- [ ] `CanMoveLeft` - `src/TetrisLogic.cpp` -- [ ] `CanMoveRight` - `src/TetrisLogic.cpp` -- [ ] `Fixing` - `src/TetrisLogic.cpp` -- [ ] `GameOver` - `src/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` ## 第五阶段:消除逻辑与分数系统 简要说明:完成消行、行下移和得分更新等核心反馈机制。 -- [ ] `DeleteOneLine` - `src/TetrisLogic.cpp` -- [ ] `DeleteLines` - `src/TetrisLogic.cpp` +- [ ] `DeleteOneLine` - `src/source/TetrisLogic.cpp` +- [ ] `DeleteLines` - `src/source/TetrisLogic.cpp` ## 第六阶段:界面绘制与扩展功能 简要说明:完成游戏界面绘制,并实现落点预测等增强功能。 -- [ ] `ComputeTarget` - `src/TetrisLogic.cpp` -- [ ] `TDrawScreen` - `src/TetrisRender.cpp` - -## 第七阶段:创新扩展 \ No newline at end of file +- [ ] `ComputeTarget` - `src/source/TetrisLogic.cpp` +- [ ] `TDrawScreen` - `src/source/TetrisRender.cpp` diff --git a/report/report.md b/report/report.md index f16f235..df72fa6 100644 --- a/report/report.md +++ b/report/report.md @@ -23,12 +23,13 @@ ## 2 总体框架 -项目源码位于 `src/` 目录,整体上可分为以下几个部分: +项目源码位于 `src/` 目录,按照工程结构进一步划分为 `include`、`source` 和 `resources` 三个子目录,整体上可分为以下几个部分: -- `Tetris.cpp`:程序入口、窗口创建与消息处理 -- `TetrisLogic.cpp`:核心游戏逻辑,如移动、旋转、消行和结束判定 -- `TetrisRender.cpp`:界面绘制 -- `Tetris.h`:全局常量、结构体与函数声明 +- `src/source/Tetris.cpp`:程序入口、窗口创建与消息处理 +- `src/source/TetrisLogic.cpp`:核心游戏逻辑,如移动、旋转、消行和结束判定 +- `src/source/TetrisRender.cpp`:界面绘制 +- `src/include/Tetris.h`:全局常量、结构体与函数声明 +- `src/resources/Tetris.rc`:窗口图标、菜单与对话框等资源定义 - `build-mingw.ps1`:MinGW 构建脚本 整体流程可以概括为:程序启动后创建窗口并初始化数据,随后在消息循环中响应用户输入和定时事件,驱动游戏状态更新,再由绘图模块将当前状态显示到窗口中。 @@ -107,4 +108,3 @@ ## 6 结论 本实验完成了一个基于 C++ 和 Windows API 的俄罗斯方块程序的整理与验证工作。通过对源码结构、功能模块和构建流程的分析,可以看出该项目已经具备较完整的程序框架和基础功能。实验过程中,不仅实现了游戏核心逻辑,也进一步理解了图形界面程序的组织方式和工程调试方法。后续若继续完善,可从界面效果、资源管理、可维护性和测试完整性等方面进一步优化。 - diff --git a/src/Tetris.h b/src/include/Tetris.h similarity index 100% rename from src/Tetris.h rename to src/include/Tetris.h diff --git a/src/resource.h b/src/include/resource.h similarity index 100% rename from src/resource.h rename to src/include/resource.h diff --git a/src/stdafx.h b/src/include/stdafx.h similarity index 100% rename from src/stdafx.h rename to src/include/stdafx.h diff --git a/src/targetver.h b/src/include/targetver.h similarity index 100% rename from src/targetver.h rename to src/include/targetver.h diff --git a/src/Tetris.rc b/src/resources/Tetris.rc similarity index 100% rename from src/Tetris.rc rename to src/resources/Tetris.rc diff --git a/src/Tetris.cpp b/src/source/Tetris.cpp similarity index 100% rename from src/Tetris.cpp rename to src/source/Tetris.cpp diff --git a/src/TetrisLogic.cpp b/src/source/TetrisLogic.cpp similarity index 100% rename from src/TetrisLogic.cpp rename to src/source/TetrisLogic.cpp diff --git a/src/TetrisRender.cpp b/src/source/TetrisRender.cpp similarity index 100% rename from src/TetrisRender.cpp rename to src/source/TetrisRender.cpp diff --git a/src/stdafx.cpp b/src/source/stdafx.cpp similarity index 100% rename from src/stdafx.cpp rename to src/source/stdafx.cpp