gpt4 book ai didi

c - 用 C 编程生命游戏 - 按位运算问题

转载 作者:行者123 更新时间:2023-12-02 08:35:50 25 4
gpt4 key购买 nike

我正在尝试用 C 编写 Conway 的生命游戏,但我对如何存储 ALIVE 或 DEAD 细胞感到困惑。

棋盘存储在一个由 32 个无符号长整数(32x32 棋盘)组成的数组中,每个位代表一个细胞(1 = 存活,0 = 死亡)。我无法更改此设计。

到目前为止,我有确定特定单元格有多少个邻居的代码,但我需要根据游戏规则更改其状态(1 可能需要变为 0 或 1,0 可能需要为 1或 0).

我假设我可以为此使用按位运算 (|, &, ^) 但我不知道如何在一行中隔离特定位并将其存储,因为我遍历该行的其余部分然后存储新的,将行重新计算为一个无符号长整型。

即如果 10011...0 需要是 01101...1。我该怎么做?

我意识到代码将需要额外的 for 循环,但我只是想在继续之前解决这个特定问题。

感谢任何帮助。

#include <stdio.h>
#include <stdlib.h>
unsigned long columnMask;
int compass = 0;
int totAliveNeighbors = 0;
int iterator = 0;
int iterator2 = 0;

#define ARRAY_SIZE 32
#define NEIGHBORS 8

unsigned long grid[ARRAY_SIZE];
unsigned long copyGrid[ARRAY_SIZE];
unsigned long neighbors[NEIGHBORS];
unsigned long init32;
unsigned long holder = 0;

int main(void){
srand(time(NULL));
printf("\n");

/** Seeds the grid with random numbers **/
for(iterator = 0; iterator < 32; iterator++){
init32 = ((double)rand()/RAND_MAX)*0xFFFFFFFF;
grid[iterator] = init32;
}

/** Displays the binary representation of the grid elements **/
for(iterator = 0; iterator < 32; iterator++){
displayBinary(grid[iterator]);
printf("\n");
}
printf("\n");

/** Calculate and sum neighbors for 'x' cell **/
/** Will need to iterate through each column by shifting the mask **/
/** Will need to iterate through each row **/
iterator= 0; //example use
neighbors[0] = north(iterator);
neighbors[1] = south(iterator);
neighbors[2] = east(iterator);
neighbors[3] = west(iterator);
neighbors[4] = northWest(iterator);
neighbors[5] = northEast(iterator);
neighbors[6] = southWest(iterator);
neighbors[7] = SouthEast(iterator);

columnMask = 0x80000000//need to shift by iterator value later on
for(compass =0; compass < 8; compass++){
totAliveNeighbors += ((columnMask & neighbors[compass])?1:0);
}

}//end main

void displayBinary(unsigned long x){
unsigned long MASK = 0x80000000;
do {
//printf("%c",(x & MASK)?'X':0x20);
printf("%s", (x & MASK)?"1":"0");
} while ((MASK >>=1)!=0);
}

unsigned long north(int rowNum){
if(rowNum == 0){
return 0;
}
else
return grid[rowNum-1];
}

unsigned long west(int rowNum){
holder = grid[rowNum] >>1;
return holder;
}

unsigned long east(int rowNum){
holder = grid[rowNum] <<1;
return holder;
}

unsigned long south(int rowNum){
if(rowNum == 31)
return 0;
else
return grid[rowNum+1];
}

unsigned long northWest(int rowNum){
if(rowNum == 0)
return 0;
else{
holder = grid[rowNum-1] >>1;
return holder;
}
}

unsigned long northEast(int rowNum){
if(rowNum == 0)
return 0;
else{
holder = grid[rowNum-1] <<1;
return holder;
}
}

unsigned long southWest(int rowNum){
if(rowNum == 31)
return 0;
else{
holder = grid[rowNum+1] >>1;
return holder;
}
}

unsigned long SouthEast(int rowNum){
if(rowNum == 31)
return 0;
else{
holder = grid[rowNum+1] <<1;
return holder;
}
}

最佳答案

您可以通过 ORing (|) 和设置了该位的值来设置位。

您可以通过 ANDing ( & ) 和一个设置了所有位的值来取消设置,除了那个。

您可以使用 NOT (~) 运算符将设置了一位的值转换为除设置了一位之外的所有位的值。

您可以通过 ANDing (&) 与仅设置了该位的值判断是否设置了位,并查看结果是真还是假。

您可以通过将值 << 左移 (1) n 位来设置第 n 位的值(从右数起,最右边的位命名为第 0 位)。

关于c - 用 C 编程生命游戏 - 按位运算问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21593742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com