RS

· · 个人记录


/********************************************************************
 *  滚动的天空(Scroll Sky)——自定义地图版(最新版)
 *  1. 三个关卡(入门、跳跃、看不清的路)
 *  2. 新增跳板 T:平滑跳跃 4 行(每帧 1 行),空中用小写 o 表示
 *  3. 按键累计移动:同一帧内多次 a/d 可一次性左/右移动多列
 *  4. 越界移动视为掉入虚空(死亡)
 ********************************************************************/

// ---------- 标准库 ----------
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>      // system、rand、srand
#include <ctime>        // time
#include <conio.h>      // _kbhit、_getch
#include <algorithm>    // std::max、std::min
#include <windows.h>    // SetConsoleOutputCP、MessageBoxW、Sleep
#undef max
#undef min
using namespace std;

// ---------- 常量 ----------
const int MAP_WIDTH   = 5;          // 列数(固定 5)
const int VIEW_HEIGHT = 13;         // 每帧显示的行数
const int VIEW_WIDTH  = 5;          // 每帧显示的列数(与 MAP_WIDTH 相同)
const char FLOOR       = '_';      // 正常地面(下划线)
const char PLAYER      = 'O';      // 玩家(站在地面时显示)
const char PLAYER_AIR  = 'o';      // 玩家(空中跳跃时显示)
const char OBSTACLE    = 'Z';      // 普通障碍
const char PENDULUM    = 'B';      // 摆锤
const char EMPTY_SPACE = ' ';      // 虚空(死亡)
const char JUMP_PAD    = 'T';      // 跳板
const char DIMOND      = '@';      // 钻石
const char CROWN       = '#';      // 皇冠
const char CANNON      = 'A';      // 激光炮
const char CANNON_BOOM = '|';      // 激光

int dimond, crown;  // 钻石,皇冠

// ---------- 辅助函数 ----------
bool isFloor(char c) {
    return c == FLOOR || c == JUMP_PAD || c == DIMOND || c == CROWN || c == ' ';
}
bool isDead(const vector<string>& map, int row, int col) {
    char cell = map[row][col];
    return cell == OBSTACLE || cell == PENDULUM || cell == EMPTY_SPACE

           || cell == CANNON || cell == CANNON_BOOM;
}

// 渲染当前视口
void render(const vector<string>& map, int playerRow, int playerCol,bool inAir, int offset) {
    system("cls");
    for (int r = 0; r < VIEW_HEIGHT; ++r) {
        int mapR = offset + r;
        if (mapR >= (int)map.size()) break;
        for (int c = 0; c < VIEW_WIDTH; ++c) {
            if (mapR == playerRow && c == playerCol) {
                cout << (inAir ? PLAYER_AIR : PLAYER);
            } else {
                cout << map[mapR][c];
            }
        }
        cout << '\n';
    }
}

// 死亡提示
bool deathPrompt() {
    sleep(1);
    cout << "\n你掉进了虚空或碰到了障碍!\n";
    sleep(1);
    cout << "按 空格键 重新开始,按 A 键 退出游戏\n";
    while (true) {
        char k = _getch();
        if (k == ' ') return true;               // 重新开始
        if (k == 'a' || k == 'A') return false;  // 退出
    }
}

