贪吃蛇(wasd)

#include <iostream>
#include <deque>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <windows.h>

using namespace std;

// 游戏区域大小
const int WIDTH = 20;
const int HEIGHT = 20;

// 方向枚举
enum Direction { STOP = 0, LEFT, RIGHT, UP, DOWN };

// 蛇身节点结构
struct Point {
    int x, y;
    Point(int x = 0, int y = 0) : x(x), y(y) {}
};

class SnakeGame {
private:
    deque<Point> snake;          // 蛇身
    Point food;                  // 食物位置
    Direction dir;               // 当前方向
    bool gameOver;               // 游戏结束标志
    int score;                   // 分数

public:
    SnakeGame() {
        Reset();
    }

    void Reset() {
        snake.clear();
        snake.push_back(Point(WIDTH / 2, HEIGHT / 2));  // 初始蛇身在中心
        PlaceFood();
        dir = STOP;
        gameOver = false;
        score = 0;
    }

    void PlaceFood() {
        srand(time(0));
        do {
            food.x = rand() % (WIDTH-4)+1;
            food.y = HEIGHT/2+1;
        } while (IsOnSnake(food.x, food.y));
    }

    bool IsOnSnake(int x, int y) {
        for (const auto& p : snake) {
            if (p.x == x && p.y == y)
                return true;
        }
        return false;
    }

    void Input() {
        if (_kbhit()) {
            switch (_getch()) {
            case 'a': if (dir != RIGHT) dir = LEFT; break;
            case 'd': if (dir != LEFT) dir = RIGHT; break;
            case 'w': if (dir != DOWN) dir = UP; break;
            case 's': if (dir != UP) dir = DOWN; break;
            case 'x': gameOver = true; break;
            }
        }
    }

    void Logic() {
        if (dir == STOP) return;

        Point head = snake.front();
        Point newHead = head;

        switch (dir) {
        case LEFT:  newHead.x--; break;
        case RIGHT: newHead.x++; break;
        case UP:    newHead.y--; break;
        case DOWN:  newHead.y++; break;
        }

        // 检查边界碰撞
        if (newHead.x < 0 || newHead.x >= WIDTH || newHead.y < 0 || newHead.y >= HEIGHT) {
            gameOver = true;
            return;
        }

        // 检查自身碰撞
        if (IsOnSnake(newHead.x, newHead.y)) {
            gameOver = true;
            return;
        }

        snake.push_front(newHead);

        // 检查是否吃到食物
        if (newHead.x == food.x && newHead.y == food.y) {
            score += 10;
            PlaceFood();
        } else {
            snake.pop_back();
        }
    }

    void Draw() {
        system("cls");  // 清屏

        // 绘制上边界
        for (int i = 0; i < WIDTH + 2; i++)
            cout << "#";
        cout << endl;

        for (int y = 0; y < HEIGHT; y++) {
            for (int x = 0; x < WIDTH; x++) {
                if (x == 0)
                    cout << "墙";  // 左边界
                if (x == food.x && y == food.y)
                    cout << "食";  // 物
                else if (IsOnSnake(x, y))
                    cout << (x == snake.front().x && y == snake.front().y ? "头" : "蛇");  // 蛇头和蛇身
                else
                    cout << "〇";

                if (x == WIDTH - 1)
                    cout << "墙";  // 右边界
            }
            cout << endl;
        }

        // 绘制下边界
        for (int i = 0; i < WIDTH + 2; i++)
            cout << "墙";
        cout << endl;

        cout << "分数: " << score << endl;
    }

    void Run() {
        while (!gameOver) {
            Draw();
            Input();
            Logic();
            Sleep(150);  // 控制游戏速度
        }
        cout << "L! 你死了: " << score << endl;
    }
};

int main() {
    SnakeGame game;
    game.Run();
    return 0;
}

超级马里奥

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <windows.h>
#ifdef _WIN32
#define SET_COLOR(color) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color)
#define RESET_COLOR SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
#else
#define SET_COLOR(color) std::cout << "\033[" << color << "m"
#define RESET_COLOR std::cout << "\033[0m"
#endif
using namespace std;

