( Definizioni delle costanti ) : lf_define_constant 10 constant lf_width 10 constant lf_height ; ( Non funziona ..... definisco le costanti a mano ) 10 constant lf_width 10 constant lf_height ( Definizione delle variabili) : lf_define_environment create lf_board lf_width lf_height * allot ; ( Non funziona ..... definisco gli array a mano ) create lf_board lf_width lf_height * allot create lf_board_work lf_width lf_height * allot ( azzera la board contente lo schema del live ) lf_board lf_width lf_height * 0 fill ( copia la board nella copia di work ) : lf_copy_board_to_work lv_width lf_height * 0 do lf_board i + c@ lf_board_work i + c! loop ; ( copia la board di work nella board ) : lf_copy_work_to_board lf_width lf_height * 0 do lf_board_work i + c@ lf_board i + c! loop ; ( stampa la board del live ) : lf_board_print lf_height 0 do lf_width 0 do lf_board i lf_width * j + + c@ . loop cr loop ; : lf_board_empty_fill lf_height 0 do lf_width 0 do 0 lf_board i lf_width * j + + c! 0 lf_board_work i lf_width * j + + c! loop loop ; ( determina il numero di celle vive come somma dei valori tra le celle intorno ) ( i j -- ncell ) : lf_check_live_i_j swap lf_width * + ( trova la cella di partenza ) lf_width 1 + - ( trova indirizzo della cella -1 -1 ) 0 over lf_board swap + c@ + ( addr-1-1 sum1 -- ) swap lf_width + ( sum1 addr-1-0 -- ) swap over lf_board swap + c@ + ( addr-1-0 sum1 -- ) swap lf_width + ( sum1 addr-1+1 --) swap over lf_board swap + c@ + ( addr-1+1 sum1 -- ) swap lf_width 2 * 1 - - ( sum1 addr-1-0 --) swap over lf_board swap + c@ + ( addr-0-1 sum1 -- ) swap lf_width 2 * + ( sum1 addr+1-0 --) swap over lf_board swap + c@ + ( addr-1-0 sum1 -- ) swap lf_width 2 * 1 - - ( sum1 addr-1+1 --) swap over lf_board swap + c@ + ( addr-0-1 sum1 -- ) swap lf_width + ( sum1 addr-0+1 --) swap over lf_board swap + c@ + ( addr-0+1 sum1 -- ) swap lf_width + ( sum1 addr+1+1 --) swap over lf_board swap + c@ + ( addr+1+1 sum1 -- ) swap drop ( sum1 --) ; ( fa evolvere di una generazione la board ) : lf_board_evolve lf_height 1 - 1 do lf_width 1 - 1 do i j lf_check_live_i_j ( sum1 -- ) j i lf_width * + ( sum1 offset_i_j -- ) swap ( offset_i_j sum1 -- ) over ( offset_i_j sum1 offset_i_j -- ) lf_board swap + c@ ( offset_i_j sum1 cella_i_j -- ) 0 > if ( caso in cui nella cella c'e' 1 ) ( offset_i_j sum1 -- ) dup 2 = swap 3 = or if 1 else 0 then else ( caso in cui nella cella c'e' 0 ) 3 = if 1 else 0 then then swap lf_board_work swap + c! loop loop lf_copy_work_to_board ; ( initialize data ) lf_board_empty_fill 1 lf_board 22 + c! 1 lf_board 33 + c! 1 lf_board 43 + c! 1 lf_board 42 + c! 1 lf_board 41 + c! ( run the sample ) lf_board_print 5 1 do i . cr lf_board_evolve lf_board_print cr cr loop