我正在用 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/