// 关卡数据结构
struct Level {
	char map[20][40];
	int mario_start_x;
	int mario_start_y;
};

struct GlassState {
	bool broken[20][40]; // 记录每个位置玻璃是否碎裂
};
// 全局变量
GlassState glassStates[10]; // 对应10个关卡

// 定义关卡
Level levels[10] = {
	{  // 关卡1
		{
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                  c                    ",
			"   XXXXXXXXX     XXX                   ",
			"                                       ",
			"                                       ",
			"XXXXXXXXXXX         XXXXXXXXXXXXXXXXXXX"
		},
		5, 15
	},
	{  // 关卡2
		{
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"                       XXXXXXXXXXXXXXXX",
			"                          XXXXXXXXXXXXX",
			"                c           XXXXXXXXXXX",
			"                X            XXXXXXXXXX",
			"              XXXX                     ",
			"             XXXXX                     ",
			"           XXXXXXXXX                   ",
			"         XXXXXXXXXXXX                  ",
			"      XXXXXXXXXXXXXXXX          XXXXXXX",
			"   XXXXXXXXXXXXXXXXXXXXX     XXXXXXXXXX",
			"XXXXXXXXXXXXXXXXXXXXXXXXX    XXXXXXXXXX"
		},
		5, 15
	},
	{  // 关卡3
		{
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                     c                 ",
			"                X    X                 ",
			"                X    X             X   ",
			"                X    X             X   ",
			"                X    X                 ",
			"XXXXXXXXXXXXXXXXXX  XXXXXX     XXXXXX X"
		},
	},
	{  // 关卡4
		{
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                       ",
			"              c                        ",
			"XOOXXXXXXXXOOOOOOXXXXOXXXOXXOXXOXXXOXXO"
		},
		5, 15
	},
	{  // 关卡5
		{
			"                                      X",
			"                                       ",
			"                                       ",
			"                                       ",
			"                                    OXX",
			"                                      X",
			"                           XXXX       X",
			"                                      X",
			"                                      X",
			"                                  XXXXX",
			"                                      X",
			"                                      X",
			"                          XXXXX       X",
			"                                      X",
			"                                  XXXXX",
			"                                 XX   X",
			"              c     O      c          X",
			"            XXXX    O    XXXX         X",
			"                    O                 X",
			"OOOXXXXXXXXOOOOOOXXXOXXXOOOOOOXXXXXXOOX"
		},
		5, 15
	},
	{  // 关卡6
		{
			"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"                                      X",
			"                                      X",
			"                                  cX  X",
			"                                   X  X",
			"           XXXXXXXXXXXXXXXXXXXXXX  X  X",
			"                                X  X  X",
			"                                X  X  X",
			"                                X  X  X",
			"XXXXXXXXXXOXXX                  X  X  X",
			"          O        DDDXXXXXXXXXXX  X  X",
			"          O                     X  X  X",
			"          O                     X  X  X",
			"          OXXX                  X  X  X",
			"                      XXXX      X  X  X",
			"                                X  X  X",
			"              XXXXXXXX          X  X  X",
			"                                X  X  X",
			"                                X  Xc  ",
			"XXXXXXXXXXXOOOOOOOOXXXXXXXXXXXXXXOOXOXX"
		},
		5, 15
	},
	{  // 关卡7
		{
			"XXXXXXX       XXXXXXXXXXXXXXXXXXXXXXXXX",
			"XXXX                                  X",
			"XXXX          XXXXXXXXXXXXXXXXXXXXXXX X",
			"XXXX      XXXXX                       X",
			"XXXX      X     XXXXXXXXXXXXXXXXXXXXXOX",
			"XXXX      X XXXXXXXXXXXXXXXXXXXXXXXXXOX",
			"XXXXXXX   X                          OX",
			"XXXXXXX   XXXXXX XXXXXXXX XXXXXXXX XXOX",
			"XXXXXXX   XXXXXX XXXXXXXX XXXXXXXX XXOX",
			"XXXX      XXXXXX XXXXXXXX XXXXXXXX XXcX",
			"       XXXXXXXXX                   XXOX",
			"       XXXXXXXXX                   XXOX",
			"c   XXXXXXXXXXXXOXXXXXXXXXXXXXOXXXOXXOX",
			"XX  XXXXXXXXXXXXOXXXXXXXXXXXXXO       X",
			"XX  XXXXXXXXXXXXOXXXXXXXXXXXXXOXXDDDXXX",
			"XX  X XXXXXXXXXXcXXXXXXXXXXXXX         ",
			"XX XX XXXXXXXXXXOXXXXXXXXXXXXXc        ",
			"XX XX XXXXXXXXXXOXXXXXXXXXXXXXXXXXXXXXX",
			"XX                                    X",
			"XXJXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
		},
		5, 15
	},
	{  // 关卡8
		{
			"                                      X",
			"                         c            X",
			"XX XXXXXXXXXXXXXXXXXXXX XX            X",
			"    XX                   XOOOOOOOOOOOOX",
			"    XX                   XOOOOOOODOOOOX",
			"  c XX                 X XOOODOOOOODOOX",
			"OOX XX XXXXX   X   X     XOOOOOOOOOOOOX",
			"OOX X  X                 XOOOOOOODODODX",
			"ODX XDXX  XXX XXXXXX     XOOOOOOOOOOOOX",
			"OXX XXXX  X   X          XOOOOOOODODOOX",
			"O    X   XX  XX XXXOOOOOOXOODOOOOODDOOX",
			"O    X       XX XXXOOOOOOXOOOOOOOODOOOX",
			"O    O    XOOXX XXXDODOODXOOOOOOODOOOOX",
			"DXXJ  XXX XOO  cXXXDOOOOOXOOOODOOOOOOOX",
			"X    X    XOO XXXOXOODODOXODOOODOOOODOX",
			"X XXXX XXXDDD XXXOXODOODOXOOOOOOOOOOOOX",
			"X     c          OXOODODOXDOOOODDODOOOX",
			"X XOXXXXXXXXXXOXXOXOOOOOOXOOOOOOOOOOOOX",
			"X c            XXcX                    ",
			"XXDXXXXXXXXXXXXXXDXXXXXXXXXXXXXXXXXXXXX"
		},
		5,15
	},
	{ // 关卡9
		{
			"                                     cX",
			"XXXXDD      XXXOODDDDDDDDDDDDDXXXXXXXXX",
			"                          D   X       X",
			"                              X     X X",
			"    XXOOXJJDDOOXXXXOOXXXX     XDX   X D",
			"                        X  X  X     X D",
			"XXXXXXXXXXXXXXX        DX     X     XOD",
			"              XO    OXO XJ JJJX     X D",
			"              X         X O   X X  XXOD",
			"        O XOX X         X O D X     DOD",
			" XOOXOOX O c  XX X      D  D  D     XOD",
			"       XO  D XX   D     X     X     X D",
			"       X      X     X   D     X   X X D",
			"XOXOOX DODO XXX    D   XX D   X     X D",
			"       X O    X   O    OX     D     XOX",
			" D  c JX O    X  O    XcD     X X   X D",
			"    X  D  OO  X D    OccD     X     XOX",
			"       XO  D  XD    OcccD     X   X XOX",
			"       D DD        XccccD           X  ",
			"XXDXDXDXDXDXXXXXXXOXXXXXXXXXXXXXXXXXXXX"
		},
		5,15
	},
	{  // 关卡10
		{
			"XXXXXXXX               XXXXXXXXXXXXXXXX",
			"XXXXXXXX               X              X",
			"XXXXXX                 X              X",
			"XXXXXX XXDDXXXDDXXXOOX X         GGGX X",
			"                     X X      G     X X",
			"c                    X XG           X X",
			"DOXXXXOXXDXXXXOXXDXD X X            X X",
			"XO   X    XXXXOXXXXX X X   G        X X",
			"XODX X X             X X            X X",
			"XOXX X XDOXXXXXXXXXX X X       X    X X",
			"XOXX X XXOXXXXXXXXXX X X            X X",
			"XOX cX XX            X X            X X",
			"XOX XX XXXXXXXXXXXXXJX X           GX X",
			"XOX X       XXXXXXXXXX X        G   X X",
			"XOX X JXcXXOXXXXXXXXXX X     G      X X",
			"XOX X XXGXXOXXXXXXXXXX    G         X  ",
			"XOX XGXXGXXOXXXXXXXXXX              X  ",
			"XOX XGXXGXXOXXXXXXXXXXOXXXXXXXXXXXXXXXD",
			"X   XGXXGXX                          cX",
			"XXXJXGXXGXXXXXXXXXXXXXXXXXXXXXXXXXXXXDX"
		},
		5, 15
	}
};

