我在這段代碼的某處有錯誤。根據我的理解,鄰居的數量沒有被正確計算。鄰居功能可能是問題所在。我的欄位變數是一個 12x12 字符陣列,“#”是一個活細胞,“-”是一個死細胞。我對編程比較陌生,希望得到一些幫助。謝謝!
int neighbors(int l, int c)
{
int num = 0;
for (int i = -1; i < 2; i )
{
for (int j = -1; j < 2; j )
{
if ((l i < 0 || l i > 12) && (c j < 0 || c j > 12))
{
continue;
}
else if ((i != 0 || j != 0) && field[(l i)][(c j)] == '#')
{
num ;
}
}
}
return num;
}
//game logic
void logic()
{
char temp[12][12];
for (int i = 0; i < 12; i )
{
for (int j = 0; j < 12; j )
{
temp[i][j] = field[i][j];
}
}
for (int i = 0; i < 12; i )
{
for (int j = 0; j < 12; j )
{
if (field[i][j] == '#')
{
if (neighbors(i, j) < 1 || neighbors(i, j) > 3)
{
temp[i][j] = '-';
}
else
{
temp[i][j] = '#';
}
}
if (field[i][j] = '-')
{
if (neighbors(i, j) == 3)
{
temp[i][j] = '#';
}
else
{
temp[i][j] = '-';
}
}
field[i][j] = temp[i][j];
}
}
}
uj5u.com熱心網友回復:
如果陣列的維度為 12x12,則最大索引值為 11,因此測驗if ((l i < 0 || l i > 12) && (c j < 0 || c j > 12))不正確。它應該是:
if (l i < 0 || l i >= 12 || c j < 0 || c j >= 12)
continue;
另一個主要問題是您field[i][j] = temp[i][j];在更新回圈內更新:這會破壞相鄰單元格的鄰居的計算。您應該首先計算整個temp陣列并field在隨后的回圈中進行更新,或者對memcpy().
此外,康威生命游戲的標準規則與您的實作有些不同:if (neighbors(i, j) < 1 || neighbors(i, j) > 3)保持一個具有單個鄰居的細胞存活,而在標準規則下它應該死亡。將此測驗更改為:
if (neighbors(i, j) < 2 || neighbors(i, j) > 3)
temp[i][j] = '-';
這是一個簡化版本:
int neighbors(int l, int c) {
int num = 0;
for (int i = -1; i < 2; i ) {
for (int j = -1; j < 2; j ) {
if (l i >= 0 && l i < 12 && c j >= 0 && c j < 12
&& (i != 0 || j != 0) && field[l i][c j] == '#') {
num ;
}
}
}
return num;
}
//game logic
void logic() {
char temp[12][12];
for (int i = 0; i < 12; i ) {
for (int j = 0; j < 12; j ) {
temp[i][j] = field[i][j];
}
}
for (int i = 0; i < 12; i ) {
for (int j = 0; j < 12; j ) {
int nb = neighbors(i, j);
if (nb < 2 || nb > 3) {
temp[i][j] = '-';
} else
if (nb == 3) {
temp[i][j] = '#';
}
}
}
for (int i = 0; i < 12; i ) {
for (int j = 0; j < 12; j ) {
field[i][j] = temp[i][j];
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/367983.html
