阵列网格与点击功能在处理



我有一个可点击的网格,但我不确定如何继续使用一组特定的规则。

编辑:我以一种更容易理解的方式重写了规则。很像人生的游戏。 设置>

21个单元格横跨/列

4个基本单元垂直排列在电路板的中心。
轮廓单元格将围绕基本单元格。
其他细胞开始时为非活动状态

Base Cells [2]

中间的蓝色细胞不变且活跃,不能被移除。

Active [0] -> [1]

单击后,非活动的白色单元格变为黑色

如果


边与基单元格的边接触

边缘与另一个活动单元格的边缘接触

(左、右、上、下-不对角)

其他


仍不活跃的

不活动[1]-> [0]

单击后,活动的黑色单元格返回白色。

大纲[3]

一系列黄色细胞,它们会不断更新以包围周围的活跃细胞。

谁能帮助我实现这一点,我将感谢评论,以帮助我了解这个过程。

下面是我当前的代码:

int boxsize = 100;
int cols, rows;
color[][] colors;
int saved_i = -1;
int saved_j = -1;
void setup() {
  size(1300, 600);
  cols = width/boxsize;
  rows = height/boxsize;
  colors = new color[cols][rows];
  for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
  colors[i][j] = color(255);
    }
  }
}
void draw() {
  background(255);
  for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
      fill(colors[i][j]);
      rect(i*boxsize, j*boxsize, boxsize, boxsize);
    }
  }
}
void mousePressed() {
  for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
      int x = i*boxsize;
      int y = j*boxsize;
      if (mouseX > x && mouseX < (x + boxsize) && mouseY > y && mouseY < (y + boxsize)) {
        if ( saved_i == -1 || saved_i == i || saved_j == j ) {
          colors[i][j] = color(0);
          if (j>0) colors[i][j-1]=color(255, 255, 0);
          if (j>0) colors[i+1][j-1]=color(255, 255, 0);
          if (j<rows-1) colors[i][j+1]=color(255, 255, 0);
          if (j<rows-1) colors[i+1][j+1]=color(255, 255, 0);
          if (i>0) colors[i-1][j]=color(255, 255, 0);
          if (i>0) colors[i-1][j-1]=color(255, 255, 0);
          if (i>0) colors[i-1][j+1]=color(255, 255, 0);
      if (i<cols-1) colors[i+1][j]=color(255, 255, 0);
      saved_i = i;
      saved_j = j;
        }
      }
    }
  }
}

你的问题很宽泛,所以我将广义地回答。你需要弄清楚四件事:

  1. 如何表示您的单元格换句话说,就是你想用什么类型的变量来存储你的网格。你现在用的是colors,但你可能不想那样做。在我看来,你有三个逻辑选项:

    • 使用枚举值的2D数组。枚举将具有BASE、ACTIVE、INACTIVE和OUTLINE的状态。这可能是正确的方法。
    • 使用二维整型数组。0代表基础,1代表活动,2代表非活动,3代表轮廓。使用enum可能更好,但这可能更容易让新手理解。
    • 使用2D对象数组。创建一个表示单元格的类,该对象将存储其状态(以enum或int类型存储)。如果你想在每个单元中使用其他逻辑,或者如果你想让每个单元跟踪自己的邻居,你可以使用这种方法。
  2. 如何在鼠标单击时更改单个单元格的状态。你已经有了处理颜色的逻辑,现在你只需要把这个逻辑应用到你在第一步选择的数据结构中。也许可以创建一个函数,接受mouseXmouseY,并返回该位置在数组中的位置。

  3. 如何获取下一代每个cell的新状态。创建一个函数,该函数接受一个单元格的位置(它在2D数组中的行和列),并返回该单元格在下一代中应该具有的状态。这是项目的"肉和土豆",将其分离将帮助您分离逻辑。拿出一张网格纸,画一些例子。如果你知道一个细胞的位置,它的邻居的位置是什么?有很多关于生命游戏的教程都有这样的逻辑。

  4. 如何更新你的网格。请记住,在更新整个网格之前,必须对网格中的每个单元格执行第2步。这意味着你必须在每次迭代中创建一个新的 2D数组

像这样分解你的问题,如果你在某个特定的步骤上卡住了,发布一个新的问题。一般的"我该怎么做"这类问题很难提供帮助。在更具体的问题上提供帮助要容易得多,比如"我尝试了X,预期是Y,但得到的却是Z。"我做错了什么?"

祝你好运!

最新更新