次のコードのチャンクで何が起こっているのか、誰かが私に説明できるかどうか疑問に思っていました。このコードは、7 つの部屋の間にランダムな接続を作成するために使用され、各部屋に最低 3 つの接続があることを保証します。
void bitcodeToEdge(int bitcode, int *edge)
{
int i = 0;
int j = 0;
while (i < 2 && bitcode > 0) {
if (bitcode % 2 == 1) {
edge[i] = j;
i++;
}
bitcode >>= 1;
j++;
}
for (; i < 2; ++i) edge[i] = -1;
}
void edgeToBitcode(int *edge, int *bitcode)
{
*bitcode = power(2, edge[0]) + power(2, edge[1]);
}
void connectRooms(int *rooms, char *dir, char **filenames, char **roomNames)
{
int i, j;
FILE *file;
char filename[100];
int bitcode;
int edge[2];
int *edges;
int edgeIdx;
int maxEdges;
int minEdges;
int randEdges;
int valencies[10];
maxEdges = 21;
edgeIdx = 0;
edges = malloc(sizeof(int) * maxEdges);
assert(edges != NULL);
for (i = 0; i < 10; ++i) {
for (j = i + 1; j < 10; ++j) {
edge[0] = rooms[i];
edge[1] = rooms[j];
edgeToBitcode(edge, &bitcode);
edges[edgeIdx] = bitcode;
edgeIdx++;
}
}
permute(edges, maxEdges);
for (i = 0; i < 10; ++i) valencies[i] = INT_MAX;
for (i = 0; i < 7; ++i) valencies[rooms[i]] = 0;
edgeIdx = 0;
minEdges = 10;
randEdges = getRandInt(minEdges, maxEdges);
while (edgeIdx < randEdges || getIntArrayMin(valencies, 7) < 3)
{
bitcodeToEdge(edges[edgeIdx], edge);
valencies[edge[0]] += 1;
valencies[edge[1]] += 1;
for (i = 0; i < 2; ++i) {
strcpy(filename, dir);
strcat(filename, filenames[edge[i]]);
if ((file = fopen(filename, "a")) == NULL) {
fprintf(stderr, "could not open %s for writing\n", filename);
exit(2);
}
fprintf(file, "\nCONNECTION %d: %s",
valencies[edge[i]],
roomNames[edge[1 - i]]);
fclose(file);
}
edgeIdx++;
}
free(edges);
}
Power は pow と同じように機能します - x^y
GetIntArrayMin
は配列内の最小整数値を取得します
。 Permute は、指定された整数配列の疑似乱数順列を作成します。
ビットコードがまったくわかりません。誰かが最初にそれを説明できれば、残りの部分を理解できるかもしれません. ありがとうございました!