From 3b2398ee8dfc5697c5a30963d0a32738463c6fb1 Mon Sep 17 00:00:00 2001 From: otary Date: Sun, 9 Jul 2023 15:47:30 +0200 Subject: [PATCH] better map generation --- src/map.ml | 82 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 10 deletions(-) diff --git a/src/map.ml b/src/map.ml index 197e246..662a5dd 100644 --- a/src/map.ml +++ b/src/map.ml @@ -49,16 +49,6 @@ type t = ; height : int } -let init () = - let width = 100 in - let height = 90 in - let tiles = - Array.init width (fun _x -> - Array.init height (fun _y -> - if Random.int 1000 <= 42 then Water else Grass ) ) - in - { tiles; width; height } - let get_tile_kind ~x ~y map = try map.tiles.(x).(y) with Invalid_argument _ -> Black @@ -87,3 +77,75 @@ let check_move map ({ x; y; _ } as pos) movement_dir = | (Black | Water) as bg -> Error (Format.asprintf "can't move on %a" pp_background bg) | Grass | Wheat -> Ok { pos with x; y } + +let n = 50 + +let m = 50 + +let nb_water_spread = 4 + +let p_water_spread = 0.5 + +let p_water_init = 0.005 + +let nb_tree_spread = 6 + +let p_tree_spread = 0.5 + +let p_tree_init = 0.01 + +let () = Random.self_init () + +let count_something t map = + let is_something t e = if e = t then 1 else 0 in + let f = is_something t in + Array.init n (fun i -> + Array.init m (fun j -> + if i = 0 || j = 0 || i = n - 1 || j = m - 1 then 0 + else + f map.(i - 1).(j) + + f map.(i + 1).(j) + + f map.(i).(j + 1) + + f map.(i).(j - 1) ) ) + +let populate t map i p_init p_spread = + let map = + Array.map + (fun ligne -> + Array.map + (fun e -> + let random = Random.float 1.0 in + if e = Grass && random < p_init then t else e ) + ligne ) + map + in + + let rec loop acc i = + if i = 0 then acc + else + let tbl_count = count_something t acc in + let acc = + Array.mapi + (fun i ligne -> + Array.mapi + (fun j e -> + let random = Random.float 1.0 in + if + e = Grass + && random < p_spread *. Float.of_int tbl_count.(i).(j) + then t + else e ) + ligne ) + acc + in + loop acc (i - 1) + in + loop map i + +let init () = + let tiles = Array.init n (fun _i -> Array.init m (fun _j -> Grass)) in + let tiles = + populate Water tiles nb_water_spread p_water_init p_water_spread + in + (*let tiles = populate Tree map nb_tree_spread p_tree_init p_tree_spread in*) + { tiles; width = n; height = m }