专栏文章

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 条评论,欢迎与作者交流。

正在加载评论...