グローバル if 使いまくりの糞コードです ちったあ参考になるでしょうか。。。
グローバル if 使いまくりの糞コードです ちったあ参考になるでしょうか。。。
//1次元セルオートマトン? あってるかどうかはわかりまっせんint NUM = 100; //細胞数int [] cell = new int[NUM];//細胞が生きているかどうかのフラグ 0:死 1:生int [] dcell = new int[NUM];//直前の細胞の生死フラグを判定するint Rsize = 2;//四角形のサイズint right=0, left=0;//セルの右左の配列の添字を入れる変数int size = 0;void setup() {size(200, 500);smooth();background(255);for (int i=0; i<NUM; i++) {//細胞のフラグを初期化する//randomの帰り値はfloatなのでキャスト 0 - 2 の乱数を発生させintにキャストすると 0 か1 という値が入るので初期化できる//cell[i] = int(random(0, 2));cell[i] = 0;if(i == 49){cell[i] = 1;}//値を直前の細胞の配列にコピーするdcell[i] = cell[i];}}void draw() {drawCells(cell, size);//細胞を描画するfor (int i=0; i<NUM; i++) {//ここから配列の処理//配列の添字関係の処理//変数 leftは現在のセルの左の配列 つまり i - 1変数rightは現在のセルの右の配列 つまり i + 1でアクセスできるif (i == 0) {//配列が左端の場合,最後の配列とを参照することで配列が円状になっているようにするleft = NUM - 1;right = i + 1;}else if (i == 99) {//配列が右端まで来た場合、最初の配列要素を参照する elseをつけないとダメleft = i - 1;right = 0;}else {//それ以外の場合 上でelseを付けないと i = 0のとき0 - 1 で-1の添字ができてしまうleft = i - 1;right = i + 1;println("配列添え字"+"["+left+"]");}//配列の添字処理修了//現在のセルが死んでいる場合の処理if (dcell[i] == 0) {deadecell(i);}//現在のセルが死んでいる場合の処理修了else if (dcell[i] == 1) {//現在のセルが生きている場合の処理条件は玲のごとくもっとスマートに書けると思われalivecell(i);}}for(int i=0; i<NUM; i++){//判定したcellの値を直前の値として保存するdcell[i] = cell[i];}size = size + Rsize;//細胞の描画開始位置を 1段下へする}void drawCells(int[] cells, int size) {//セルを生死フラグを元に描画する関数 引数は生死フラグが入った配列 sizeは細胞を描画するy軸を決めるfor (int i=0; i<NUM; i++) {//細胞の生死フラグを元に四角形を描画するfill(0);//細胞の色黒if (cells[i] == 0) {//死んでいるなら白くするfill(255);}//細胞を描画するrect(i*Rsize,size, Rsize, Rsize);}}void deadecell(int i) {//セルが死んでいる時の判定を行う関数 iはforループ時の変数 比較は直前の細胞のフラグが入ってる配列に対して行う、if (dcell[left] == 1 && dcell[right] == 1) {//両隣とも生きている場合 過密なのでセルは死んだままcell[i] = 0;}else if (dcell[left] == 1 && dcell[right] == 0 || dcell[left] == 0 && dcell[right] == 1) {//右左どちらかが生きている場合は誕生するcell[i] = 1;}else if (dcell[left] == 0 && dcell[right] == 0) {//両隣とも死んでいる場合 過疎なのでセルは死んだままcell[i] = 0;}}void alivecell(int i) {//セルが生きている場合の判定を行う関数 iはforループ時の変数if (dcell[left] == 1 && dcell[right] == 1) {//両隣のセルが生きていると過密なのでセルは死ぬcell[i] = 0;}else if (dcell[left] == 1 && dcell[right] == 0 ) {//左のセルが生きている場合セルは死ぬcell[i] = 0;}else if (dcell[right] == 1 && dcell[left] == 0) {//右のセルが生きている場合セルは生き続けるcell[i] = 1;}else if (dcell[left] == 0 && dcell[right] == 0) {//両隣のセルが死んでいる場合でもセルは生き続けるcell[i] = 1;}}//修了