我需要幫助用 C 語言實作我的生命游戲。 Stackoverflow 上的其他帖子讓我相信我的問題與懸空指標有關,但是在修改我的程式以使用游戲網格的全域 2D 陣列而不是將它傳遞給之后回傳新的二維陣列的函式,我意識到這是我的update函式的問題。
我嘗試硬編碼一些簡單的模式,包括滑翔機和振蕩器,但網格沒有正確更新。每次程式運行時,模式都會以相同的方式更新,所以我認為這不是未初始化的記憶體導致問題的問題。我也知道沒有包含大于1. 因此,問題必須出在我更新網格的機制上。
有人可以幫我找到問題嗎?我找不到我的代碼有什么問題,我相信我已經正確地撰寫了規則。
這是 myneighbors和update函式,以及相關的變數和常量宣告。
#define MAX_Y 10 /* height */
#define MAX_X 30 /* width */
int grid[MAX_Y][MAX_X];
int neighbors(int x, int y) {
int dx, dy, dstx, dsty;
int n = 0;
for (dy = -1; dy <= 1; dy) {
for (dx = -1; dx <= 1; dx) {
dsty = y dy;
dstx = x dx;
if (dsty >= 0 && dsty < MAX_Y && dstx >= 0 && dstx < MAX_X)
n = !!grid[dsty][dstx]; /* use !! so that non-zero values eval to 1 */
}
}
/* (n > 0) ? printf("Point (%d,%d) has %d neighbors!\n", x, y, n) : 0; */
return n;
}
void update(void) {
int new[MAX_Y][MAX_X];
memset(new, 0, sizeof(int) * MAX_Y * MAX_X);
int i, j, n;
for (i = 0; i < MAX_Y; i) {
for (j = 0; j < MAX_X; j) {
n = neighbors(i, j);
/* alive, 2 or 3 neighbors -> alive!
* dead, 3 neighbors -> alive!
* anything else -> dead :(
*/
if (grid[i][j] && (n == 2 || n == 3))
new[i][j] = 1;
else if (!grid[i][j] && n == 3)
new[i][j] = 1;
else
new[i][j] = 0;
}
}
memcpy(grid, new, sizeof grid);
}
uj5u.com熱心網友回復:
在您的neighbors函式中,您需要仔細考慮回圈迭代,其中dx和dy都為零。Conway's Game of Life 不認為一個細胞是它自己的鄰居,所以你需要避免計算它。
您還使用字母i和混淆了自己j。您允許j一直到MAX_X,但隨后您在呼叫 時將其j用作y坐標neighbors,因此這將導致溢位和錯誤計算。(從更簡單的 10x10 網格案例開始,有時可以避免此類錯誤。)
uj5u.com熱心網友回復:
您應該調整neighbors()函式以省略單元格本身。
這是一個修改后的版本:
#define MAX_Y 10 /* height */
#define MAX_X 30 /* width */
unsigned char grid[MAX_Y][MAX_X];
int neighbors(int x, int y) {
int n = -!!grid[y][x];
for (int dy = -1; dy <= 1; dy) {
for (int dx = -1; dx <= 1; dx) {
int dsty = y dy;
int dstx = x dx;
if (dsty >= 0 && dsty < MAX_Y && dstx >= 0 && dstx < MAX_X && grid[dsty][dstx])
n ;
}
}
return n;
}
void update(void) {
int new[MAX_Y][MAX_X] = { 0 };
for (int y = 0; y < MAX_Y; y) {
for (int x = 0; x < MAX_X; x) {
int n = neighbors(y, x);
/* alive, 2 or 3 neighbors -> alive!
* dead, 3 neighbors -> alive!
* anything else -> dead :(
*/
new[y][x] = (grid[y][x] && n == 2) || n == 3;
}
}
memcpy(grid, new, sizeof grid);
}
該neighbors()函式可以通過較少的測驗來簡化:
int neighbors(int x, int y) {
int n = -(grid[y][x] != 0);
int x1 = x - (x > 0);
int x2 = x (x < MAX_X - 1);
int y1 = y - (y > 0);
int y2 = y (y < MAX_Y - 1);
for (y = y1; y <= y2; y ) {
for (x = x1; x <= x2; x ) {
n = grid[y][x] != 0;
}
}
return n;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373377.html
上一篇:C忽略scanf上的破折號
下一篇:C程式生成兩個行程樹而不是一個
