Nie zauważyłem żeby wcześniej ktoś to wrzucał na GMC, więc postanowiłem zrobić przykładzik. Gra w życie jest jednym z pierwszych i najbardziej znanych przykładów automatu komórkowego, wymyślona w roku 1970 przez brytyjskiego matematyka Johna Conwaya. Bla, bla, bla... więcej dowiecie się na wikipedii.
Dzielę się z wami paczką rar w której skład wchodzą pliki exe, gm81 i gmres.
A dla bardziej leniwych opiszę całą zawartość. Wszystko jest obsługiwane przez 1 obiekt kontroler, bazuje na wielkości room i działa na klasycznych regułach "23/3".
Create:
GML
set_automatic_draw(1)
draw_set_color(c_white)
grid=ds_grid_create(room_width,room_height)
ds_grid_clear(grid,0)
ds_grid_set_region(grid,0,0,room_width,room_height/10,1)
ds_grid_shuffle(grid)
grid2=ds_grid_create(room_width,room_height)
ds_grid_copy(grid2,grid)
Step:
GML
///Obliczenia
for(a=0;a<room_width;a+=1)
for(b=0;b<room_height;b+=1)
{
s=ds_grid_get_sum(grid,a-1,b-1,a+1,b+1)
s-=ds_grid_get(grid,a,b)
if(ds_grid_get(grid,a,b)=0 and s=3){ds_grid_set(grid2,a,b,1)}
if((s<2 or s>3) and ds_grid_get(grid,a,b)=1){ds_grid_set(grid2,a,b,0)}
}
ds_grid_copy(grid,grid2)
Draw:
GML
///Draw
sur=surface_create(room_width,room_height)
surface_set_target(sur)
draw_clear(c_black)
for(a=0;a<room_width;a+=1)
for(b=0;b<room_height;b+=1)
{
if(ds_grid_get(grid,a,b)=1){draw_point(a,b)}
}
surface_reset_target()
draw_surface(sur,0,0)
surface_free(sur)
Zrobienie przykładu zajęło mi 20 minut, ale pokusiłem się o spróbowanie optymalizacji i w ciągu godziny dodałem obsługę surface. :)