简体   繁体   English

康威的人生游戏-JS

[英]Conway's Game of Life - JS

im trying to create Conways Game of Life ( https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life ) in JS with the P5.JS library, but im having some trouble. 我试图使用P5.JS库在JS中创建Conways人生游戏( https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life ),但是我遇到了一些麻烦。 heres the code: 这是代码:

var winSize = 50;
var cellSize = 10;
var cells = [];
var but;

var gen = 0;
var popl;

function setup() {
  createCanvas(cellSize * winSize + winSize + 1, cellSize * winSize + winSize + 1);
  //create grid
  for (var b = (cellSize / 2) + 1; b < height; b += cellSize + 1) {
    for (var a = (cellSize / 2) + 1; a < width; a += cellSize + 1) {
      cells.push(new Cell(a, b));
    }
  }
  but = createButton("RUN");
  but.mouseClicked(run);
}

function draw() {
  background(50);
  for (var a = 0; a < cells.length; a++) {
    cells[a].show();
  }
}

function Cell(a, b) {
  this.x = a;
  this.y = b;
  this.clr = 0;
  // true when alive, false when dead
  this.ckd = false;

  this.show = function() {
    rectMode(CENTER);
    noStroke();
    fill(this.clr);
    rect(this.x, this.y, cellSize, cellSize);
  }

  //if cell is dead, it comes to life, if cell is alive, it dies
  this.chk = function() {
    if (this.ckd) {
      this.ckd = false;
    } else this.ckd = true;

    if (this.ckd) {
      this.clr = 255;
    } else this.clr = 0;
  }
}

function mousePressed() {
  for (var a = 0; a < cells.length; a++) {
    if (mouseX >= cells[a].x - cellSize / 2 && mouseX <= cells[a].x - cellSize / 2 + cellSize && mouseY >= cells[a].y - cellSize / 2 && mouseY <= cells[a].y - cellSize / 2 + cellSize) {
      console.log("clicked " + a + " at " + cells[a].x + " , " + cells[a].y);
      cells[a].chk();
    }
  }
}

function run() {
  gen++;
  for (var a = 0; a < cells.length; a++) {
    // look for all cells that are alive
    if (cells[a].ckd) {
      //calculate its neighbors
      if (clcn(a) == 1 || clcn(a) == 4) {
        cells[a].chk();
      }
    } else { //all cells that are dead and calculate its neighbors
      if (clcn(a) == 3) {
        cells[a].chk();
      }
    }
  }
  popl = cells.length;
  //once done, run again
  run();
}

//function that calculates neighbors, takes index as arg
function clcn(a) {

  //first it looks for all cells that are corners (0, 49, 2499, 2450), then for all cells that are on edges, and then for the ones in the center (this is to avoid checking cells that dont exist)
  if (a === 0) {
    if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a + winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a + winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a + winSize + 1].ckd) {
          if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a + winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (a == 49) {
    if (cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize].ckd) {
      if (cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize].ckd) {
        if (cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize].ckd) {
          if (cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (a == 2499) {
    if (cells[a - 1].ckd || cells[a - winSize].ckd || cells[a - winSize - 1].ckd) {
      if (cells[a - 1].ckd || cells[a - winSize].ckd || cells[a - winSize - 1].ckd) {
        if (cells[a - 1].ckd || cells[a - winSize].ckd || cells[a - winSize - 1].ckd) {
          if (cells[a - 1].ckd || cells[a - winSize].ckd || cells[a - winSize - 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (a == 2450) {
    if (cells[a + 1].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd) {
          if (cells[a + 1].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a].y == 6) {
    if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
          if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a].x == 545) {
    if (cells[a - winSize].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a + winSize - 1].ckd) {
      if (cells[a - winSize].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a + winSize - 1].ckd) {
        if (cells[a - winSize].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a + winSize - 1].ckd) {
          if (cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a + winSize - 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a].y == 545) {
    if (cells[a - winSize].ckd || cells[a + 1].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd) {
      if (cells[a - winSize].ckd || cells[a + 1].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd) {
        if (cells[a - winSize].ckd || cells[a + 1].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd) {
          if (cells[a - winSize].ckd || cells[a + 1].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a].x == 6) {
    if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd || cells[a + winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd || cells[a + winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd || cells[a + winSize + 1].ckd) {
          if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd || cells[a + winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
    if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
          return 4;
        }
        return 3;
      }
      return 2;
    }
    return 1;
  }
}

i dont know where my mistake is, it keeps throwing an error "Uncaught TypeError: Cannot read property 'ckd' of undefined". 我不知道我的错误在哪里,它不断抛出错误“未捕获的TypeError:无法读取未定义的属性'ckd'”。 what am i doing wrong? 我究竟做错了什么?

Any help is much appreciated. 任何帮助深表感谢。

ps: dont mark as duplicate, using the p5 library. ps:不要使用p5库标记为重复项。

If you don't want your question to be closed, then please try to narrow your problem down to an MCVE before you post. 如果您不希望关闭问题, 在发布之前尝试将问题缩小到MCVE It's very hard for us to debug your entire project for you. 对于我们来说,为您调试整个项目非常困难。 You should also tell us exactly what line the error is on, and somehow point that line out so we don't have to count lines. 您还应该确切地告诉我们错误所在的行,并以某种方式指出该行,这样我们就不必计算行数。

That being said, your error is a bit self-explanatory: you're trying to access the ckd property of an object that doesn't exist. 话虽如此,您的错误有点不解自明:您正在尝试访问不存在的对象的ckd属性。 This can happen if you're using a variable that you haven't defined. 如果您使用的变量尚未定义,则可能会发生这种情况。

But looking at your code, my guess is that you're accessing array indexes that don't exist. 但是查看您的代码,我的猜测是您正在访问不存在的数组索引。

You need to do some debugging. 您需要进行一些调试。 What exact index are you accessing when the error occurs? 发生错误时,您要访问什么确切的索引? How many indexes does the array have? 数组有几个索引? There's a mismatch between the two for some reason, so that's what you should be tracking down. 由于某种原因,两者之间存在不匹配,因此您应该对此进行跟踪。 Please note that I'm not asking that question so you tell me. 请注意,我不是在问这个问题,所以您告诉我。 That's the question you should be asking yourself. 那就是你应该问自己的问题。 That should begin a process of debugging and tracking down your error. 那应该开始调试和跟踪错误的过程。

I'll also note that you'll have better luck if you work in much smaller chunks. 我还要注意的是,如果您工作量小得多,那么运气会更好。 My guess is that you wrote most of this code and only tried to run it after it was all written. 我的猜测是您编写了大部分代码,并且仅在全部编写之后才尝试运行它。 That approach is going to give you a ton of headaches. 这种方法会让您头痛不已。 You need to work in small chunks, run your code often (every single time you add a line), and debug errors as soon as they occur instead of after you've added a ton of other code. 您需要分小块工作,经常运行代码(每次添加一行),并在错误发生后立即进行调试,而不是在添加大量其他代码后进行调试。

One final note: this seems to be a very roundabout way to count the neighbors of a cell. 最后一点:这似乎是计算单元格邻居的一种非常round回的方法。 Why not just use a for loop instead of a million nested if statements? 为什么不使用for循环而不是使用一百万个嵌套的if语句呢?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM