C++实现 2D 版我的世界:代码示例、注释详解与开发注意事项
以下是一个简单的 C++ 2D 版我的世界风格的示例代码,这个代码创建了一个简单的 2D 世界,玩家可以在其中移动并破坏/放置方块。 ```cpp #include <iostream> #include <vector> // 定义方块类型 enum BlockType { AIR, GRASS, STONE }; // 定义世界类 class World { private: std::vector<std::vector<BlockType>> blocks; int width; int height; public: World(int w, int h) : width(w), height(h) { // 初始化世界,底部放置草方块,其余为空气 blocks.resize(height, std::vector<BlockType>(width, AIR)); for (int x = 0; x < width; ++x) { blocks[height - 1][x] = GRASS; } } // 获取指定位置的方块类型 BlockType getBlock(int x, int y) const { if (x >= 0 && x < width && y >= 0 && y < height) { return blocks[y][x]; } return AIR; } // 设置指定位置的方块类型 void setBlock(int x, int y, BlockType type) { if (x >= 0 && x < width && y >= 0 && y < height) { blocks[y][x] = type; } } // 打印世界 void print() const { for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { switch (blocks[y][x]) { case AIR: std::cout << ' '; break; case GRASS: std::cout << 'G'; break; case STONE: std::cout << 'S'; break; } } std::cout << std::endl; } } }; // 定义玩家类 class Player { private: int x; int y; World& world; public: Player(int startX, int startY, World& w) : x(startX), y(startY), world(w) {} // 移动玩家 void move(int dx, int dy) { int newX = x + dx; int newY = y + dy; if (world.getBlock(newX, newY) == AIR) { x = newX; y = newY; } } // 破坏方块 void breakBlock() { world.setBlock(x, y, AIR); } // 放置方块 void placeBlock(BlockType type) { world.setBlock(x, y, type); } // 获取玩家位置 int getX() const { return x; } int getY() const { return y; } }; int main() { // 创建一个 20x10 的世界 World world(20, 10); // 创建玩家,初始位置为 (5, 0) Player player(5, 0, world); while (true) { // 打印世界 world.print(); std::cout << "Player position: (" << player.getX() << ", " << player.getY() << ")" << std::endl; // 获取用户输入 std::cout << "Enter command (w: up, s: down, a: left, d: right, b: break, p: place): "; char command; std::cin >> command; switch (command) { case 'w': player.move(0, -1); break; case 's': player.move(0, 1); break; case 'a': player.move(-1, 0); break; case 'd': player.move(1, 0); break; case 'b': player.breakBlock(); break; case 'p': player.placeBlock(STONE); break; case 'q': return 0; } } return 0; } ``` 代码注释解释: 1. `BlockType` 枚举定义了不同的方块类型,如空气、草和石头。 2. `World` 类表示游戏世界,包含一个二维向量 `blocks` 来存储每个方块的类型。`getBlock` 和 `setBlock` 方法用于获取和设置指定位置的方块类型,`print` 方法用于打印当前世界的状态。 3. `Player` 类表示玩家,包含玩家的位置和对世界的引用。`move` 方法用于移动玩家,`breakBlock` 方法用于破坏方块,`placeBlock` 方法用于放置方块。 4. `main` 函数创建了一个世界和玩家,并进入一个循环,不断打印世界状态,获取用户输入并执行相应的操作。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 边界检查:在访问世界的方块时,要确保坐标在合法范围内,避免越界访问导致程序崩溃。 2. 输入验证:用户输入可能包含无效字符,需要进行适当的验证,以避免程序出现异常行为。 3. 内存管理:如果代码规模扩大,要注意内存的使用,避免内存泄漏和过度分配。 ######[AI写代码神器 | 1292点数解答 | 2025-08-27 20:34:08]
- Java实现链表反转:迭代与递归双解法详解及开发实战指南(DeepSeek | 1409点数解答 | 2026-03-15 15:09:29)41
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)355
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)241
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)278
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)276
- 银行服务同步:用信号量实现顾客与营业员的高效交互(阿里通义 | 539点数解答 | 2024-12-13 14:41:41)366
- 银行服务系统:用信号量实现顾客与营业员操作的互斥和同步(阿里通义 | 731点数解答 | 2024-12-13 14:42:20)213
- 开发扩展包:代码示例与需小心处理的关键要点 (DeepSeek | 152点数解答 | 2025-09-03 08:45:22)133
- Three.js 示例代码解析:优化场景渲染与注意要点(字节豆包 | 164点数解答 | 2025-02-27 23:30:20)272
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)327
- Java:设计圆类与圆柱体类并计算属性及体积表面积(字节豆包 | 470点数解答 | 2024-10-20 10:03:11)188
- Java 实现矩形与长方体类,精准计算底面积与体积(字节豆包 | 319点数解答 | 2024-10-20 10:25:46)293