/*
{  // 关卡N
{
"                                      X",
"                                       ",
"                                       ",
"                                       ",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"                                      X",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
5, 15
}
{  // 关卡N
{
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
5, 15
}
*/
// 当前关卡索引
int current_level = 0;

// 马里奥位置
int mario_x = 5;
int mario_y = 15;
int lives = 100;                  // 生命数
bool game_over=false;

// 跳跃相关变量
bool is_jumping = false;
int jump_height = 0;
int MAX_JUMP_HEIGHT = 5;

// 重力模拟
void applyGravity() {
	if (!is_jumping && mario_y < 19) {
		char below_char = levels[current_level].map[mario_y + 1][mario_x];
		// 如果是已碎裂的玻璃,视为可下落
		if (below_char == 'G' && glassStates[current_level].broken[mario_y + 1][mario_x]){
			below_char = ' ';
		}
		if (below_char == ' ' || below_char == 'O' || below_char == 'c'){
			mario_y++;
		}
	}
}

// 跳跃处理
void handleJump() {
	if(levels[current_level].map[mario_y+1][mario_x] == 'J'){
		MAX_JUMP_HEIGHT=8;
	}
	if (is_jumping) {
		if (jump_height < MAX_JUMP_HEIGHT) {
			// 检查上方是否有障碍物
			if (mario_y > 0 && (levels[current_level].map[mario_y - 1][mario_x] == ' '||levels[current_level].map[mario_y-1][mario_x] =='c')) {
				mario_y--;
				jump_height++;
			} else {
				// 撞到天花板,立即下落
				is_jumping = false;
			}
		} else {
			is_jumping = false;
		}
	} else if (mario_y < 19) {
		applyGravity();
	}
}
/**
 * 检查死亡条件
 * 判断马里奥是否掉出地图底部
 */
