我有一个可点击的网格,但我不确定如何继续使用一组特定的规则。
编辑:我以一种更容易理解的方式重写了规则。很像人生的游戏。 设置>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;
}
}
}
}
}
你的问题很宽泛,所以我将广义地回答。你需要弄清楚四件事:
-
如何表示您的单元格换句话说,就是你想用什么类型的变量来存储你的网格。你现在用的是
colors
,但你可能不想那样做。在我看来,你有三个逻辑选项:- 使用枚举值的2D数组。枚举将具有BASE、ACTIVE、INACTIVE和OUTLINE的状态。这可能是正确的方法。
- 使用二维整型数组。0代表基础,1代表活动,2代表非活动,3代表轮廓。使用enum可能更好,但这可能更容易让新手理解。
- 使用2D对象数组。创建一个表示单元格的类,该对象将存储其状态(以enum或int类型存储)。如果你想在每个单元中使用其他逻辑,或者如果你想让每个单元跟踪自己的邻居,你可以使用这种方法。
-
如何在鼠标单击时更改单个单元格的状态。你已经有了处理颜色的逻辑,现在你只需要把这个逻辑应用到你在第一步选择的数据结构中。也许可以创建一个函数,接受
mouseX
和mouseY
,并返回该位置在数组中的位置。 -
如何获取下一代每个cell的新状态。创建一个函数,该函数接受一个单元格的位置(它在2D数组中的行和列),并返回该单元格在下一代中应该具有的状态。这是项目的"肉和土豆",将其分离将帮助您分离逻辑。拿出一张网格纸,画一些例子。如果你知道一个细胞的位置,它的邻居的位置是什么?有很多关于生命游戏的教程都有这样的逻辑。
-
如何更新你的网格。请记住,在更新整个网格之前,必须对网格中的每个单元格执行第2步。这意味着你必须在每次迭代中创建一个新的 2D数组。
像这样分解你的问题,如果你在某个特定的步骤上卡住了,发布一个新的问题。一般的"我该怎么做"这类问题很难提供帮助。在更具体的问题上提供帮助要容易得多,比如"我尝试了X,预期是Y,但得到的却是Z。"我做错了什么?"
祝你好运!