gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

マップ生成(Processing

Processing版です

[java] int count = 100;

int table=new int[8];

final int ScrWidth=1900; final int ScrHeight=1000;

int scale = 5;

int probability={ 0,8,25,35,49,60,81,92,100 };

Map Map=new Map(ScrWidth/scale,ScrHeight/scale);

void calcTable(int t,Map map){ t[0]=1; t[1]=-1; t[2]=map.Width; t[3]=-map.Width; t[4]=1+map.Width; t[5]=-1+map.Width; t[6]=1-map.Width; t[7]=-1-map.Width; }

class Map{ int Map; int Width; int Height;

Map(int Width,int Height){ int i; this.Width = Width; this.Height = Height; this.Map=new int[this.Widththis.Height]; for(i=0;i<this.Widththis.Height;i++){ this.Map[i]=int(random(2)); } }

int numOfAround(int place){ int i; int num=0; for(i=0;i<8;i++){ if(table[i]+place>=0&&table[i]+place<this.Width*this.Height) if(this.Map[table[i]+place]!=0) num++; } return num; }

void automaton(){ int i; int num; for(i=0;i<this.Width*this.Height;i++){ num=this.numOfAround(i); //if(this.Map[i]==1)num--; this.Map[i]=(probability[num] > random(100)) ? 1 : 0; } }

void display(int x,int y,int scale){ int px,py; int i; noStroke(); for(i=0;i<this.Widththis.Height;i++){ switch(this.Map[i]){ case 0: fill(0,128+numOfAround(i)15,200-+numOfAround(i)5); break; case 1: fill(80,numOfAround(i)20+100,100); break; case 2: fill(250,0,0); break; case 3: fill(50,250,250); break; default: fill(50,250,this.Map[i]/10); break; } px=i%this.Widthscale-x; py=i%this.Widthscale-x; if(py<0&&py>1000)continue; if(px>0&&px<1900){ rect(i%this.Widthscale-x,i/this.Widthscale-y,scale,scale); } else if(px<19002) rect(i%this.Widthscale-x+19002,i/this.Widthscale-y,scale,scale); } }

void display(){ int i; noStroke(); for(i=0;i<this.Widththis.Height;i++){ switch(this.Map[i]){ case 0: fill(0,128,200); break; case 1: fill(80,numOfAround(i)20+100,100); break; case 2: fill(250,0,0); break; case 3: fill(50,250,250); break; default: fill(50,250,this.Map[i]/10); break; } rect(i%this.Widthscale,i/this.Widthscale,scale,scale); } }

int sizeOfLand_fill_with(int place,int b,int fill){ int i; int size=0; for(i=0;i<8;i++){ if(table[i]+place>=0&&table[i]+place<this.Width*this.Height){ if(this.Map[table[i]+place]==b){ this.Map[table[i]+place]=fill; size += sizeOfLand_fill_with(table[i]+place,b,fill); size++; } } } if(this.Map[place]==1)size++; return size; }

void removeSmallLand(){ int i; int size; fill(250); for(i=0;i<this.Widththis.Height;i++){ if(this.Map[i]==0)continue; size=sizeOfLand_fill_with(i,1,2); if(size!=0&&size<50){ fill(255,100,100); text(size,i%Widthscale,20+i/Widthscale); sizeOfLand_fill_with(i,2,0); } else if(size!=0){ fill(255,250,200); text(size,i%Widthscale,20+i/Width*scale); sizeOfLand_fill_with(i,2,3); } } }

void normalize(int level){ int i; int num; for(i=0;i<this.Width*this.Height;i++){ num=numOfAround(i); // println("num"+num); if(this.Map[i]!=0&&num<=level){ this.Map[i]=0; } } } }

void setup(){ calcTable(table,Map); fullScreen(); frameRate(30); }

int px,py;

void draw(){ count--; if(count==0){ Map.normalize(2); Map.display(); Map.removeSmallLand(); } else if(count==-50){ for(int i=0;i<Map.WidthMap.Height;i++){ if(Map.Map[i]!=3)Map.Map[i]=0; else Map.Map[i]=1; } Map.display(); } else if(count==-150){ } else if(count>0){ Map.display(); Map.automaton();
} else{ Map.display(min(mouseX
3,ScrWidth*3),min(mouseY,ScrHeight),10); }

fill(0); rect(0,0,150,20); fill(255); textSize(20); text("fps:"+round(frameRate)+"c:"+count,0,20); } [/java]