bool checkDeath() {
	// 如果马里奥掉到地图最底部之外,则判定死亡
	return mario_y >= 19||levels[current_level].map[mario_y+1][mario_x] == 'D';
}

/**
 * 处理死亡逻辑
 * 减少生命值,重置位置或结束游戏
 */

// 加载关卡
void loadLevel(int level_index) {
	if (level_index >= 0 && level_index < 10) {
		current_level = level_index;
		mario_x = levels[current_level].mario_start_x;
		mario_y = levels[current_level].mario_start_y;
		is_jumping = false;
		jump_height = 0;
		
		// 初始化玻璃状态
		for (int i = 0; i < 20; i++) {
			for (int j = 0; j < 40; j++) {
				glassStates[current_level].broken[i][j] = false;
			}
		}
	}
}

void handleDeath() {
	system("cls");
	lives--;  // 生命值减1
	cout << "\n啊哦!马里奥失去了一点生命值!剩余生命:" << lives << endl;
	
	if (lives <= 0) {
		// 生命耗尽,游戏结束
		game_over = true;
		cout << "游戏结束!按任意键退出..." << endl;
	} else {
		// 还有生命,重新开始当前关卡
		cout << "按任意键重新开始关卡..." << endl;
		_getch();
		system("cls");
		loadLevel(current_level);  // 重新加载当前关卡
	}
}

// 检查是否完成关卡
bool checkLevelComplete() {
	// 简单的完成条件:到达屏幕右侧
	return mario_x >= 38;
}

char last_frame[20][40]; // 保存上一帧的画面

