Files
Tereis/Rogue_Tetris_功能设计文档.md
T

11 KiB

《Rogue Tetris》功能设计文档

1. 项目概述

本项目基于经典俄罗斯方块玩法,加入类肉鸽成长系统。玩家通过消除方块获得积分与经验,达到一定条件后触发升级,从随机出现的强化选项中选择一项,形成不同流派与策略组合。

游戏核心循环为:

下落方块 → 摆放 → 消行 → 获得积分/经验 → 升级 → 选择强化 → 提升能力 → 继续挑战

项目目标是在保留俄罗斯方块基础规则的同时,增强随机性、成长性和可重复游玩价值。


2. 基础玩法设计

2.1 棋盘设计

游戏区域采用标准俄罗斯方块棋盘:

const int BOARD_WIDTH = 10;
const int BOARD_HEIGHT = 20;

棋盘使用二维数组或 vector<vector<int>> 存储。

int board[BOARD_HEIGHT][BOARD_WIDTH];

其中:

数值 含义
0 空格
1-7 不同类型的普通方块
8 特殊方块,例如爆破方块

2.2 方块类型

游戏包含七种经典方块:

类型 说明
I 长条方块
O 方形方块
T T 型方块
S S 型方块
Z Z 型方块
J J 型方块
L L 型方块

2.3 玩家操作

按键 功能
A / ← 左移
D / → 右移
W / ↑ 旋转
S / ↓ 软降
空格 硬降
C 暂存方块
P 暂停

3. 肉鸽成长系统设计

3.1 经验获取

玩家通过消行获得经验。

消除行数 获得经验
1 行 10 EXP
2 行 25 EXP
3 行 45 EXP
4 行 80 EXP

3.2 升级规则

玩家经验达到当前等级需求后升级。

requiredExp = 100 + level * 50;

升级时:

  1. 游戏暂停;
  2. 随机生成若干强化选项;
  3. 玩家选择其中一个;
  4. 应用强化效果;
  5. 游戏继续。

3.3 升级流程示例

void levelUp() {
    player.level++;
    player.exp -= player.requiredExp;
    player.requiredExp = 100 + player.level * 50;

    vector<Upgrade> choices = upgradeSystem.getRandomUpgrades(player.upgradeChoiceCount);
    int selected = showUpgradeChoices(choices);
    upgradeSystem.applyUpgrade(choices[selected], player, board);
}

4. 强化系统设计

4.1 强化分类

类型 说明
得分强化 提高积分收益
操作强化 改善玩家操作体验
消行强化 增强消行效果
生存强化 降低游戏失败风险
特殊强化 改变游戏规则

5. 强化内容设计

5.1 得分类强化

1. 积分倍率

效果:所有得分提高 20%。

player.scoreMultiplier += 0.2f;

可重复获得。

2. 连击奖励

效果:连续消行时获得额外积分。

player.comboBonus += 50;

当玩家连续多个方块都产生消行时,触发连击奖励。

3. 四消强化

效果:一次消除 4 行时额外获得 300 分。

if (linesCleared == 4) {
    score += 300;
}

5.2 操作类强化

4. 慢速下落

效果:方块自然下落速度降低 10%。

player.fallSpeed *= 0.9f;

5. 额外预览

效果:增加下一个方块预览数量。

player.previewCount += 1;

6. 暂存槽

效果:解锁 Hold 功能,允许玩家暂存当前方块。

player.canHold = true;

5.3 消行类强化

7. 清扫者

效果:每累计消除 10 行,自动清除最底部一行。

if (player.totalLinesCleared % 10 == 0) {
    board.clearBottomLine();
}

8. 爆破方块

效果:每隔一定数量的方块,生成一个特殊爆破方块。爆破方块落地后清除周围 3x3 区域。

void explode(int x, int y) {
    for (int dy = -1; dy <= 1; dy++) {
        for (int dx = -1; dx <= 1; dx++) {
            board[y + dy][x + dx] = 0;
        }
    }
}

9. 经验强化

效果:消行获得经验提高 25%。

player.expMultiplier += 0.25f;

5.4 生存类强化

10. 最后一搏

效果:当玩家即将失败时,自动清除底部 3 行。每局只能触发一次。

player.hasRevive = true;

11. 减压

效果:每次升级后,自动清除当前最高的一行障碍。

board.clearHighestOccupiedLine();

12. 稳定结构

效果:方块锁定后,有小概率自动填补附近空洞。

if (rand() % 100 < 10) {
    board.fillNearbyHole();
}

5.5 特殊类强化

13. 双倍成长

效果:之后每次升级出现 4 个选项,而不是 3 个。

player.upgradeChoiceCount = 4;

14. 赌徒

效果:选择强化时有概率获得双倍效果,也有概率无效果。

int chance = rand() % 100;
if (chance < 30) {
    applyUpgradeTwice();
} else if (chance < 50) {
    noEffect();
}

15. 方块改造

效果:降低某一种方块的出现概率,例如减少 Z 方块出现概率。

blockWeight[BlockType::Z] -= 1;

6. 数据结构设计

6.1 方块结构

struct Tetromino {
    int type;
    int rotation;
    int x;
    int y;
    vector<vector<int>> shape;
};

6.2 玩家状态

struct PlayerStats {
    int score = 0;
    int level = 1;
    int exp = 0;
    int requiredExp = 100;

    int totalLinesCleared = 0;
    int combo = 0;
    int comboBonus = 0;

    float scoreMultiplier = 1.0f;
    float expMultiplier = 1.0f;
    float fallSpeed = 1.0f;

    bool canHold = false;
    bool hasRevive = false;

