所以我才刚进入uni的第一周,他们就一直把我们带入“编码训练营”,以使每个人都掌握最新知识,并确保他们了解基本知识。在训练营的最后,我们应该炫耀一个项目,展示我们的知识和所学到的东西。我们已经得到了建议的事情清单,我们可以做些什么,我决定根据the amazing, autotuning sandpiles进行挖掘。
要做到这一点,我认为我可以制作2D的谷物阵列,然后让我沿着其轮廓模拟流沙:
for(int i=0; i<cols; i++){ //for every column in the array
for(int j=0; i<rows; j++){ //for every row in the array
if(grain[i][j].value>=4){ //if the grains of sand on that square are greater than 4
grain[i][j-1].value=grain[i][j-1].value+1; //add a grain to the square above
grain[i+1][j].value=grain[i+1][j].value+1; //" " to the right
grain[i][j+1].value=grain[i][j+1].value+1; //" " below
grain[i-1][j].value=grain[i-1][j].value+1; //" " to the left
}
}
}
这不是我有问题的代码,尽管所有指针都不会出错,但这只是为了显示我要做什么的要旨。
此刻我所得到的如下
沙粒类:
class Grain{
PVector position;
float size;
int value;
color colour;
Grain(float x, float y){
position = new PVector(x,y);
size = 5;
value = 0;
colour = color(grain0);
}
void draw(){
stroke(0);
fill(colour);
rect(position.x,position.y,size,size);
}
}
然后是代码主体:
color grain0 = color(255);
color grain1 = color(255,0,0);
color grain2 = color(0,255,0);
color grain3 = color(0,0,255);
Grain[][] grain;
int cols = width;
int rows = height;
void setup(){
size(600,600);
grain = new Grain[cols][rows];
for(int i=0; i<cols; i++){
for(int j=0; j<rows; j++){
grain[i][j] = new Grain(5*i,5*j);
}
}
println(cols, rows);
}
void draw(){
background(255);
for(int i=0; i<cols; i++){
for(int j=0; j<rows; j++){
grain[i][j].draw();
}
}
}
我的问题源于以下事实:无论我做什么,尽管声明数组应该为widthxheight,但数组似乎都不会大于100x100。这是内置的处理限制,还是我缺少某些步骤?我看过其他地方,但是找不到任何与我的问题匹配的东西。
感谢您的帮助!
答案 0 :(得分:1)
size()
上的documention说:“如果不使用size(),则窗口的默认大小为100 x 100像素。”
size()
int cols = width;
int rows = height;
所以您只是分配这些默认值。
最简单的解决方法是摆脱这些变量并保持一行
grain = new Grain[width][height];
在setup()
中。确实不需要width
和height
的别名。至少,您应该将cols
和rows
的分配推迟到调用size()
之后。