//玻璃状态
int glassBreakTimer = 0;
const int GLASS_BREAK_DELAY = 8; // 10帧延迟,约1.25秒

void checkGlassCollision() {
	// 每帧增加计时器
	glassBreakTimer++;
	
	// 只有当计时器达到延迟值时才检测碰撞
	if (glassBreakTimer >= GLASS_BREAK_DELAY) {
		glassBreakTimer = 0; // 重置计时器
		
		// 检查脚下是否踩到玻璃
		if (mario_y < 19 && levels[current_level].map[mario_y + 1][mario_x] == 'G') {
			if (!glassStates[current_level].broken[mario_y + 1][mario_x]) {
				glassStates[current_level].broken[mario_y + 1][mario_x] = true;
			}
		}
	}
}

// 修改游戏循环中的绘制部分
void renderMap() {
	// 先清除上一帧的马里奥位置
	if (last_frame[mario_y][mario_x] == 'M') {
		// 如果上一帧这个位置是马里奥,恢复为地图字符
		COORD coord = {mario_x, mario_y};
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		
		// 绘制地图字符(使用正确的颜色)
		char map_char = levels[current_level].map[mario_y][mario_x];
		// 如果是已碎裂的玻璃,显示为空格
		if (map_char == 'G' && glassStates[current_level].broken[mario_y][mario_x]) {
			map_char = ' ';
		}
		
		if(map_char == 'c') SET_COLOR(14);
		else if(map_char == 'X') SET_COLOR(7);
		else if(map_char == 'O') SET_COLOR(11);
		else if(map_char == 'D') SET_COLOR(12);
		else if(map_char == 'J') SET_COLOR(10);
		else if(map_char == 'G') SET_COLOR(15);
		cout << map_char;
		RESET_COLOR;
		
		// 更新缓存为地图字符
		last_frame[mario_y][mario_x] = map_char;
	}
	
	// 绘制当前帧
	for (int i = 0; i < 20; i++) {
		for (int j = 0; j < 40; j++) {
			char map_char = levels[current_level].map[i][j];
			
			// 如果是玻璃且已碎裂,显示为空格
			if (map_char == 'G' && glassStates[current_level].broken[i][j]) {
				map_char = ' ';
			}
			
			char current_char = (i == mario_y && j == mario_x) ? 'M' : map_char;
			
			// 只绘制有变化的位置
			if (last_frame[i][j] != current_char) {
				COORD coord = {j, i};
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
				
				// 绘制当前字符
				if (i == mario_y && j == mario_x) {
					SET_COLOR(6);
					cout << 'M';
				} else {
					// 使用处理后的map_char
					if(map_char == 'c') SET_COLOR(14);
					else if(map_char == 'X') SET_COLOR(7);
					else if(map_char == 'O') SET_COLOR(11);
					else if(map_char == 'D') SET_COLOR(4);
					else if(map_char == 'J') SET_COLOR(10);
					else if(map_char == 'G') SET_COLOR(15);
					cout << map_char;
				}
				RESET_COLOR;
				
				// 更新缓存
				last_frame[i][j] = current_char;
			}
		}
	}
}