    int previewCount = 1;
    int upgradeChoiceCount = 3;
};

6.3 强化结构

enum class UpgradeType {
    Score,
    Control,
    Clear,
    Survival,
    Special
};

struct Upgrade {
    string name;
    string description;
    UpgradeType type;
    int level;
};

7. 计分系统设计

7.1 基础得分

消除行数 基础分
1 行 100
2 行 300
3 行 500
4 行 800

7.2 得分计算

int calculateScore(int linesCleared) {
    int baseScore = 0;

    switch (linesCleared) {
        case 1: baseScore = 100; break;
        case 2: baseScore = 300; break;
        case 3: baseScore = 500; break;
        case 4: baseScore = 800; break;
        default: return 0;
    }

    int finalScore = static_cast<int>(baseScore * player.scoreMultiplier);

    if (player.combo > 1) {
        finalScore += player.combo * player.comboBonus;
    }

    return finalScore;
}

8. 强化随机池设计

8.1 强化池初始化

vector<Upgrade> upgradePool;

void initUpgradePool() {
    upgradePool.push_back({
        "积分倍率",
        "所有得分提高20%",
        UpgradeType::Score,
        1
    });

    upgradePool.push_back({
        "慢速下落",
        "方块下落速度降低10%",
        UpgradeType::Control,
        1
    });

    upgradePool.push_back({
        "最后一搏",
        "失败时自动清除底部3行,每局一次",
        UpgradeType::Survival,
        1
    });
}

8.2 随机抽取强化

vector<Upgrade> getRandomUpgrades(int count) {
    vector<Upgrade> result;
    vector<Upgrade> pool = upgradePool;

    random_shuffle(pool.begin(), pool.end());

    for (int i = 0; i < count && i < pool.size(); i++) {
        result.push_back(pool[i]);
    }

    return result;
}

9. 主要类设计

9.1 Game 类

class Game {
private:
    Board board;
    Tetromino currentBlock;
    PlayerStats player;
    UpgradeSystem upgradeSystem;

public:
    void init();
    void update();
    void render();
    void handleInput();
    void checkGameOver();
};

9.2 Board 类

class Board {
private:
    int grid[20][10];

public:
    bool checkCollision(Tetromino block);
    void lockBlock(Tetromino block);
    int clearLines();
    void clearBottomLine();
    void clearHighestOccupiedLine();
    bool isGameOver();
};

9.3 UpgradeSystem 类

class UpgradeSystem {
private:
    vector<Upgrade> upgradePool;

public:
    void init();
    vector<Upgrade> getRandomUpgrades(int count);
    void applyUpgrade(Upgrade upgrade, PlayerStats& player, Board& board);
};

10. 游戏主流程

初始化游戏数据
↓
生成当前方块和预览方块
↓
进入游戏主循环
↓
读取玩家输入
↓
更新方块位置
↓
检测碰撞
↓
无法下落时锁定方块
↓
检测并消除完整行
↓
计算得分和经验
↓
判断是否升级
↓
若升级,进入强化选择界面
↓
应用强化效果
↓
继续游戏
↓
判断是否失败
↓
游戏结束,显示最终得分

11. 界面设计

11.1 主界面示意

+--------------------+----------------+
|                    | Score: 1200    |
|                    | Level: 3       |
|                    | EXP: 40/250    |
|                    |                |
|      游戏棋盘       | Next:          |
|                    | [T] [L] [I]    |
|                    |                |
|                    | Upgrades:      |
|                    | 积分倍率 Lv2   |
+--------------------+----------------+

11.2 升级界面示意

请选择一个强化:

[1] 积分倍率
所有得分提高20%

[2] 慢速下落
方块下落速度降低10%

[3] 最后一搏
失败时自动清除底部3行,每局一次

12. 模块划分

模块 功能
Game 控制游戏主循环
Board 管理棋盘数据
Tetromino 管理方块形状、旋转、移动
Renderer 负责界面绘制
InputManager 处理键盘输入
ScoreSystem 计算分数与经验
UpgradeSystem 管理强化池、升级、强化应用
PlayerStats 保存玩家成长数据

13. 开发优先级

优先级 内容
P0 实现基础俄罗斯方块逻辑
P0 实现消行和计分
P1 实现经验和升级系统
P1 实现随机强化三选一
P1 实现 5 到 8 个基础强化
P2 实现特殊方块,例如爆破方块
P2 实现 Hold、预览数量等操作强化
P3 增加稀有度、成就、存档等扩展内容

14. 技术实现建议

技术 用途
C++ 主体开发语言
STL vector 存储棋盘、方块、强化池
enum class 表示方块类型和强化类型
class 进行模块化封装
random 实现随机强化和随机方块
SFML / SDL / Qt 可选,用于图形界面

如果课程要求较基础,可以先完成控制台版本,再根据时间增加图形界面。


15. 创新点总结

本项目的主要创新点包括:

  1. 在传统俄罗斯方块中加入经验和等级系统;
  2. 将消行行为与角色成长绑定;
  3. 每次升级随机提供强化选项;
  4. 强化之间可以叠加,形成不同构筑路线;
  5. 加入生存类和特殊类强化,提高策略空间;
  6. 每局强化组合不同,提升重复游玩价值。

16. 结论

《Rogue Tetris》在经典俄罗斯方块的基础上引入类肉鸽升级机制,使游戏从单纯的消行挑战扩展为具有成长路线、随机选择和策略构筑的玩法。玩家每局都能通过不同强化组合形成不同体验,既保留了俄罗斯方块的核心规则,也体现了创新性,适合作为 C++ 课程大作业项目。