7891666

<<shijunyu>>  •  11小时前


include

include

include

include

include <conio.h> // 用于按键检测(Windows)

include

include

// 清屏函数(跨平台) void clearScreen() {

ifdef _WIN32

system("cls"); // Windows

else

system("clear"); // Linux/macOS

endif

}

// 游戏常量 const int SCREEN_WIDTH = 40; // 控制台宽度 const int SCREEN_HEIGHT = 10; // 控制台高度 const int BEAR_X = 5; // 熊大固定X坐标 const int OBSTACLE_SPEED = 1; // 障碍物移动速度 const int SPAWN_INTERVAL = 1500; // 障碍物生成间隔(毫秒)

// 熊大结构体 struct Bear {

int y;          // Y坐标
bool isJumping; // 是否跳跃
int jumpStep;   // 跳跃步数

};

// 障碍物结构体 struct Obstacle {

int x; // X坐标
int y; // Y坐标

};

int main() {

// 初始化随机数
srand(time(0));

// 初始化熊大
Bear bear;
bear.y = SCREEN_HEIGHT - 2;
bear.isJumping = false;
bear.jumpStep = 0;

// 障碍物列表
std::vector<Obstacle> obstacles;
auto lastSpawnTime = std::chrono::steady_clock::now();

// 分数
int score = 0;
bool gameOver = false;

// 游戏主循环
while (true) {
	// 按键检测(非阻塞)
	if (_kbhit()) {
		char key = _getch();

		// 空格键跳跃
		if (key == ' ' && !gameOver && !bear.isJumping) {
			bear.isJumping = true;
			bear.jumpStep = 0;
		}
		// 游戏结束时按R重启,按Q退出
		else if (gameOver) {
			if (key == 'q' || key == 'Q') {
				return 0;
			}

			if (key == 'r' || key == 'R') {
				// 重置游戏
				gameOver = false;
				score = 0;
				obstacles.clear();
				bear.y = SCREEN_HEIGHT - 2;
				bear.isJumping = false;
				bear.jumpStep = 0;
				lastSpawnTime = std::chrono::steady_clock::now();
			}
		}
	}

	// 游戏运行逻辑
	if (!gameOver) {
		// 熊大跳跃逻辑(模拟重力)
		if (bear.isJumping) {
			bear.jumpStep++;

			// 上升阶段(前4步)
			if (bear.jumpStep <= 4) {
				bear.y--;
			}
			// 下降阶段(后4步)
			else if (bear.jumpStep <= 8) {
				bear.y++;
			}
			// 落地
			else {
				bear.isJumping = false;
				bear.jumpStep = 0;
				bear.y = SCREEN_HEIGHT - 2;
			}
		}

		// 生成障碍物
		auto now = std::chrono::steady_clock::now();
		auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastSpawnTime).count();

		if (elapsed >= SPAWN_INTERVAL) {
			Obstacle obs;
			obs.x = SCREEN_WIDTH - 1;
			obs.y = SCREEN_HEIGHT - 2;
			obstacles.push_back(obs);
			lastSpawnTime = now;
		}

		// 移动障碍物 + 碰撞检测
		for (auto it = obstacles.begin(); it != obstacles.end();) {

			it->x -= OBSTACLE_SPEED;

			// 碰撞检测(熊大和障碍物位置重叠)
			if (it->x == BEAR_X && it->y == bear.y) {
				gameOver = true;
			}

			// 移除超出屏幕的障碍物,加分
			if (it->x < 0) {
				it = obstacles.erase(it);
				score++;
			} else {
				++it;
			}
		}
	}

	// 绘制游戏画面
	clearScreen();
	// 绘制分数
	std::cout << "分数: " << score << "\n";

	// 绘制游戏区域
	for (int y = 0; y < SCREEN_HEIGHT; y++) {

		for (int x = 0; x < SCREEN_WIDTH; x++) {

			// 绘制熊大
			if (x == BEAR_X && y == bear.y && !gameOver) {
				std::cout << "熊";
			}
			// 绘制障碍物
			else if (!gameOver) {
				bool isObstacle = false;

				for (const auto &obs : obstacles) {
					if (x == obs.x && y == obs.y) {
						std::cout << "■";
						isObstacle = true;
						break;
					}
				}

				if (!isObstacle) {
					std::cout << " ";
				}
			}
			// 游戏结束提示
			else {
				if (y == SCREEN_HEIGHT / 2 && x >= SCREEN_WIDTH / 2 - 8 && x <= SCREEN_WIDTH / 2 + 8) {
					std::cout << "游戏结束!";
				} else if (y == SCREEN_HEIGHT / 2 + 1 && x >= SCREEN_WIDTH / 2 - 10 && x <= SCREEN_WIDTH / 2 + 10) {
					std::cout << "R重启 | Q退出";
				} else {
					std::cout << " ";
				}
			}
		}

		std::cout << "\n";
	}

	// 控制帧率(约20帧/秒)
	std::this_thread::sleep_for(std::chrono::milliseconds(50));
}

return 0;

}


评论:

请先登录,才能进行评论