// 游戏主循环
void gameLoop() {
	memset(last_frame, ' ', sizeof(last_frame));
	while (true) {
		// 1. 清除屏幕顶部信息区域
		COORD info_coord = {0, 0};
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), info_coord);
		
		// 显示关卡信息
		cout <<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"<<"关卡 " << (current_level + 1) << "/10 剩余生命" << lives << endl;
		cout << "----------------------" << endl;
		
		// 2. 使用双缓冲渲染地图
		renderMap();
		
		if (game_over) {
			_getch();
			return;
		}
		
		// 3. 检查死亡条件
		if (checkDeath()) {
			handleDeath();
			// 死亡后需要重置上一帧缓存
			memset(last_frame, ' ', sizeof(last_frame));
			continue;
		}
		
		// 4. 检查关卡完成
		if (checkLevelComplete()) {
			// 清除信息区域显示完成信息
			info_coord = {0, 0};
			SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), info_coord);
			cout << "恭喜完成关卡 " << (current_level + 1) << "!" << endl;
			if (current_level < 9) {
				system("cls");
				cout << "按任意键进入下一关..." << endl;
				_getch();
				loadLevel(current_level + 1);
				// 重置上一帧缓存
				memset(last_frame, ' ', sizeof(last_frame));
			} else {
				system("cls");
				cout << "恭喜通关所有关卡!按任意键退出..." << endl;
				_getch();
				return;
			}
			continue;
		}
		
		// 5. 处理跳跃和重力
		handleJump();
		
		// 6. 重置属性
		if (levels[current_level].map[mario_y + 1][mario_x] == 'X') {
			MAX_JUMP_HEIGHT = 5;
		}
		if (levels[current_level].map[mario_y][mario_x] == 'c') {
			// 移除金币
			levels[current_level].map[mario_y][mario_x] = ' ';
		}
		// 加玻璃碰撞检测
		checkGlassCollision();
		
		// 7. 处理输入
		if (_kbhit()) {
			char key = _getch();
			switch (key) {
				case 'a': // 左移
				if (mario_x > 0 && (levels[current_level].map[mario_y][mario_x - 1] == ' ' || levels[current_level].map[mario_y][mario_x - 1] == 'c')) {
					mario_x--;
				}
				break;
				case 'd': // 右移
				if (mario_x < 39 && (levels[current_level].map[mario_y][mario_x + 1] == ' ' || levels[current_level].map[mario_y][mario_x + 1] == 'c')) {
					mario_x++;
				}
				break;
				case 'w': // 跳跃
				if (!is_jumping && mario_y < 19) {
					if (levels[current_level].map[mario_y + 1][mario_x] != ' ') {
						is_jumping = true;
						jump_height = 0;
					}
				}
				break;
				case 'r': // 重新开始当前关卡
				loadLevel(current_level);
				memset(last_frame, ' ', sizeof(last_frame));
				break;
				case 'q': // 退出
				return;
			}
		}
		
		Sleep(125); // 适当调整帧率
	}
}

int main() {
	cout << "超级马里奥关卡游戏" << endl;
	cout << "操作说明: W-跳跃, A-左移, D-右移, R-重新开始, Q-退出" << endl;
	cout << "全体方块: X-平台, O-空气墙, D-岩浆, J-跳跃加强, G-玻璃" << endl;
	cout << "全体物品: c-金币" << endl;
	cout << "目标:到达每个关卡的右侧完成关卡" << endl;
	cout << "按任意键开始游戏..." << endl;
	_getch();
	system("cls");
	
// ============= 新增:难度选择环节 =============
	int difficulty = 0;
	while (difficulty < 1 || difficulty > 5) {
		system("cls");
		cout << "========== 请选择游戏难度 ==========" << endl;
		cout << "1. 简单模式 - 无限生命 (999)" << endl;
		cout << "2. 普通模式 - 50 条命" << endl;
		cout << "3. 中等模式 - 30 条命" << endl;
		cout << "4. 困难模式 - 10 条命" << endl;
		cout << "5. 地狱模式 - 1 条命" << endl;
		cout << "===================================" << endl;
		cout << "请输入数字 (1-5): ";
		
		// 获取用户输入,并处理非数字输入
		if (cin >> difficulty) {
			if (difficulty!=1&&difficulty!=2&&difficulty!=3&&difficulty!=4&&difficulty!=5&&difficulty!=0) {
				cout << "输入无效,请输入1到5之间的数字。按任意键继续..." << endl;
				_getch();
				difficulty = 0; // 重置以继续循环
			}
		}
	}
	
// 根据难度设置初始生命值
	switch (difficulty) {
		case 1: // 简单
		lives = 999;
		break;
		case 2: // 普通
		lives = 50;
		break;
		case 3: // 中等
		lives = 30;
		break;
		case 4: // 困难
		lives = 10;
		break;
		case 5: // 地狱
		lives = 1;
		break;
	}
// ============= 难度选择环节结束 =============
	
	system("cls"); // 清除难度选择菜单
	gameLoop(); // 进入主游戏循环
	return 0;
}