C++实现带颜色的控制台枪战游戏:代码详解与注意事项
以下是一个简单的C++控制台枪战游戏代码,使用Windows API实现颜色显示。游戏包含玩家移动、射击和敌人随机生成功能。 ```cpp #include <iostream> #include <conio.h> #include <windows.h> #include <vector> #include <cstdlib> #include <ctime> using namespace std; // 设置控制台颜色函数 void SetColor(int color) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); } // 游戏常量 const int WIDTH = 20; const int HEIGHT = 10; const char PLAYER = 'P'; const char ENEMY = 'E'; const char BULLET = '*'; const char EMPTY = ' '; // 玩家结构 struct Player { int x, y; Player(int startX, int startY) : x(startX), y(startY) {} }; // 子弹结构 struct Bullet { int x, y; bool active; Bullet(int startX, int startY) : x(startX), y(startY), active(true) {} }; // 敌人结构 struct Enemy { int x, y; bool active; Enemy(int startX, int startY) : x(startX), y(startY), active(true) {} }; vector<Bullet> bullets; vector<Enemy> enemies; Player player(WIDTH / 2, HEIGHT - 1); // 初始化游戏 void InitGame() { srand(time(0)); player.x = WIDTH / 2; player.y = HEIGHT - 1; bullets.clear(); enemies.clear(); } // 绘制游戏界面 void Draw() { system("cls"); // 清屏 for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { if (x == player.x && y == player.y) { SetColor(10); // 绿色玩家 cout << PLAYER; } else { bool drawn = false; // 绘制子弹 for (const auto& bullet : bullets) { if (bullet.active && bullet.x == x && bullet.y == y) { SetColor(14); // 黄色子弹 cout << BULLET; drawn = true; break; } } if (drawn) continue; // 绘制敌人 for (const auto& enemy : enemies) { if (enemy.active && enemy.x == x && enemy.y == y) { SetColor(12); // 红色敌人 cout << ENEMY; drawn = true; break; } } if (!drawn) { SetColor(7); // 默认灰色 cout << EMPTY; } } } cout << endl; } SetColor(7); // 恢复默认颜色 cout << "移动: A(左) D(右) 射击: Space 退出: Q" << endl; } // 更新游戏状态 void Update() { // 移动子弹 for (auto& bullet : bullets) { if (bullet.active) { bullet.y--; if (bullet.y < 0) bullet.active = false; } } // 移除无效子弹 bullets.erase(remove_if(bullets.begin(), bullets.end(), [](const Bullet& b) { return !b.active; }), bullets.end()); // 生成敌人 if (rand() % 10 == 0) { enemies.push_back(Enemy(rand() % WIDTH, 0)); } // 移动敌人 for (auto& enemy : enemies) { if (enemy.active) { enemy.y++; if (enemy.y >= HEIGHT) enemy.active = false; } } // 移除无效敌人 enemies.erase(remove_if(enemies.begin(), enemies.end(), [](const Enemy& e) { return !e.active; }), enemies.end()); // 检测子弹与敌人碰撞 for (auto& bullet : bullets) { for (auto& enemy : enemies) { if (bullet.active && enemy.active && bullet.x == enemy.x && bullet.y == enemy.y) { bullet.active = false; enemy.active = false; break; } } } // 检测玩家与敌人碰撞 for (const auto& enemy : enemies) { if (enemy.active && enemy.x == player.x && enemy.y == player.y) { cout << "游戏结束!被敌人击中。" << endl; exit(0); } } } // 处理输入 void ProcessInput() { if (_kbhit()) { char key = _getch(); switch (key) { case 'a': // 左移 if (player.x > 0) player.x--; break; case 'd': // 右移 if (player.x < WIDTH - 1) player.x++; break; case ' ': // 射击 bullets.push_back(Bullet(player.x, player.y - 1)); break; case 'q': // 退出 exit(0); break; } } } // 主游戏循环 int main() { InitGame(); while (true) { Draw(); ProcessInput(); Update(); Sleep(100); // 控制游戏速度 } return 0; } ``` 这个代码实现了一个基础的控制台枪战游戏: - 玩家使用'A'和'D'键左右移动,空格键射击。 - 敌人从顶部随机生成并向下移动。 - 子弹向上飞行,击中敌人后双方消失。 - 玩家与敌人碰撞会导致游戏结束。 - 使用Windows API设置颜色,玩家为绿色,敌人为红色,子弹为黄色。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: - 内存管理:使用vector动态管理子弹和敌人对象,避免内存泄漏。 - 碰撞检测逻辑:确保子弹和敌人碰撞后正确标记为无效,防止重复检测。 - 跨平台兼容性:此代码依赖Windows API,在其他操作系统上可能需要调整颜色和输入处理部分。 ######[AI写代码神器 | 1355点数解答 | 2025-10-03 15:06:13]
- 超燃年会来袭!诗舞歌戏轮番上阵,共赴欢乐盛宴! (字节豆包 | 206点数解答 | 2025-01-08 10:59:43)351
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)352
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)236
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)323
- 用 JS 中 for 循环实现 1 到 100 相加并输出结果到页面的完整代码 ( | 240点数解答 | 2024-05-20 22:11:29)477
- 用 JS 的 while 循环实现 1 到 100 相加并输出到页面的代码揭秘( | 47点数解答 | 2024-05-20 22:16:48)362
- Java:设计圆类与圆柱体类并计算属性及体积表面积(字节豆包 | 470点数解答 | 2024-10-20 10:03:11)184
- Java 实现矩形与长方体类,精准计算底面积与体积(字节豆包 | 319点数解答 | 2024-10-20 10:25:46)292
- Java 实现矩形与长方体类,轻松计算底面积和体积(字节豆包 | 308点数解答 | 2024-10-20 10:34:27)273
- Java 实现矩形与长方体类:计算底面积与体积的完整代码示例(字节豆包 | 306点数解答 | 2024-10-20 18:34:47)277
- 云南 8 日摄影行程表 HTML 代码优化与逻辑注意点揭秘(字节豆包 | 217点数解答 | 2025-03-09 13:19:03)269
- C++ 实战:交通工具基类与小汽车类的继承实现及测试(字节豆包 | 391点数解答 | 2024-09-18 16:16:39)267