#directory "+unix"
#load "unix.cma"
type position = int * int
type ennemi = {
e_pos : position;
pv : int;
chm : position list;
}
type tour = {
t_pos : position;
portee : int;
dommages : int;
}
type jeu = {
carte : bool array array;
ennemis : ennemi list;
tours : tour list;
}
let chemin = [ (0, 0); (1, 0); (2, 0); (2, 1); (2, 2); (2, 3); (2, 4);
(2, 5); (3, 5); (4, 5); (5, 5); (5, 6); (6, 6); (7, 6); (8, 6);
(8, 7); (8, 8); (8, 9); (9, 9); (10, 10); ]
let afficher_jeu jeu =
let afficher_case x y =
let position = (x, y) in
if List.exists (fun e -> e.e_pos = position) jeu.ennemis then
print_string "E"
else if List.exists (fun t -> t.t_pos = position) jeu.tours then
print_string "T"
else if jeu.carte.(y).(x) then
print_string "#"
else
print_string "."
in
let hauteur = Array.length jeu.carte in
let largeur = Array.length jeu.carte.(0) in
for y = 0 to hauteur - 1 do
for x = 0 to largeur - 1 do
afficher_case x y
done;
print_newline ()
done;
List.iter (fun e -> Printf.printf "E: %d\n" e.pv) jeu.ennemis;
print_newline ()
let new_ennemi () =
{ e_pos = (0, 0); pv = 60; chm = chemin }
let deplacer_ennemi e =
let next_pos, chm =
match e.chm with
| hd :: tl -> (hd, tl)
| _ -> (e.e_pos, e.chm)
in
{ e with e_pos = next_pos; chm; }
let atteint_destination p =
let x, y = p in
(x = 10 || y = 10)
let distance (x1, y1) (x2, y2) =
sqrt (float (x1 - x2) ** 2. +. float (y1 - y2) ** 2.)
let dans_portee tour ennemi =
distance tour.t_pos ennemi.e_pos < float tour.portee
let rec game_loop game =
let ennemis = List.map (fun enn -> deplacer_ennemi enn ) game.ennemis in
let tours, ennemis =
List.fold_left
(fun (tours, ennemis) tour ->
let ennemis_vises, autres_ennemis = List.partition (dans_portee tour) ennemis in
let ennemis_vises = List.map (fun e -> {e with pv = e.pv - tour.dommages}) ennemis_vises in
(tour :: tours, ennemis_vises @ autres_ennemis))
([], ennemis) game.tours
in
let ennemis = List.filter (fun e -> e.pv > 0) ennemis in
afficher_jeu game;
Unix.sleep 1;
let ennemis =
if Random.int 100 > 12 then ennemis
else (new_ennemi () :: ennemis)
in
if ennemis = [] then
print_endline "Vous avez gagné !"
else if List.exists (fun e -> atteint_destination e.e_pos) ennemis then
print_endline "Vous avez perdu !"
else
game_loop { game with ennemis; tours; }
;;
let carte = Array.make_matrix 10 10 false
let ennemis_initiaux = [
{ e_pos = (0, 0); pv = 60; chm = chemin };
]
let tours_initiales = [
{ t_pos = (4, 6); portee = 3; dommages = 10; };
{ t_pos = (6, 4); portee = 3; dommages = 10; };
]
let jeu_initial = { carte; ennemis = ennemis_initiaux; tours = tours_initiales; }
let () = game_loop jeu_initial ;;