Created
December 1, 2017 07:39
-
-
Save micromeeeter/f7858c75cddf0ff04db5ee7555fd952f to your computer and use it in GitHub Desktop.
ライフゲームをクロスステッチの図案として見る
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//AT17adcal :: 1 :: ジェネるマンに推したい手芸の話 | |
//1: ライフゲームをクロスステッチする | |
//サンプルコード by モハ | |
final int cell = 10; //図面の1マスの1辺の長さ | |
final int widthNum = 40; //life gameの発生しうるマスの横の個数 | |
final int heightNum = 40; //life gameの発生しうるマスの縦の個数 | |
boolean[][] state = new boolean[widthNum + 2][heightNum + 2]; //1マスごとの、現在の生死が格納される配列 | |
boolean[][] state_pre = new boolean[widthNum + 2][heightNum + 2]; //1マスごとの、1フレ前の生死が格納される配列 | |
void setup(){ | |
size(500, 500); //set window size 500 * 500 pix | ウィンドウサイズを500*500ピクセルに設定する | |
frameRate(1); //refresh 15 times per sec | 1秒間に15回描画する | |
background(0, 0, 0); | |
for(int j = 0; j < heightNum + 2; j++){ //初期の生死を適当に設定。いい感じになるように調整した | |
for(int i = 0; i < widthNum + 2; i++){ | |
float d = dist(i*cell, j*cell, widthNum * cell / 2, heightNum * cell / 2); //初期状態で生きているものがある円内に収まるようにした | |
if(d < width / 3){ | |
if(random(0, 1) > 0.5){ //1/2の確率で | |
state_pre[i][j] = true; //true:生, false:死 | |
} | |
}else{ | |
state_pre[i][j] = false; | |
} | |
} | |
} | |
} | |
void draw(){ | |
background(0, 0, 0); | |
update(); | |
pushMatrix(); //push-popでひとかたまりの描画、みたいな | |
translate(cell*5, cell*5); //周囲に5マス分の余白を取っているので、その調整 | |
noStroke(); | |
for(int j = 1; j <= heightNum; j++){ //[0]と[heightNum+1]は、調整用にとってある、描画範囲の一個外のマス | |
for(int i = 1; i <= widthNum; i++){ | |
if(state[i][j] == true){ //そのマスが生きてたら | |
fill(0, 255, 0); //緑で | |
rect(cell * (i-1), cell * (j-1), cell, cell); //四角書く | |
}else{ //死んでたら | |
fill(0, 0, 0); //黒で | |
rect(cell * (i-1), cell * (j-1), cell, cell); //四角書く | |
} | |
} | |
} | |
popMatrix(); | |
//枠線を書く | |
drawGrid(); | |
save(frameCount + ".jpg"); //毎フレーム描画した絵をキャプチャしていく .pdeファイルと同じフォルダ内に保存される | |
} | |
void update(){ | |
//ライフゲームのアルゴリズムはウィキペディアを参照(http://bit.ly/2i5jin6) | |
for(int j = 1; j <= heightNum; j++){ | |
for(int i = 1; i <= widthNum; i++){ | |
int livingNum = 0; //周囲8マスのうち、生きているマスの個数が入る変数 | |
for(int n = -1; n <= 1; n++){ | |
for(int m = -1; m <= 1; m++){ | |
if(n != 0 || m != 0){ //自分は含めない | |
if(state_pre[i+n][j+m] == true) livingNum++; //生きてたら数える | |
} | |
} | |
} | |
if(state_pre[i][j] == true){ | |
if(livingNum == 2 || livingNum == 3){ | |
state[i][j] = true; | |
}else{ | |
state[i][j] = false; | |
} | |
} | |
if(state_pre[i][j] == false){ | |
if(livingNum == 3){ | |
state[i][j] = true; | |
}else{ | |
state[i][j] = false; | |
} | |
} | |
} | |
} | |
buffer(); | |
} | |
void buffer(){ //現在の生死データを過去へ | |
for(int j = 0; j < heightNum + 2; j++){ | |
for(int i = 0; i < widthNum + 2; i++){ | |
state_pre[i][j] = state[i][j]; | |
} | |
} | |
} | |
void drawGrid(){ | |
stroke(50, 150, 150); //水色 | |
//細い線 | |
strokeWeight(1); //線の太さは1pix | |
for(int i = 0; i < widthNum+10-1; i++){ | |
line(cell*(i+1), 0, cell*(i+1), height); | |
} | |
for(int i = 0; i < heightNum+10-1; i++){ | |
line(0, cell*(i+1), width, cell*(i+1)); | |
} | |
//太い線 | |
strokeWeight(3); //線の太さは3pix | |
for(int i = 0; i < int(widthNum/cell); i++){ | |
line(100*(i+1), 0, 100*(i+1), height); | |
} | |
for(int i = 0; i < int(heightNum/cell); i++){ | |
line(0, 100*(i+1), width, 100*(i+1)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment