-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbombes.pl
86 lines (75 loc) · 2.56 KB
/
bombes.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
initBombes:-
(porteeBombes(_) -> retractall(porteeBombes(_)); true),
assert(porteeBombes(2)),
bombes(_,_) -> retractall(bombes(_,_)); true.
ajouterBombe(Position):-
nbJoueurs(NbJoueurs),
Duree is NbJoueurs*5,
assert(bombes(Position, Duree)).
decrementerBombes:-
findall(Temps,bombes(_, Temps), ListeTemps),
findall(Pos,bombes(Pos,_),ListePos),
decrementerListe(ListeTemps, _, ListePos).
decrementerListe([],[],[]):-!.
decrementerListe([X|Liste], [Y|ListeDec], [Pos|ListePos]):-
Y is X-1,
retract(bombes(Pos, _)),
(Y>=0 -> assert(bombes(Pos, Y)) ; true),
decrementerListe(Liste, ListeDec, ListePos).
exploserBombes:-
findall(IndexBombes,bombes(IndexBombes,0),ListesBombes),
exploserBombes(ListesBombes),!.
exploserBombes([]):-!.
exploserBombes([BombesAEXploser|Autres]):-
taillePlateau(TaillePlateau),
porteeBombes(PorteeBombes),
exploserGauche(BombesAEXploser, 1, PorteeBombes),
exploserDroite(BombesAEXploser, 1, PorteeBombes),
exploserBas(BombesAEXploser, 1, PorteeBombes, TaillePlateau),
exploserHaut(BombesAEXploser, 1, PorteeBombes, TaillePlateau),
exploserBombes(Autres).
exploserGauche(IndexBombe, Rang, PorteeBombes):-
plateauSav(Plateau),
Index is (IndexBombe-Rang),
nth0(Index, Plateau, Val),
(Val\==1 ->
ajouterExplosion(Index),
(joueursSav(Id, Index, _) -> tuer(Id) ; true),
((Rang\==PorteeBombes) -> (RangSuiv is Rang+1, exploserGauche(IndexBombe, RangSuiv, PorteeBombes)) ; true)
;
true
).
exploserDroite(IndexBombe, Rang, PorteeBombes):-
plateauSav(Plateau),
Index is (IndexBombe+Rang),
nth0(Index, Plateau, Val),
(Val\==1 ->
ajouterExplosion(Index),
(joueursSav(Id, Index, _) -> tuer(Id) ; true),
((Rang\==PorteeBombes) -> (RangSuiv is Rang+1, exploserDroite(IndexBombe, RangSuiv, PorteeBombes)) ; true)
;
true
).
exploserBas(IndexBombe, Rang, PorteeBombes, TaillePlateau):-
plateauSav(Plateau),
Index is (IndexBombe+Rang*TaillePlateau),
nth0(Index, Plateau, Val),
(Val\==1 ->
ajouterExplosion(Index),
(joueursSav(Id, Index, _) -> tuer(Id) ; true),
((Rang\==PorteeBombes) -> (RangSuiv is Rang+1, exploserBas(IndexBombe, RangSuiv, PorteeBombes, TaillePlateau)) ; true)
;
true
).
exploserHaut(IndexBombe, Rang, PorteeBombes, TaillePlateau):-
plateauSav(Plateau),
Index is (IndexBombe-Rang*TaillePlateau),
nth0(Index, Plateau, Val) ,
(Val\==1 -> ajouterExplosion(Index),
(joueursSav(Id, Index, _) -> tuer(Id) ; true),
((Rang\==PorteeBombes) -> (RangSuiv is Rang+1, exploserHaut(IndexBombe, RangSuiv, PorteeBombes, TaillePlateau)) ; true)
;
true
).
ajouterExplosion(Index):-
assert(bombes(Index, -1)).