Skip to content

Instantly share code, notes, and snippets.

@micromeeeter
Created December 1, 2017 07:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save micromeeeter/f7858c75cddf0ff04db5ee7555fd952f to your computer and use it in GitHub Desktop.
Save micromeeeter/f7858c75cddf0ff04db5ee7555fd952f to your computer and use it in GitHub Desktop.
ライフゲームをクロスステッチの図案として見る
//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