better map generation

This commit is contained in:
otary 2023-07-09 15:47:30 +02:00
parent e7fb6a70a0
commit 4e5a2121c1

View File

@ -55,16 +55,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
@ -93,3 +83,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 }