<<shijunyu>> • 11小时前
// 清屏函数(跨平台) void clearScreen() {
system("cls"); // Windows
system("clear"); // Linux/macOS
}
// 游戏常量 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;
}
评论:
请先登录,才能进行评论