用C++11一个main函数实现简化版2D我的世界:附代码及开发避坑指南
要使用 C++11 不借助第三方库在一个 `main` 函数里创建一个完全与原版一致的 2D 我的世界是几乎不可能的,因为原版我的世界包含极其复杂的功能,如世界生成、玩家交互、光照系统等。不过可以实现一个简化版的 2D 我的世界示例,下面是一个简单的代码,实现了一个小的 2D 世界地图,玩家可以在上面移动: ```cpp #include <iostream> #include <vector> #include <cstdlib> #include <ctime> // 世界地图的宽度和高度 const int WORLD_WIDTH = 20; const int WORLD_HEIGHT = 10; // 玩家位置 int playerX = 0; int playerY = 0; // 定义世界地图,0 表示空气,1 表示方块 std::vector<std::vector<int>> world(WORLD_HEIGHT, std::vector<int>(WORLD_WIDTH, 0)); // 初始化世界地图 void initWorld() { std::srand(std::time(0)); for (int y = 0; y < WORLD_HEIGHT; ++y) { for (int x = 0; x < WORLD_WIDTH; ++x) { if (y > WORLD_HEIGHT / 2) { // 下半部分生成方块 world[y][x] = 1; } else { // 上半部分随机生成一些方块 world[y][x] = std::rand() % 10 == 0 ? 1 : 0; } } } } // 绘制世界地图 void drawWorld() { for (int y = 0; y < WORLD_HEIGHT; ++y) { for (int x = 0; x < WORLD_WIDTH; ++x) { if (x == playerX && y == playerY) { std::cout << 'P'; } else if (world[y][x] == 0) { std::cout << ' '; } else { std::cout << '#'; } } std::cout << std::endl; } } // 移动玩家 void movePlayer(char direction) { int newX = playerX; int newY = playerY; switch (direction) { case 'w': newY--; break; case 's': newY++; break; case 'a': newX--; break; case 'd': newX++; break; default: return; } if (newX >= 0 && newX < WORLD_WIDTH && newY >= 0 && newY < WORLD_HEIGHT && world[newY][newX] == 0) { playerX = newX; playerY = newY; } } int main() { initWorld(); char input; while (true) { system("cls"); // 清屏,在 Linux 系统中使用 system("clear"); drawWorld(); std::cout << "使用 w(上), s(下), a(左), d(右)移动,q 退出: "; std::cin >> input; if (input == 'q') { break; } movePlayer(input); } return 0; } ``` 代码 1. 定义了世界地图的宽度和高度常量 `WORLD_WIDTH` 和 `WORLD_HEIGHT`。 2. `playerX` 和 `playerY` 表示玩家的位置。 3. `world` 是一个二维向量,用于存储世界地图的信息。 4. `initWorld` 函数用于初始化世界地图,下半部分生成方块,上半部分随机生成一些方块。 5. `drawWorld` 函数用于绘制世界地图,玩家位置用 `P` 表示,方块用 `#` 表示,空气用空格表示。 6. `movePlayer` 函数根据用户输入的方向移动玩家,但要确保玩家不会移动到方块上或越界。 7. 在 `main` 函数中,初始化世界地图,进入一个无限循环,不断清屏、绘制地图、获取用户输入并移动玩家,直到用户输入 `q` 退出。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 边界检查:在移动玩家时,要确保玩家不会越界,否则可能会导致程序崩溃。 2. 清屏命令:不同的操作系统使用不同的清屏命令,在 Windows 系统中使用 `system("cls")`,在 Linux 系统中使用 `system("clear")`。 3. 随机数生成:随机数生成依赖于系统时间,可能会导致每次运行程序时生成的世界地图相似,需要根据具体需求调整随机数生成的方式。 ######[AI写代码神器 | 1124点数解答 | 2025-09-04 22:12:53]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)352
- C 语言实现链表操作:创建、输出、删除及插入功能详解(字节豆包 | 534点数解答 | 2024-12-09 21:33:48)347
- C语言实现链表创建、输出、删除与插入操作的完整代码及注意要点(字节豆包 | 609点数解答 | 2024-12-18 12:18:21)368
- 从错误信息“ValueError”入手:修改代码以正确解析含多参数输入格式(DeepSeek | 182点数解答 | 2026-01-06 12:34:41)60
- 洛谷乒乓球题解:11 分制与 21 分制比赛结果计算全攻略(DeepSeek | 675点数解答 | 2025-04-28 18:19:45)308
- 瑞士轮赛制模拟与边界防御:从 IndexError 到 AC 的完整修复指南(阿里通义 | 2326点数解答 | 2026-03-20 12:17:10)12
- 代码修正:解决文件找不到与内存问题,正确处理测试用例(DeepSeek | 443点数解答 | 2026-01-06 17:52:45)46
- 过河卒AC终极修复版:健壮读入+马控点标记+DP路径计数(阿里通义 | 1940点数解答 | 2026-03-12 17:58:14)20
- Free Pascal瑞士轮AC代码:适配fpc 3.0.4的qsort与循环变量修复方案(阿里通义 | 1396点数解答 | 2026-03-20 12:31:01)20
- P2185判断质数问题的C++代码实现(字节豆包 | 396点数解答 | 2026-03-22 16:54:08)20
- C++ 利用栈求解唯一路径迷宫:从起点 (1,1) 到终点 (m - 2,n - 2)(阿里通义 | 732点数解答 | 2024-11-03 02:34:53)527
- C++ 实现:从大整数中删数求最小密码的巧妙算法(DeepSeek | 473点数解答 | 2025-06-20 16:08:21)203