// --------------------------------------------------------------
// 读取自定义地图(返回 map、起始行列)
// --------------------------------------------------------------
pair<vector<string>, pair<int,int>> loadCustomMap(int level) {
    vector<string> rawLines;
    // ……(保持原始地图数据不变)……
    // 为了篇幅,这里省略了 4 星关卡的完整数据,直接使用原代码中的 rawLines
    // 请自行复制原始代码中对应 level==1、2、3、4 的 rawLines 内容
    // (下面仅保留 level==1、2、3 的示例,实际使用时请把全部复制进去)

    if (level == 1) { // 入门
        rawLines = {
            "_____",
            "_Z_Z_","Z_@_Z","_____","_____","BB_BB"," ___ ","_____","_____",
            "__Z__","_____","Z___Z"," ___ ","  _  ","     ","     ","  T  ","___@_",
            "_____",
            " _BB ",
            "_____",
            "_____",
            "_____",
            " BB_ ",
            "_____",
            " ___ ",
            "  _  ",
            "     ",
            "     ",
            "TTZTT",
            "@____",
            "Z___Z",
            "AZ_ZA",
            "|___|",
            "|___|",
            "|_Z_|",
            "|___|",
            "|___|",
            "Z___Z",
            "_____",
            "Z___Z",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "__O__"
        };
    } else if (level == 2) { // 跳跃
        rawLines = {
            "_____","_____","_BB__","_____","_____","__BB_","_____"," ___ "," Z_Z ",
            "Z___Z","     ","     ","     ","Z_T_Z","_____","__#__","_ZTZ_","_____",
            "__Z__","_____","____@","Z___Z","TZ_ZT","Z___Z","_____","_____","   __",
            "   Z_","  Z__"," Z___","Z____","_____","____ ","___  ","__   ","     ",
            "     ","     ","T    ","_Z   ","__Z  ","___Z ","___@Z","_____"," ____",
            "  ___","   __","     ","     ","T    ","     ","     ","     ","  T  ",
            "     ","     ","_    ","T_Z  ","___Z ","____Z","Z__@Z","_____","Z___Z",
            "_____","Z___Z","_____","_____","_____","_____","_____","__O__"
        };
    } else if (level == 3) { // 看不清的路
        rawLines = {
            "_____","#____","__ BB","BB __","_____","___ZT","_____","_____","_____",
            "__ ZZ","__ __","__ __","__ __","__ __","@_ __","__ __","__Z__","_____",
            "_____","_____","ZZ __","__ __","__ __","__ __","__ __","__ __","__Z__",
            "_____","_____","_____","ZZ __","__ __","__ __","__ _@","__ __","__ __",
            "__Z__","_____","_____","_____","_Z___","_____","____Z","_____","____ ",
            "__   "," ___ ","  ___","__Z__","_____","_____","@___Z","____ ","__   ",
            "___  ","____ ","_____"," ____","  ___"," ____","_____","_____","__O__"
        };
    } else if (level == 4) {
        rawLines = {
            "_____",
            "     ",
            "     ",
            "     ",
            "  T  ",
            " A_A ",
            " |_| ",
            " |_| ",
            " |_| ",
            " |_| ",
            " |_| ",
            " ___ ",
            "__ __",
            "_   _",
            "__ __",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _ ",
            " ___ ",
            "  _  ",
            " ___ ",
            "__ __",
            "_   _",
            "__ __",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _ ",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _ ",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _ ",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _ ",
            " ___ ",
            "  _  ",
            " ___ ",
            " _ _",
            " ___ ",
            "  _  ",
            "_____",
            "_A A_",
            "_| |_",
            "_| |_",
            " |T| ",
            " |@| ",
            " | | ",
            " _T_ ",
            "__Z__",
            "T___T",
            "BB_BB",
            " ___ ",
            "__ __",
            "_ Z _",
            "     ",
            "     ",
            "     ",
            " TTT ",
            "_@___",
            "_   _",
            "BB__#",
            " __BB",
            " _T  ",
            "  __ ",
            " BB_ ",
            "Z___Z",
            "TZ_ZT",
            "Z___Z",
            "__ __",
            "_ZZZ_",
            "_ZTZ_",
            "_ZZZ_",
            "     ",
            "T   T",
            "ZT TZ",
            "T   T",
            "     ",
            "T   T",
            "_T T_",
            "__T__",
            "Z_A_Z",
            "__|__",
            "_ | _",
            "  |  ",
            "  |  ",
            " Z|Z ",
            "__T__",
            "_Z Z_",
            "@Z Z_",
            "_Z Z_",
            "_Z Z_",
            "_Z_Z_",
            "_ A _",
            "__|__",
            " _|_ ",
            "  |  ",
            "  |  ",
            "  |  ",
            "T   T",
            "_____",
            "TZ_ZT",
            "Z___Z",
            "__ __",
            "_   _",
            "     ",
            " Z Z ",
            "  _  ",
            " _T_ ",
            "_____",
            "_ZZZ_",
            "_____",
            "BB_BB",
            "     ",
            "     ",
            "     ",
            "TZZZT",
            "_____",
            "_____",
            "BBOBB"
        };
    } else if (level == 5) {
        rawLines = {
            "_____",
            "_____",
            " ___ ",
            "  #  ",
            "  _  ",
            "  _  ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            " ___ ",
            "__ __",
            "@   _",
            "     ",
            "     ",
            "A   A",
            "|BBT|",
            "|   |",
            "|   |",
            "|   |",
            "|TBB|",
            "_____",
            "__@__",
            "_ BB_",
            "_BB__",
            "A_Z_A",
            "|___|",
            "|A_A|",
            "||_||",
            "||_||",
            "|| ||",
            " | | ",
            " | | ",
            "T___T",
            "A_A_A",
            "|_|_|",
            "|_|_|",
            "|@|_|",
            "|_|_|",
            "|_|_|",
            "_____",
            "_ _ _",
            "_ _ _",
            "_A_A_",
            "_|@|_",
            "_|_|_",
            " | | ",
            " | | ",
            " | | ",
            "__T__",
            "__BB_",
            " ____",
            "__BB#",
            "_    ",
            "__   ",
            " _   ",
            "TZZZT",
            "__A__",
            " _|_ ",
            " T|T ",
            "  |  ",
            "  |  ",
            "T_|_T",
            "T___T",
            "_Z@Z_",
            "_ZZZ_",
            "_____",
            "Z___Z",
            "TZ_Z ",
            "Z___Z",
            " _Z_ ",
            "Z___Z",
            " Z_ZT",
            "Z___Z",
            "__ __",
            "_ZZZ_",
            " T T ",
            "     ",
            "     ",
            "  T  ",
            " T_T ",
            " Z_Z ",
            "_____",
            "_Z_Z_",
            "@____",
            " ___ ",
            "BB_BB",
            "_____",
            "#_A__",
            " A|A ",
            " ||| ",
            " |||T",
            " |||T",
            " ||| ",
            " | | ",
            "  T  ",
            "  T  ",
            "     ",
            "     ",
            "T    ",
            "T    ",
            "     ",
            "     ",
            "  T  ",
            "  T  ",
            " A   ",
            " |   ",
            " | AT",
            " | |T",
            " | |_",
            " | |_",
            "  T|_",
            " __|_",
            "__Z__",
            "_ZA_Z",
            "_ |__",
            "__| _",
            "Z_|Z ",
            " _|_ ",
            " _|_ ",
            "BB__T",
            " _@BB",
            "  ___",
            "T _Z_",
            "_BB__",
            "__A_Z",
            "__|__",
            "__|Z_",
            "A_|__",
            "|_|_A",
            "|_|_|",
            "|_BB|",
            "|___|",
            "|Z_Z|",
            "T_BB|",
            "Z___T",
            "  T__",
            "TZ_Z_",
            "_Z_Z_",
            "_Z_Z_",
            "_____",
            "BB_BB",
            " A_A ",
            " | | ",
            " | | ",
            " | | ",
            "T| |T",
            "@| |_",
            "     ",
            "     ",
            "     ",
            "A  TA",
            "|   |",
            "|   |",
            "|   |",
            "|TA |",
            "| | |",
            "A |  ",
            "| |  ",
            "| |AT",
            "| || ",
            "|  | ",
            "|  | ",
            " AT| ",
            " | | ",
            " |   ",
            " |   ",
            "T|   ",
            " |   ",
            "     ",
            "     ",
            " ZTZ ",
            "A___A",
            "|___|",
            "|BB_|",
            "|___|",
            "|___|",
            "|___|",
            "A_BBA",
            "|___|",
            "|__@|",
            "|___|",
            "|BB_|",
            "|___|",
            "A___A",
            "|___|",
            "|_BB|",
            "|___|",
            "|@__|",
            "|Z_Z|",
            "_____",
            "__A__",
            " _|_ ",
            "__|__",
            "__|__",
            "_ | _",
            "__|__",
            " ___ ",
            "  _  ",
            "  O  "
        };
    } else if (level == 6) {
        rawLines = {
            "_____",
            " ___ ",
            "     ",
            "     ",
            "     ",
            "    T",
            "     ",
            "     ",
            "     ",
            "   T ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            "T    ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "_A_A_",
            "_|@|_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "Z___Z",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_T_T_",
            "T_T_T",
            "_T_T_",
            "T_T_T",
            "_T_T_",
            "T_T_T",
            "_T_T_",
            "T_T_T",
            "_T_T_",
            "T_T_T",
            "_T_T_",
            "T_T_T",
            "_____",
            "_____",
            "_____",
            "_____",
            "BB_BB",
            "_____",
            "_____",
            "_____",
            "_____",
            "_ZZZ_",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "Z_@_Z",
            "_____",
            "_____",
            "_____",
            "_____",
            "_Z_Z_",
            "__Z__",
            "_____",
            "_____",
            "_____",
            " ___ ",
            "BB_BB",
            "_____",
            "_____",
            "_____",
            "__A__",
            "__|__",
            "__|__",
            "__|__",
            "_@|__",
            "__|__",
            "__Z__",
            "_____",
            "_____",
            "Z___Z",
            "_____",
            " ___ ",
            "     ",
            "     ",
            "     ",
            " TTT ",
            "_____",
            "____ ",
            "___  ",
            "__   ",
            "___  ",
            "____ ",
            "_____",
            " ____",
            "  ___",
            "   __",
            "  ___",
            " ____",
            "_____",
            "____ ",
            "___  ",
            "__   ",
            "___  ",
            "____ ",
            "_____",
            " ____",
            "  ___",
            "   __",
            "  ___",
            " ____",
            "_____",
            "____ ",
            "___  ",
            "__   ",
            "___  ",
            "____ ",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "_____",
            "__O__"
        };
    } else if (level == 7) {
        rawLines = {
            "_____",
            " ___ ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _Z ",
            "  ___",
            "   Z_",
            "_____",
            "_____",
            "_    ",
            "___  ",
            "  _  ",
            "_____",
            "_   _",
            "     ",
            "     ",
            "     ",
            "_T T_",
            "_ZZZ_",
            "_____",
            "  _  ",
            "  ___",
            "    _",
            "  ___",
            "  _  ",
            "___  ",
            "_    ",
            "___  ",
            "  _  ",
            "  ___",
            "    _",
            "  ___",
            "  _  ",
            "___  ",
            "_    ",
            "___  ",
            "  _  ",
            "_____",
            "_ZZZ_",
            "_____",
            "BB_BB",
            "_____",
            "_ZZZ_",
            "_____",
            "BB_BB",
            "_____",
            "_ZZZ_",
            "_____",
            "BB_BB",
            "_____",
            "_ZZZ_",
            "_____",
            "BB_BB",
            "_____",
            "_ZZZ_",
            "_____",
            "BB_BB",
            "_____",
            "_ZZZ_",
            "_____",
            "BB_BB",
            "_____",
            "_ZZZ_",
            "__Z__",
            "Z_Z_Z",
            "__A__",
            "_Z|Z_",
            "__|__",
            "Z_|_Z",
            "__|__",
            "_Z|Z_",
            "_____",
            " ZOZ "
        };
    } else if (level == 8) {
        rawLines = {
            "BB_BB",
            " ___ ",
            "_____",
            "_Z Z_",
            "__Z__",
            " ___ ",
            "  _  ",
            "  A  ",
            "  |  ",
            "  |  ",
            "TA|AT",
            " ||| ",
            " ||| ",
            " | | ",
            "A|T|A",
            "|| ||",
            "|   |",
            "|   |",
            "|TAT|",
            "| | |",
            "  |  ",
            "  |  ",
            "AT|TA",
            "| | |",
            "|   |",
            "|   |",
            "| T |",
            "|Z_Z|",
            "Z___Z",
            "_____",
            "_ _ _",
            "_____",
            "Z_ _Z",
            "_____",
            "_ _ @",
            "_____",
            "Z_ _Z",
            "_____",
            "@ _ _",
            "_____",
            "Z_ _Z",
            "_____",
            "_ _ @",
            "_____",
            "Z_ _Z",
            "_____",
            "@ _ _",
            "_____",
            "Z_ _Z",
            "_____",
            "_ _ @",
            "_____",
            "Z___Z",
            "__ __",
            "_A A_",
            " | | ",
            " | | ",
            " | | ",
            " |T| ",
            "Z|_|Z",
            "_____",
            "__#__",
            "_Z_Z_",
            "__Z__",
            "_____",
            "_____",
            "_Z_Z_",
            "Z___Z",
            "_____",
            "__#__",
            "_Z_Z_",
            "__Z__",
            "_____",
            "_____",
            "_Z#Z_",
            "Z___Z",
            "_____",
            "__Z__",
            "_Z_Z_",
            "_____",
            "_____",
            "Z___Z",
            "_____",
            "__Z__",
            "_Z_Z_",
            "_____",
            "_____",
            "Z___Z",
            "_____",
            "__Z__",
            "_Z_Z_",
            "_____",
            "_____",
            "Z___Z",
            "_____",
            "__Z__",
            "_Z_Z_",
            "_____",
            "Z___Z",
            "_____",
            "__Z__",
            "_Z_Z_",
            "_____",
            "_____",
            "Z___Z",
            "_____",
            "__Z__",
            "_Z_Z_",
            "_____",
            "Z___Z",
            "_Z@Z_",
            "_Z___",
            "_Z_Z@",
            "_Z___",
            "_Z_Z_",
            "___Z_",
            "@Z_ZZ",
            "___Z_",
            "_Z_Z_",
            "_Z___",
            "ZZ_Z@",
            "_Z___",
            "_Z_Z_",
            "___Z_",
            "_Z_Z_",
            "@__ZZ",
            "_Z_Z_",
            "_Z___",
            "_Z_Z@",
            "_Z___",
            "_Z_Z_",
            "___Z_",
            "@Z_ZZ",
            "___Z_",
            "_Z_Z_",
            "_Z___",
            "ZZ_Z@",
            "_Z___",
            "_Z_Z_",
            "___Z_",
            "_Z_Z_",
            "@__ZZ",
            "_Z@Z_",
            "_ZOZ_"
        };
    } else if (level == 9) {
        rawLines = {
            "_A_A_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "A|_|A",
            "||_||",
            "|___|",
            "|___|",
            "|___|",
            "|_A_|",
            "__|__",
            "__|__",
            "__|__",
            "__|__",
            "__|__",
            "_____",
            "_____",
            "_____",
            "_____",
            "__#__",
            "_A_A_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "_____",
            "_____",
            "__Z__",
            "_____",
            "_____",
            "A___A",
            "|___|",
            "|___|",
            "|___|",
            "|___|",
            "|___|",
            "_____",
            "_____",
            " ___ ",
            "  _  ",
            "     ",
            "     ",
            "     ",
            " TTT ",
            " @ _ ",
            "     ",
            " TTT ",
            " TZT ",
            "_____",
            "_____",
            "_ZTZ_",
            "_A_A_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "_|_|_",
            "_____",
            "_____",
            " ___ ",
            " ___ ",
            " ___ ",
            "  _  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "   T ",
            "     ",
            "     ",
            "     ",
            "   T ",
            "     ",
            "     ",
            "     ",
            "   T ",
            "     ",
            "     ",
            "     ",
            "   T ",
            "     ",
            "     ",
            "     ",
            "   T ",
            "     ",
            "     ",
            "     ",
            "   T ",
            "     ",
            "     ",
            "     ",
            "   T ",
            "     ",
            "     ",
            "     ",
            "    T",
            "     ",
            "     ",
            "     ",
            "    T",
            "     ",
            "     ",
            "     ",
            "    T",
            "     ",
            "     ",
            "     ",
            "    T",
            "     ",
            "     ",
            "     ",
            "    T",
            "     ",
            "     ",
            "     ",
            "    T",
            "     ",
            "     ",
            "     ",
            "    T",
            "    _",
            "    _",
            "    _",
            "    _",
            "    _",
            "   __",
            "   __",
            "   __",
            "   __",
            "   __",
            "  __ ",
            "  __ ",
            "  __ ",
            "  __ ",
            "  __ ",
            " __  ",
            " __  ",
            " __  ",
            " __  ",
            " __  ",
            "__   ",
            "__   ",
            "__   ",
            "__   ",
            "__   ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "__   ",
            "__   ",
            "__   ",
            "__   ",
            "__   ",
            " __  ",
            " __  ",
            " __  ",
            " __  ",
            " __  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            "T    ",
            "     ",
            "     ",
            "     ",
            "T    ",
            "     ",
            "     ",
            "     ",
            "T    ",
            "     ",
            "     ",
            "     ",
            "T    ",
            "     ",
            "     ",
            "     ",
            "T    ",
            "     ",
            "     ",
            "     ",
            "T    ",
            "     ",
            "     ",
            "     ",
            "T    ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            " T   ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "  #  ",
            " ___ ",
            " ___ ",
            " _T_ ",
            "  _  ",
            "  _  ",
            "  _  ",
            " T T ",
            "     ",
            "     ",
            "  T  ",
            " T T ",
            " _ _ ",
            " _ _ ",
            "  T  ",
            "     ",
            "     ",
            " TZT ",
            "Z_T_Z",
            " ___ ",
            " ___ ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            " __  ",
            "___  ",
            "___  ",
            "_ _  ",
            "_ _  ",
            "@ _  ",
            "_ _  ",
            "_ _  ",
            "_ _  ",
            "___  ",
            "___  ",
            " __  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            " ___ ",
            " ___ ",
            " ___ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            "_____",
            "_____",
            "_____",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "@ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_ _ _",
            "_____",
            "_____",
            "_____",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " _ _ ",
            " ___ ",
            " ___ ",
            " ___ ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "     ",
            "     ",
            "     ",
            "  T  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            " __  ",
            " __  ",
            " __  ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            "__   ",
            "__   ",
            "__   ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "_    ",
            "__   ",
            "__   ",
            "__   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " _   ",
            " __  ",
            " __  ",
            " __  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            "  _  ",
            " _O_ "
        };
    }

    // 统一每行 5 列
    vector<string> map;
    for (string line : rawLines) {
        if ((int)line.size() < MAP_WIDTH) line += string(MAP_WIDTH - line.size(), ' ');
        else if ((int)line.size() > MAP_WIDTH) line = line.substr(0, MAP_WIDTH);
        map.push_back(line);
    }

    // 找到玩家起始位置 O
    int startR = -1, startC = -1;
    for (int r = 0; r < (int)map.size(); ++r) {
        for (int c = 0; c < MAP_WIDTH; ++c) {
            if (map[r][c] == PLAYER) {
                startR = r;
                startC = c;
                map[r][c] = FLOOR; // 替换为普通地面,渲染时再画玩家
                break;
            }
        }
        if (startR != -1) break;
    }
    if (startR == -1) { // 若未标记 O,默认底部中间
        startR = map.size() - 1;
        startC = MAP_WIDTH / 2;
    }
    return {map, {startR, startC}};
}

// --------------------------------------------------------------
// 关卡入口函数(level = 1、2、3。4)
// --------------------------------------------------------------
void playLevel(int level) {
    // 读取自定义地图
    auto [map, startPos] = loadCustomMap(level);
    int playerRow = startPos.first;
    int playerCol = startPos.second;

    // 跳跃状态:是否在空中、已跳的行数
    bool inAir = false;
    int jumpedRows = 0;          // 已经向上移动的行数(最多 4)

    // 视口起始行(从底部向上滚动)
    int viewOffset = max(0, (int)map.size() - VIEW_HEIGHT);

    while (true) {
        render(map, playerRow, playerCol, inAir, viewOffset);

        // ---------- 读取所有待处理的键 ----------
        int moveLeft  = 0;
        int moveRight = 0;
        while (_kbhit()) {                     // 读取本帧内所有按键
            char k = _getch();
            if (k == 'a' || k == 'A') ++moveLeft;
            if (k == 'd' || k == 'D') ++moveRight;
        }

        // ---------- 处理左右移动 ----------
        int netMove = moveRight - moveLeft;      // 正数 → 右,负数 → 左
        if (netMove != 0) {
            int newCol = playerCol + netMove;
            // 越界直接判定为掉入虚空
            if (newCol < 0 || newCol >= MAP_WIDTH) {
                if (!deathPrompt()) return;    // 退出本关卡
                // 重新加载本关卡
                tie(map, startPos) = loadCustomMap(level);
                playerRow = startPos.first;
                playerCol = startPos.second;
                inAir = false;
                jumpedRows = 0;
                viewOffset = max(0, (int)map.size() - VIEW_HEIGHT);
                continue;
            }
            // 地面时需要检测是否撞到障碍
            if (!inAir && isDead(map, playerRow, newCol)) {
                if (!deathPrompt()) return;
                tie(map, startPos) = loadCustomMap(level);
                playerRow = startPos.first;
                playerCol = startPos.second;
                inAir = false;
                jumpedRows = 0;
                viewOffset = max(0, (int)map.size() - VIEW_HEIGHT);
                continue;
            }
            playerCol = newCol;
        }

        // ---------- 跳跃上升 ----------
        if (inAir) {
            // 每帧向上移动 1 行(如果还有空间)
            if (playerRow > 0) {
                --playerRow;
                ++jumpedRows;
                // 同步视口上移
                if (viewOffset > 0) --viewOffset;
            }
            // 判断是否已经完成 4 行的上升
            if (jumpedRows >= 4) {
                // 检查落脚点是否为地面或者跳板
                if (isFloor(map[playerRow][playerCol])) {
                    // 成功着陆 → 结束本帧的其余逻辑,直接进入下一帧
                    inAir = false;
                    jumpedRows = 0;
                    // **关键**:落地后不再执行后面的地面滚动,直接 continue
                    continue;
                } else {
                    // 落脚点不是地面 → 死亡
                    if (!deathPrompt()) return;
                    tie(map, startPos) = loadCustomMap(level);
                    playerRow = startPos.first;
                    playerCol = startPos.second;
                    inAir = false;
                    jumpedRows = 0;
                    viewOffset = max(0, (int)map.size() - VIEW_HEIGHT);
                    continue;
                }
            }
        }

        // ------------------- 跳跃触发 -------------------
        if (!inAir && map[playerRow][playerCol] == JUMP_PAD) {
            // 站在跳板上,准备进入跳跃状态
            inAir = true;
            jumpedRows = 0;
        }

        // 检测钻石、皇冠(仅在地面时)
        if (!inAir && map[playerRow][playerCol] == DIMOND) ++dimond;
        if (!inAir && map[playerRow][playerCol] == CROWN) ++crown;

        // ------------------- 自动滚动(地面) -------------------
        if (!inAir) { // 空中已经自行上升,这里不再额外上移
            if (playerRow > 0) {
                --playerRow;
                if (viewOffset > 0) --viewOffset;   // 同步视口上移
            } else {
                // 通关
                render(map, playerRow, playerCol, inAir, viewOffset);
                cout << "\n恭喜通关第 " << level << " 关!\n";
                Sleep(1000);
                cout << "获得钻石 " << dimond << " 个,皇冠 " << crown << " 个\n";
                system("pause");
                break;
            }
        }

        // 检查滚动后是否落在致命格子(仅在地面时检查)
        if (!inAir && isDead(map, playerRow, playerCol)) {
            if (!deathPrompt()) return;
            tie(map, startPos) = loadCustomMap(level);
            playerRow = startPos.first;
            playerCol = startPos.second;
            inAir = false;
            jumpedRows = 0;
            viewOffset = max(0, (int)map.size() - VIEW_HEIGHT);
        }

        // 速度控制(不同关卡不同节奏)
        if (level == 1) Sleep(250);
        if (level == 2) Sleep(350);
        if (level == 3) Sleep(325);
        if (level == 4) Sleep(365);
        if (level == 5) Sleep(350);
        if (level == 6) Sleep(260);
        if (level == 7) Sleep(400);
        if (level == 8) Sleep(375);
    }
}

// --------------------------------------------------------------
// 子菜单:星级选择
// --------------------------------------------------------------
void ChoseLevel(int level) {
    if (level == 1) {
        cout << "=== 关卡选择 ===\n"
             "0. 返回星级选择\n"
             "1. 新手(Lv.1)\n"
             "2. 入门(Lv.6)\n";
        char c = _getch();
        if (c == '0') return;
        if (c == '1') playLevel(1);
        if (c == '2') playLevel(6);
    } else if (level == 2) {
        cout << "=== 关卡选择 ===\n"
             "0. 返回星级选择\n"
             "1. 跳跃(Lv.2)\n"
             "2. 迷路(Lv.3)\n";
        char c = _getch();
        if (c == '0') return;
        if (c == '1') playLevel(2);
        if (c == '2') playLevel(3);
    } else if (level == 3) {
        cout << "=== 关卡选择 ===\n"
             "0. 返回星级选择\n"
             "1. 拐 (Lv.8)";
        char c = _getch();
        if (c == '0') return;
        if (c == '1') playLevel(8);
    } else if (level == 4) {
        cout << "=== 关卡选择 ===\n"
             "0. 返回星级选择\n"
             "1. 激光(Lv.5)\n";
        char c = _getch();
        if (c == '0') return;
        if (c == '1') playLevel(5);
    } else if (level == 5) {
        cout << "=== 关卡选择 ===\n"
             "0. 返回星级选择\n"
             "1. 横拐(Lv.4)\n"
             "2. 云霄飞车(Lv.9)\n";
        char c = _getch();
        if (c == '0') return;
        if (c == '1') playLevel(4);
        if (c == '2') playLevel(9);
    } else if (level == 6) {
        cout << "=== 关卡选择 ===\n"
                "0. 返回星级选择\n"
                "1. no zuo no die(Lv.7)";
        char c = _getch();
        if (c == '0') return ;
        if (c == '1') playLevel(7);
    }
}

// --------------------------------------------------------------
// 子菜单:关卡选择
// --------------------------------------------------------------
void levelSelect() {
    while (true) {
        dimond = crown = 0;
        system("cls");
        cout << "=== 星级选择 ===\n"
             "0. 返回主菜单\n"
             "1. 1星关卡\n"
             "2. 2星关卡\n"
             "3. 3星关卡\n"
             "4. 4星关卡\n"
             "5. 5星关卡\n"
             "6. 地狱级难度关卡\n"
             "请选择星级编号: ";
        char c = _getch();
        system("cls");
        if (c == '0') break;
        if (c == '1') ChoseLevel(1);
        else if (c == '2') ChoseLevel(2);
        else if (c == '3') ChoseLevel(3);
        else if (c == '4') ChoseLevel(4);
        else if (c == '5') ChoseLevel(5);
        else if (c == '6') ChoseLevel(6);
    }
}

// --------------------------------------------------------------
// 主函数
// --------------------------------------------------------------
int main() {
    SetConsoleOutputCP(CP_UTF8);
    srand((unsigned)time(nullptr));

    /* 四段弹窗提示
    MessageBoxW(NULL, L"欢迎来到滚动的天空!", L"滚动的天空", MB_OK | MB_ICONEXCLAMATION);
    MessageBoxW(NULL, L"a 和 d 键控制左右移动", L"操作说明", MB_OK | MB_ICONEXCLAMATION);
    MessageBoxW(NULL, L"Z 表示普通障碍,B 表示摆锤,空格表示虚空,T 为跳板,A 是激光炮,| 是激光", L"障碍说明", MB_OK | MB_ICONEXCLAMATION);
    MessageBoxW(NULL, L"@代表钻石,#代表皇冠", L"收集物说明", MB_OK | MB_ICONEXCLAMATION);
    MessageBoxW(NULL, L"没有玩过滚动的天空的先玩1星关的“入门”", L"提示", MB_OK | MB_ICONEXCLAMATION);
    MessageBoxW(NULL, L"快点玩吧 🤓", L"准备就绪", MB_OK | MB_ICONEXCLAMATION);

    */ // 主菜单循环
    while (true) {
        system("cls");
        cout << "     滚动的天空\n"
             "1. 关卡选择   0. 退出程序\n"
             "请选择: ";
        char c = _getch();
        if (c == '1') {
            levelSelect();
        } else if (c == '0') {
            break;
        }
    }
    return 0;
}