tanks

Blow up enemy tanks using code
git clone https://git.woozle.org/neale/tanks.git

tanks / contrib
Neale Pickett  ·  2024-11-05

evolve.ml

  1type sensor = (int * int * int * bool)
  2
  3type tank = (
  4  string
  5  * sensor
  6  * sensor
  7  * sensor
  8  * sensor
  9  * sensor
 10  * sensor
 11  * sensor
 12  * sensor
 13  * sensor
 14  * sensor
 15  * string list
 16)
 17
 18let symbols = [
 19  "~";
 20  "!";
 21  "+";
 22  "-";
 23  "*";
 24  "/";
 25  "%";
 26  "&";
 27  "|";
 28  "^";
 29  "<<";
 30  ">>";
 31  ">";
 32  ">=";
 33  "<";
 34  "<=";
 35  "=";
 36  "<>";
 37  "abs";
 38  "dup";
 39  "pop";
 40  "exch";
 41  "if";
 42  "ifelse";
 43  "mset";
 44  "mget";
 45  "{";
 46  "}";
 47  "fire-ready?";
 48  "fire!";
 49  "set-speed!";
 50  "get-turret";
 51  "set-turret!";
 52  "sensor?";
 53  "set-led!";
 54  "random";
 55]
 56
 57let make_nucleotide () =
 58  Random.int ((List.length symbols) + 360 + 360)
 59  
 60
 61let rec make_dna = function
 62  | 0 ->
 63      []
 64  | n ->
 65      (make_nucleotide ()) :: (make_dna (n - 1))
 66  
 67
 68let rec program_of_dna = function
 69  | [] ->
 70      []
 71  | i :: tl ->
 72      let s =
 73        try
 74          List.nth symbols i
 75        with
 76          | Failure _
 77          | Invalid_argument _ ->
 78              string_of_int (i - (List.length symbols) - 360)
 79      in
 80        s :: (program_of_dna tl)
 81
 82let tank_of_dna d =
 83  let color_of_dna = function
 84    | r :: g :: b :: tl ->
 85        (tl, (Format.sprintf "%02x%02x%02x"
 86                ((abs r) mod 256)
 87                ((abs g) mod 256)
 88                ((abs b) mod 256)))
 89    | tl ->
 90        (tl, "cccccc")
 91  in
 92  let sensor_of_dna = function
 93    | a :: b :: c :: d :: tl ->
 94        (tl, (a, b, c, (d != 0)))
 95    | tl ->
 96        (tl, (0, 0, 0, false))
 97  in
 98  let d, color = color_of_dna d in
 99  let d, s0 = sensor_of_dna d in
100  let d, s1 = sensor_of_dna d in
101  let d, s2 = sensor_of_dna d in
102  let d, s3 = sensor_of_dna d in
103  let d, s4 = sensor_of_dna d in
104  let d, s5 = sensor_of_dna d in
105  let d, s6 = sensor_of_dna d in
106  let d, s7 = sensor_of_dna d in
107  let d, s8 = sensor_of_dna d in
108  let d, s9 = sensor_of_dna d in
109  let p = program_of_dna d in
110    (color, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, p)
111
112
113let print_tank t =
114  let print_sensor (a, b, c, d) =
115    Format.printf "Sensor: %d %d %d %d\n" a b c (if d then 1 else 0)
116  in
117    match t with
118      | (color, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, p) ->
119          Format.printf "Color: #%s\n" color;
120          print_sensor s0;
121          print_sensor s1;
122          print_sensor s2;
123          print_sensor s3;
124          print_sensor s4;
125          print_sensor s5;
126          print_sensor s6;
127          print_sensor s7;
128          print_sensor s8;
129          print_sensor s9;
130          print_endline (String.concat " " p)
131
132let write_tank i t =
133  let fnprint fn str =
134    let filename = Format.sprintf "tank.%d/%s" i fn in
135    let chan = open_out filename in
136      output_string chan str;
137      close_out chan
138  in
139  let print_sensor n (a, b, c, d) =
140    fnprint
141      (Format.sprintf "sensor%d" n)
142      (Format.sprintf "Sensor: %d %d %d %d\n" a b c (if d then 1 else 0))
143  in
144  match t with
145    | (color, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, p) ->
146        fnprint "color" color;
147        print_sensor 0 s0;
148        print_sensor 1 s1;
149        print_sensor 2 s2;
150        print_sensor 3 s3;
151        print_sensor 4 s4;
152        print_sensor 5 s5;
153        print_sensor 6 s6;
154        print_sensor 7 s7;
155        print_sensor 8 s8;
156        print_sensor 9 s9;
157        fnprint "program" (String.concat " " p)
158            
159let _ = Random.self_init ()
160
161let _ =
162  let dnas =
163    let t = Array.make 20 500 in
164      Array.map make_dna t
165  in
166  let tanks = Array.map tank_of_dna dnas in
167    Array.mapi write_tank tanks