我已经定义了这两个结构:
#define MAP_SIZE 5
typedef struct battle_cell {
int status_a;
int status_b;
int ship_a;
int ship_b;
} battle_cell;
struct battlemap {
battle_cell cell[MAP_SIZE][MAP_SIZE];
int progress_a;
int progress_b;
};
用地图初始化地图和所有其他变量后用零:
for (i = 0; i < MAP_SIZE; i++) {
for (j = 0; j < MAP_SIZE; j++) {
map->cell[i][j].status_a = 0;
map->cell[i][j].status_b = 0;
map->cell[i][j].ship_a = 0;
map->cell[i][j].ship_b = 0;
}
}
map->progress_a = 0;
map->progress_b = 0;
有一点我必须检查每个单元格中的ship_a和ship_b值,就像那样(逻辑比这次迭代复杂一点):
for (i = posXB; i < posXB + SHIP_SIZE; i++) {
map->cell[posYB][i].ship_b = 1;
}
我需要为ship_a变量做同样的事情。因此,我必须复制相当大的代码块,因为我无法找到一种方法来动态获取结构中的字段。例如,我可以定义一个函数:
void cell_iteration (battlemap *map, int pos, int pos_y, int ship_size, /* field_parameter/pointer */) {
int i;
for (i = pos; i < pos + ship_size; i++) {
map->cell[pos_y][i].ship_b = 1; // use the field_parameter/pointer instead of ship_b
}
}
有没有一种优雅的方式来做这样的事情?
更新
只是澄清一下。结构肯定可以简化,但这不是我的问题。我刚试图创建一个例子:)
答案 0 :(得分:3)
如果第一个结构中有ship_a
和ship_b
,则可以将int ship[2]
数组声明为int
。