diff --git a/test/langtons-ant.nas b/test/langtons-ant.nas new file mode 100644 index 0000000..9eed9a9 --- /dev/null +++ b/test/langtons-ant.nas @@ -0,0 +1,97 @@ +use std.unix; + +srand(); + +var ant = { + new: func(color, pos_x, pos_y) { + return { + move: int(rand()*4), + color: color, + pos_x: pos_x, + pos_y: pos_y + }; + } +}; + +# generate agents +var ants = [ + ant.new(10, 30, 15), + ant.new(11, 31, 16), + ant.new(4, 29, 13), + ant.new(9, 30, 14), + ant.new(13, 30, 12), + ant.new(99, 25, 18) +]; + +# initialize game map +var map = []; +var map_color = []; +setsize(map, 60*30); +setsize(map_color, 60*30); +forindex(var i; map) { + map[i] = 0; + map_color[i] = 0; +} +foreach(var a; ants) { + map_color[a.pos_x + a.pos_y*60] = a.color; +} + +var print_map = func { + var res = "\e[1;1H"; + for(var y = 0; y<30; y += 1) { + for(var x = 0; x<60; x += 1) { + res ~= "\e[38;5;"~map_color[x + y*60]~";1m"; + res ~= map[x + y*60] ~ " \e[0m"; + } + res ~= "\n"; + } + print(res); +} + +var move = func { + var move_step = [ + [0, -1], + [1, 0], + [0, 1], + [-1, 0] + ]; + var temp_map = []; + setsize(temp_map, 60*30); + forindex(var i; map) { + temp_map[i] = map[i]; + } + foreach(var a; ants) { + var map_state = map[a.pos_x + a.pos_y*60]; + temp_map[a.pos_x + a.pos_y*60] = map_state==0? 1:0; + if (map_state==1) { + a.move -= 1; + if (a.move < 0) { + a.move = 3; + } + } else { + a.move += 1; + if (a.move > 3) { + a.move = 0; + } + } + a.pos_x += move_step[a.move][0]; + a.pos_y += move_step[a.move][1]; + if (a.pos_x < 0) { a.pos_x = 59; } + if (a.pos_x > 59) { a.pos_x = 0; } + if (a.pos_y < 0) { a.pos_y = 29; } + if (a.pos_y > 29) { a.pos_y = 0; } + + if (map_color[a.pos_x + a.pos_y*60]!=a.color) { + map_color[a.pos_x + a.pos_y*60] = a.color; + } else { + map_color[a.pos_x + a.pos_y*60] = 0; + } + } + map = temp_map; +} + +while(1) { + print_map(); + move(); + unix.sleep(1/24); +} \ No newline at end of file