帮我写个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,在其他操作系统上可能需要调整颜色和输入处理部分。 [2025-10-03 15:06:13 | AI写代码神器 | 1355点数解答]
- 年会表演串词,年会节目清单 1、陈德光:诗朗诵《旗帜》5分钟 2、财务、后勤部:舞蹈《谁是我的新郎》4分钟 3、销售部:演唱《苹果香》5分钟 4、游戏:诸葛帽吃糖 5个人 一轮 10分钟 5、标书、采购部:《三句半》3分钟 6、技术部:舞蹈《wave》4分钟 7、销售部:《魔术》15分钟 8、彩虹圈转光盘 (只限于男生)4个人 一轮 10分钟 9、技术部:脱口秀 20分钟 10、销售部:《吃香蕉》3分钟 11、财务、后勤部:合唱《感恩的心》4分钟 12、游戏:喊话吹蜡烛(指定人)2个人 一轮 5分钟 13、标书、采购部:朗诵《我爱上班》 3分钟 11、销售部:邓腾龙《青花瓷》4分钟 14、相声新闻晚知道10分钟 15、游戏:摸麻将4个人 一轮 5分钟 16、大合唱:相亲相爱一家人5分钟,字数:200字(206点数解答 | 2025-01-08 10:59:43)232
- 游戏(77点数解答 | 2025-05-04 01:10:38)120
- 帮我做个有窗口,类似马里奥 游戏 有滚轴,重力,惯性,怪物(964点数解答 | 2025-06-13 19:11:12)109
- 游戏(268点数解答 | 2025-07-10 17:57:48)101
- c++ using namespace std;要有 不要注释 求a/b的结果。 已知a,b为10^8范围内的非负整数,求a/b保留前n位小数商的结果。(127点数解答 | 2025-09-26 19:15:23)15
- 若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, STEP1: 87+78= 165 STEP2: 165+561= 726 STEP3: 726+627=1353 STEP4:1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。 写一个程序,给定一个N(2<N<=10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。 c++ using namespace std;要有 不要注释(491点数解答 | 2025-09-26 19:16:14)15
- 请求出1!+2!+3!+4!+…+n!,请注意,n<=50。 n!=nx(n-1)x(n-2)x…x1,如:5!=5x4x3x2x1=120。 c++ using namespace std;要有 不要注释(99点数解答 | 2025-09-26 19:32:04)16
- 请求出1!+2!+3!+4!+…+n!,请注意,n<=50。 n!=nx(n-1)x(n-2)x…x1,如:5!=5x4x3x2x1=120。 c++ using namespace std;要有 不要注释 使用高精度算法(439点数解答 | 2025-09-26 19:33:39)16
- 求2+2 * 2+2 * 2 * 2+…+2 * 2 * 2 *…. * 2的和是多少?最后一项有多少 2 相乘由键盘读入的 n 决定(1<=n<=100)! 比如:n=3,那么s=2+2 * 2 + 2 * 2 * 2 = 14!c++ using namespace std;要有 不要注释 使用高精度算法(441点数解答 | 2025-09-26 19:35:18)16
- 求2的n次方!(0<=n<=100)c++ using namespace std;要有 不要注释 使用高精度算法(253点数解答 | 2025-09-26 19:41:27)21
- 题目3(继承)(1) 定义一个名为 vehicles 交通工具的基类,该类中应包含 string 类型的成员属性 brand 商标 和 color 颜色,还应包含成员方法 run 行驶, 在控制台显示“我已经开动了”。(2) showinfo 显示信息,在控制台显示商标和颜色, 并编写构造方法初始化其成员属性。(3) 编写 car 小汽车 , 类继承于 vehicles类 , 增加 int型成员属性 seats 座位,还应增加成员方法showcar ,在控制台显示小汽车的信息 并编写构造方法。(4) 在 main 方法中测试以上各类。(391点数解答 | 2024-09-18 16:16:39)182
- 题目3(继承)java(1) 定义一个名为 vehicles 交通工具的基类,该类中应包含 string 类型的成员属性 brand 商标 和 color 颜色,还应包含成员方法 run 行驶, 在控制台显示“我已经开动了”。(2) showinfo 显示信息,在控制台显示商标和颜色, 并编写构造方法初始化其成员属性。(3) 编写 car 小汽车 , 类继承于 vehicles类 , 增加 int型成员属性 seats 座位,还应增加成员方法showcar ,在控制台显示小汽车的信息 并编写构造方法。(4) 在 main 方法中测试以上各类。(289点数解答 | 2024-09-18 16:16:54)164