better map generation
This commit is contained in:
parent
aff8813ec0
commit
3b2398ee8d
1 changed files with 72 additions and 10 deletions
82
src/map.ml
82
src/map.ml
|
|
@ -49,16 +49,6 @@ type t =
|
||||||
; height : int
|
; 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 =
|
let get_tile_kind ~x ~y map =
|
||||||
try map.tiles.(x).(y) with Invalid_argument _ -> Black
|
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 ->
|
| (Black | Water) as bg ->
|
||||||
Error (Format.asprintf "can't move on %a" pp_background bg)
|
Error (Format.asprintf "can't move on %a" pp_background bg)
|
||||||
| Grass | Wheat -> Ok { pos with x; y }
|
| 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 }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue