专栏文章
RS
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minqt2ze
- 此快照首次捕获于
- 2025/12/02 06:50 3 个月前
- 此快照最后确认于
- 2025/12/02 06:50 3 个月前
CPP
/********************************************************************
* 滚动的天空(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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...