如何在C++的for循环中创建可修改的僵尸坐标数组
解决方案
1. 用结构体封装僵尸数据(推荐)
用结构体统一存储每个僵尸的坐标,比二维数组更直观,后续扩展属性(如血量、移动速度)也更方便:
typedef struct { int x; int y; // 可按需添加其他属性,比如 int health; } Zombie;
2. 循环外初始化动态数组
在SDL主循环之外完成数组的内存分配和初始坐标生成,避免每次循环重复创建导致状态丢失:
// 循环外定义(可放在主函数开头或全局域) Zombie* zombies = NULL; int zombieCount = 0; int maxZombies = z; // z是你要生成的僵尸总数 // 初始化数组(进入SDL循环前执行一次) zombies = (Zombie*)malloc(maxZombies * sizeof(Zombie)); if (zombies == NULL) { // 处理内存分配失败逻辑 return 1; } // 生成初始随机坐标(同样在循环外执行一次) srand(time(NULL)); // 初始化随机数种子,放在程序开头即可 for (int i = 0; i < maxZombies; i++) { zombies[i].x = rand() % SCREEN_WIDTH; // 替换为你的实际屏幕宽度 zombies[i].y = rand() % SCREEN_HEIGHT; // 替换为你的实际屏幕高度 } zombieCount = maxZombies;
3. SDL循环内的绘制与操作
在无限循环中仅负责绘制僵尸、修改坐标或执行删除操作,无需重复生成初始数据:
// SDL事件循环 SDL_Event event; while (SDL_PollEvent(&event)) { // 处理窗口关闭等事件 if (event.type == SDL_QUIT) { // 退出逻辑 } } // 绘制所有僵尸 for (int i = 0; i < zombieCount; i++) { SDL_Rect zombieRect = {zombies[i].x, zombies[i].y, 20, 20}; // 假设僵尸尺寸为20x20 SDL_RenderFillRect(renderer, &zombieRect); // 替换为你的渲染器对象 } // 修改僵尸坐标示例(比如让第一个僵尸向右移动) // zombies[0].x += 1; // 删除僵尸示例(删除第i个僵尸) if (i >= 0 && i < zombieCount) { // 将最后一个僵尸移到被删除位置,减少计数 zombies[i] = zombies[zombieCount - 1]; zombieCount--; // 可选:缩小内存占用 zombies = (Zombie*)realloc(zombies, zombieCount * sizeof(Zombie)); }
4. 二维数组实现方案(不推荐)
如果一定要用int**二维数组,需正确完成内存分配:
// 循环外定义 int** zArray = NULL; int zombieCount = z; // 初始化二维数组 zArray = (int**)malloc(zombieCount * sizeof(int*)); for (int i = 0; i < zombieCount; i++) { zArray[i] = (int*)malloc(2 * sizeof(int)); // 每个元素存储x、y zArray[i][0] = rand() % SCREEN_WIDTH; zArray[i][1] = rand() % SCREEN_HEIGHT; } // 循环内绘制 for (int i = 0; i < zombieCount; i++) { int x = zArray[i][0]; int y = zArray[i][1]; // 执行绘制逻辑 } // 修改坐标示例 // zArray[0][0] += 5; // 删除僵尸示例(需手动调整数组结构,较繁琐) free(zArray[i]); // 后续需将i之后的元素前移,重新维护数组长度
关键注意事项
- 程序结束时务必释放动态分配的内存,避免泄漏:
// 结构体数组释放 free(zombies); // 二维数组释放 for (int i = 0; i < zombieCount; i++) { free(zArray[i]); } free(zArray); - 不要在SDL无限循环内重复生成僵尸坐标,否则会覆盖之前的状态,无法保留修改后的位置。
内容的提问来源于stack exchange,提问作者Tinn_p
相关产品推荐
相关产品推荐

