我正在进行一项任务,我必须随机将坐标放在具有随机坐标的场地上,但这些坐标必须是唯一的,否则必须重新生成。我正在尝试将整数随机化并将它们分配给struct成员。然而,根据我的教授,我现在正在做的事似乎不能正常工作。这是结构:
struct player {
int x;
int y;
int direction;
int id;
int presence;
};
这是我的两个数组,一个用于该字段,另一个用于该字段的团队规模:
int field [25][25];
struct player team [25];
这是我可能犯错的函数的一部分:
int main (){
int i;
int j;
int randx, randy;
int SIZE_TEAM = 25;
srand (time(NULL));
for (i = 0; i < SIZE_TEAM; i++){
randx = (rand () % 25); <-- Randomizing row position
randy = (rand () % 25); <-- Randomizing column position
while (field[randx][randy] != 0){ <-- While loop occurs if position in field is taken.
randx = (rand () % 25); <-- In this case, the coordinates are regenerated.
randy = (rand () % 25);
}
team [i].x = randx; <--Where the mistake might lie
team [i].y = randy; <--Where the mistake might lie
team [i].id = i + 1;
team [i].presence = 1;
field [team [i].x][team [i].y] = team [i].id; <--Where the mistake might lie
}
一旦我将这些值分配给相关玩家,我不确定如何“锁定”随机生成的值。你认为我给玩家分配位置的算法是不正确的吗?
此外,这是我发布的另一个问题的简略版本,但这个问题太长了,没有人打扰到帮助我。
答案 0 :(得分:1)
嗯---我不确定这是否是问题的真正原因---但我注意到一个问题:
没有地方可以初始化场地上的地方值。所有变量都需要在第一次使用它们的值之前进行初始化。你有一个名为“field”的二维数组,你只是假设的每个元素都是零开始---但你不知道,因为你从未将这些元素设置为零。你需要一个代码,你可以在开始将玩家放在场上之前将这个二维数组的所有元素设置为它们的初始值。
我可以补充(作为旁白)关于这个陈述:
int SIZE_TEAM = 25;
而不是在主函数中使它成为一个整数,它应该被全局声明为宏 - 就像这样......
int field [25][25];
#define SIZE_TEAM 25
struct player team [SIZE_TEAM];
这样,如果你必须改变团队的规模,你只需要在一个地方而不是两个地方改变它。
答案 1 :(得分:0)
以@WhozCraig建议的方式解决它实际上并不复杂:
static void random_permutation(int *x, int n)
{
int i, r;
/* mark all elements as "unset" */
for (i = 0; i < n; i++) {
x[i] = -1;
}
for (i = 0; i < n; i++)
{
/* start from a random value and find the first unset element */
for (r = rand() % n; x[r] >= 0; r = (r + 1) % n)
;
x[r] = i;
}
}
#define SIZE_TEAM 25
int main (void)
{
int randx[SIZE_TEAM], randy[SIZE_TEAM];
srand (time(NULL));
random_permutation(randx, SIZE_TEAM);
random_permutation(randy, SIZE_TEAM);
for (i = 0; i < SIZE_TEAM; i++) {
int x = randx[i], y = randy[i];
team[i].x = x;
team[i].y = y;
team[i].presence = 1;
team[i].id = i + 1;
field[x][y] = team[i].id;
}
}