samedi 10 décembre 2016

Game of Life Ocaml with Matrix

I have generated a matrix for my Game of Life, and I'm trying to make it so that it loops through and continuously prints out the next generation, I am using a code I found online, and it doesn't seem to work. Here is my code

let generation = ref 1
let get g x y =
  try g.(x).(y)
  with _ -> 0
 ;;
let neighbourhood g x y =
  (get g (x-1) (y-1)) +
  (get g (x-1) (y  )) +
  (get g (x-1) (y+1)) +
  (get g (x  ) (y-1)) +
  (get g (x  ) (y+1)) +
  (get g (x+1) (y-1)) +
  (get g (x+1) (y  )) +
  (get g (x+1) (y+1)) 

let next_cell g x y =
  let n = neighbourhood g x y in
  match g.(x).(y), n with
  | 1, 0 | 1, 1                      -> 0  (* lonely *)
  | 1, 4 | 1, 5 | 1, 6 | 1, 7 | 1, 8 -> 0  (* overcrowded *)
  | 1, 2 | 1, 3                      -> 1  (* lives *)
  | 0, 3                             -> 1  (* get birth *)
  | _ -> 0

let copy g = Array.map Array.copy g

let rec next g =
  let width = Array.length g
  and height = Array.length g.(0)
  and new_g = copy g in
  for x = 0 to pred width do
    for y = 0 to pred height do
      new_g.(x).(y) <- (next_cell g x y)
    done
  done;
  next new_g

let print g =
  let width = Array.length g
  and height = Array.length g.(0) in
  for x = 0 to pred width do
    for y = 0 to pred height do
      if g.(x).(y) = 0
      then print_char '.'
      else print_char 'o'
    done;
    print_newline()
  done
;;

print_string "Width ";
let num = read_int () in
 print_string "Height";
 let num2 = read_int () in
      while !generation < 100 do 
        let myArray = Array.init num (fun _ -> Array.init num2 (fun _ -> Random.int 2)) in 
        print_string "Generation: "; print_int !generation; print_string "\n";
        print (next myArray);
        generation := !generation +1;
        print_newline();
      done;;

It doesn't print anything at all, I am using some of the functions I found online. But I don't see what the problem is.




Aucun commentaire:

Enregistrer un commentaire