gombeのブログ

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

マップ生成

マップ生成させました。

見たとおりです。 http://lazylifeeasyexit.blog67.fc2.co... ここのやり方です。

後は何も説明いらない気がする。

ラフガキソースですが一応

[c]

include <stdio.h>

include <stdlib.h>

include <assert.h>

define DISPLAY_ALL

typedef struct{ int *map; int width; int height; } map_t;

typedef struct{ int x; int y; } vector_t;

int table[8];

const int probability[8]={ 0,11,25,35,49,60,80,90 };

void calcTable(int t,map_t 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; }

/0...success/ int newMap(map_t map,int width,int height){ int i; map->width = width; map->height = height; map->map=calloc(heightwidth,sizeof(int)); if(map->map==NULL) return 1; for(i=0;i<widthheight;i++){ map->map[i]=rand()%2; } }

int isInField(map_t map,vector_t vec){ return !(vec->x<0||vec->y<0|| vec->x>=map->width||vec->y>=map->height); }

int numOfAround(map_t map,int place){ int i; int num=0; for(i=0;i<8;i++){ if(table[i]+place>=0&&table[i]+place<map->widthmap->height) if(map->map[table[i]+place]==1) num++; } return num; }

void automaton(map_t map){ int i; int num; for(i=0;i<map->widthmap->height;i++){ num=numOfAround(map,i); //if(map->map[i]==1)num--; map->map[i]=(probability[num] > rand()%100) ? 1 : 0; } }

void display(map_t map){ int i; printf("\033[%d;%dH",1,1); for(i=0;i<map->widthmap->height;i++){ switch(map->map[i]){ case 0: // printf("\033[46m \033[49m"); printf("##"); // printf("%d",numOfAround(map,i)); break; case 1: //printf("%d",numOfAround(map,i)); printf(" "); //printf(" "); break; case 2: printf("\033[41m \033[49m"); break; case 3: printf("\033[42m \033[49m"); break; default: assert(0); break; } if(i%map->width==map->width-1) printf("\033[49m\033[%d;1H",i/map->width+1); } }

int sizeOfLand_fill_with(map_t map,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<map->widthmap->height){ if(map->map[table[i]+place]==b){ map->map[table[i]+place]=fill; size += sizeOfLand_fill_with(map,table[i]+place,b,fill)+1; } } } return size; }

void removeSmallLand(map_t map){ int i; int size; for(i=0;i<map->widthmap->height;i++){ if(map->map[i]==0)continue; size=sizeOfLand_fill_with(map,i,1,2); if(size!=0&&size<50){ } else{ sizeOfLand_fill_with(map,i,2,3); } }

ifdef DISPLAY_ALL

display(map);

endif

for(i=0;i<map->width*map->height;i++){ if(map->map[i]==2)map->map[i]=0; else if(map->map[i]==3)map->map[i]=1; } }

void normalize(map_t map,int level){ int i; int num; for(i=0;i<map->widthmap->height;i++){ num=numOfAround(map,i); if(map->map[i]==1&&num<=level){ map->map[i]=2; } }

ifdef DISPLAY_ALL

display(map);

endif

for(i=0;i<map->width*map->height;i++){ if(map->map[i]==2){ map->map[i]=0; } } }

int main(int argc,char **argv){ map_t map; int i=25; if(argc!=3){ printf("arg error [width][height]\n"); return EXIT_FAILURE; } srand(time(NULL)); newMap(&map,atoi(argv[1]),atoi(argv[2])); calcTable(table,&map); while(i--){

ifdef DISPLAY_ALL

display(&amp;map);
usleep(100000);

endif

automaton(&amp;map);
automaton(&amp;map);
automaton(&amp;map);
automaton(&amp;map);

}

ifdef DISPLAY_ALL

display(&map);

endif

normalize(&map,1);

ifdef DISPLAY_ALL

usleep(2000000);

endif

removeSmallLand(&map); normalize(&map,1); display(&map); } [/c]