c - 为什么我的 C 代码不打印任何输出?

标签 c arrays loops conways-game-of-life bitwise-and

我正在用 ANSI C 构建生命游戏的一个版本,我几乎已经为它编写了所有代码。

我的 C 源文件:

#include <stdio.h>
#include <stdlib.h>

#define HEIGHT 32
#define WIDTH 32
#define COMPASS 8
#define SPACE '.'

unsigned long mask = 0x80000000;
unsigned long neighbours[COMPASS] = { 0 };
unsigned long row[WIDTH] = { 0 };
unsigned long copy[WIDTH] = { 0 };

int northWest(unsigned long row, int rowNum) {
    copy[rowNum - 1] = row >>= 1;
    return copy[rowNum - 1];
}

int north(unsigned long row, int rowNum) {
    copy[rowNum - 1] = row;
    return copy[rowNum - 1];
}

int northEast(unsigned long row, int rowNum) {
    copy[rowNum - 1] = row <<= 1;
    return copy[rowNum - 1];
}

int west(unsigned long row, int rowNum) {
    copy[rowNum] = row >>= 1;
    return copy[rowNum];
}

int east(unsigned long row, int rowNum) {
    copy[rowNum] = row <<= 1;
    return copy[rowNum];
}

int southWest(unsigned long row, int rowNum) {
    copy[rowNum + 1] = row >>= 1;
    return copy[rowNum + 1];
}

int south(unsigned long row, int rowNum) {
    copy[rowNum + 1] = row;
    return copy[rowNum + 1];
}

int southEast(unsigned long row, int rowNum) {
    copy[rowNum + 1] = row <<= 1;
    return copy[rowNum + 1];
}

/*void clearRows(unsigned long row[]) {
    int i;
    system("clear");
    for (i = 0; i < HEIGHT; ++i) {
        row[i] = 0;
    }
}*/

void displayBinary(unsigned long x) {
    int bit;
    int mask;
    for (bit = 0; bit < HEIGHT; ++bit) {
        mask = 1 << bit;
        printf("%c", (x & mask) ? 'X' : SPACE);
    }
    printf("\n");
}

int main(void) {
    int i, alive;
    char ch;
    unsigned long init32;
    srand(time(NULL));

    for (i = 0; i < HEIGHT; ++i) {
        init32 = ((double)rand() / RAND_MAX) * 0xFFFFFFFF;
        row[i] = init32;
        displayBinary(row[i]);
    }

    do {
        system("clear");
        for (i = 0; i < HEIGHT; ++i) {
            neighbours[0] = north(row[i], i);
            neighbours[1] = south(row[i], i);
            neighbours[2] = west(row[i], i);
            neighbours[3] = east(row[i], i);
            neighbours[4] = northWest(row[i], i);
            neighbours[5] = northEast(row[i], i);
            neighbours[6] = southEast(row[i], i);
            neighbours[7] = southWest(row[i], i);
        }
        for (i = 0; i < HEIGHT; ++i) {
            alive += ((mask & neighbours[i]) ? 1 : 0);
            displayBinary(row[i]);
        }
    } while ((ch = getchar()) != 'n');

    return EXIT_SUCCESS;
}

我的目标是在 32x32 板上随机打印“X”字符,并在用户不键入“n”时让程序循环。对于每次循环迭代,我希望每个坐标都检查其邻居,如果邻居少于两个或邻居多于三个,则“死亡”。否则,它“存活”并在该坐标处打印一个“X”。

我知道使用按位与运算可能不是完成此操作的最佳方法,但我的教授要求我们使用按位与运算,因此我无法更改该逻辑。

我无法清除循环之间的行。有人可以帮我弄清楚如何为 do 循环的每次迭代打印更新的行吗?

非常感谢任何帮助。谢谢。

最佳答案

为了显示发生了什么,我添加了这个定义,

//#define SPACE (0x20)
#define SPACE ('.')

然后我更改了打印空格的两个实例,

printf("%c", 0x20);

printf("%c", SPACE);

然后运行你的程序并得到一行,带有一些“。”和一些“X”,但第二遍的结果全是“.”,

看起来你对相邻节点的计算可能是错误的。

为什么你的打印出现错误?

因为您的第一个 COMPASS 循环使用了 displayBinary() 8 次,

for (i = 0; i < COMPASS; ++i) {
    init32 = ((double)rand() / RAND_MAX) * 0xFFFFFFFF;
    row[i] = init32;
    displayBinary(row[i]);
}

虽然您的后续外观使用 printf(而不是调用 displayBinary),但 8 次只能打印 8 个字符,

    for (i = 0; i < COMPASS; ++i) {
        alive += ((mask & row[i]) ? 1 : 0);
        if ((alive == 2) || (alive == 3))
            printf("%c", 'X');
        else
            printf("%c", SPACE);
    }

您的 HEIGHT 循环重新计算了 neighbors[],但您应该重置 row[]。

我重写了您的 displayBinary 函数,它显示了整行,

void displayBinary(unsigned long x) {
    //do {
    //    printf("%c", (x & mask) ? 'X' : SPACE);
    //} while ((mask >>= 1) != 0);
    int bit;
    int mask;
    for( bit=0; bit<32; ++bit )
    {
        mask = 1<<bit;
        printf("%c", (x & mask) ? 'X' : SPACE);
    }
    printf("\n");
}

关于c - 为什么我的 C 代码不打印任何输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21567120/

相关文章:

c - 如何编写独立运行两个任务的程序?

javascript - 如何在react-native中获取数组中的元素?

无法使用数字键作为字符串的 PHP 数组

c - 写入文件并使用带循环的 if 语句

c - 寻找预处理器命令以删除代码中的命令

c++ - 在不需要的宏使用上强制出现 C++ 错误

java - 在 Java 中按 y 值对坐标进行排序的最简单方法?

python - 将用户输入限制为 64 位?

python - 根据满足所有行的条件增加几行的值

C++ - 数组数学