完成第五阶段消行与得分逻辑 完成函数15 16
This commit is contained in:
@@ -43,8 +43,8 @@
|
||||
|
||||
简要说明:完成删除单行、批量消行以及相关分数更新逻辑。
|
||||
|
||||
- [ ] `15. DeleteOneLine` - `src/source/TetrisLogic.cpp`
|
||||
- [ ] `16. DeleteLines` - `src/source/TetrisLogic.cpp`
|
||||
- [x] `15. DeleteOneLine` - `src/source/TetrisLogic.cpp`
|
||||
- [x] `16. DeleteLines` - `src/source/TetrisLogic.cpp`
|
||||
|
||||
## 第六阶段:界面绘制与整体完善
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 49 KiB |
@@ -288,15 +288,61 @@ void Fixing()
|
||||
point.y = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 删除指定行,并让其上方所有行整体下移一格。
|
||||
*
|
||||
* 该函数会先将目标行上方的所有数据逐行向下复制,
|
||||
* 再把最顶端一行清空,从而完成一次标准的消行下移操作。
|
||||
*
|
||||
* @param number 需要被删除的目标行号。
|
||||
*/
|
||||
void DeleteOneLine(int number)
|
||||
{
|
||||
// TODO(作业15): 删除指定行,并让其上方所有行整体下移。
|
||||
UNREFERENCED_PARAMETER(number);
|
||||
for (int i = number; i > 0; i--)
|
||||
{
|
||||
for (int j = 0; j < nGameWidth; j++)
|
||||
{
|
||||
workRegion[i][j] = workRegion[i - 1][j];
|
||||
}
|
||||
}
|
||||
|
||||
// 清空最顶端一行
|
||||
for (int j = 0; j < nGameWidth; j++)
|
||||
{
|
||||
workRegion[0][j] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 检查并删除所有已满的行,同时更新当前得分。
|
||||
*
|
||||
* 该函数会从底部向上遍历工作区,判断每一行是否被完全填满。
|
||||
* 如果某一行全部非 0,则调用 DeleteOneLine 删除该行,
|
||||
* 并将该行上方的内容整体下移。为了避免连续满行被漏检,
|
||||
* 删除后会继续检查当前行号。每成功消除 1 行,当前得分增加 100 分。
|
||||
*/
|
||||
void DeleteLines()
|
||||
{
|
||||
// TODO(作业16): 完成消行与计分逻辑。
|
||||
for (int i = nGameHeight - 1; i >= 0; i--)
|
||||
{
|
||||
bool fullLine = true;
|
||||
|
||||
for (int j = 0; j < nGameWidth; j++)
|
||||
{
|
||||
if (workRegion[i][j] == 0)
|
||||
{
|
||||
fullLine = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fullLine)
|
||||
{
|
||||
DeleteOneLine(i);
|
||||
tScore += 100;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user