You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:45:23