================================================
Voici la déclaration de toutes les constantes et sous types utilisé.
B_INF_LIGNE:constant integer:=1;
B_SUP_LIGNE:constant integer:=7;
B_INF_COLONNE:constant integer:=1;
B_SUP_COLONNE:constant integer:=7;
NB_TOUR_MAX:constant integer := 100;
NB_MAX_SAUT:constant integer :=10;
subtype IntervalleTour is integer range 1..NB_TOUR_MAX;
subtype IntervalleLigne is integer range B_INF_LIGNE..B_SUP_LIGNE;
subtype IntervalleColonne is integer range B_INF_COLONNE..B_SUP_COLONNE;
Type Plateau is array (IntervalleLigne,IntervalleColonne) of character; -- convention LiCo
Type Cases is record
l:IntervalleLigne; -- une case est donc représenté par deux chiffres
c:IntervalleColonne;
end record;
Je ne vais pas tout mettre; mais seulement les sous programmes principaux.
Je commence ainsi:
- Code: Tout sélectionner
procedure jouerUnPvP is
j1,j2:character;
nbTour:IntervalleTour:=1;
p:Plateau;
fini:Boolean:=FALSE; --initialisé à FAUX pour boucler au début
begin
AffecterAvatarJoueur(j1,j2);
initPlateau(p);
AfficherPlateau(p);
While (fini=FALSE) loop
jouerUnTour(p,nbTour,j1,j2);
FinDePartie(p,j1,j2,nbTour,fini);
end loop;
end jouerUnPVP;
Sachant que :
- Code: Tout sélectionner
procedure AffecterAvatarJoueur(pJ1,pJ2:out character) is
carac:character;
test:Boolean:=FALSE;
begin
While (test=FALSE) loop
put("Le joueur 1 choisit son pion (X/O):");
get(carac);
test:=AvatarJoueurEstValide(carac);
end loop;
if (carac='X') then
pJ2:='O';
else
pJ2:='X';
end if;
pJ1:=carac;
end AffecterAvatarJoueur;
procedure initPlateau(Matrice:out Plateau) is
begin
for l in IntervalleLigne loop
for c in B_INF_COLONNE..B_INF_COLONNE+1 loop
Matrice(l,c):='X';
end loop;
end loop;
for l in IntervalleLigne loop
for c in B_SUP_COLONNE-1..B_SUP_COLONNE loop
Matrice(l,c):='O';
end loop;
end loop;
for l in IntervalleLigne loop
for c in B_INF_COLONNE+2..B_SUP_COLONNE-2 loop
Matrice(l,c):=' ';
end loop;
end loop;
end initPlateau;
procedure jouerUnTour(p:in out Plateau;nbTour:in out IntervalleTour;idJ1,idJ2:in character) is
ci,cf:Cases;
appartientJoueur,caseVide,aMarche,aSaute:Boolean;
cpt:integer:=1;
n:IntervalleTour;
veutSauter:Boolean:=FALSE;
begin
n:=nbTour;
DemandeOuJouerCases(ci,cf);
While (n=nbTour) loop
if (nbTour mod 2 /=0) then --le numéro du tour pair/impair gère l'ID du joueur.
appartientJoueur:=caseAppartientJoueur(p,ci,idJ2);
else
appartientJoueur:=caseAppartientJoueur(p,ci,idJ1);
end if;
caseVide:=estCaseVide(p,cf);
if ((appartientJoueur) and (caseVide)) then
aMarche:=MarcheValide(ci,cf);
aSaute:=SautEstValide(p,ci,cf);
if ((aMarche)and(veutSauter)) then -- au premier tour veutSauter est initialisé à FAUX.
jouerCase(p,ci,cf);
nbTour:=nbTour+1;
elsif (aSaute) then
jouerCase(p,ci,cf);
cpt:=cpt+1;
AfficherPlateau(p);
veutSauter:=veutRessauter;
if (veutSauter=TRUE) then
ci.l:=cf.l;
ci.c:=cf.c;
DemanderSautSuivant(cf);
end if;
if(cpt=10)or(veutSauter=FALSE) then
nbTour:=nbTour+1;
end if;
else
put("Vous avez jouer une case invalide, dommage c'est au tour de votre adversaire");
nbTour:=nbTour+1;
end if;
else
put("Vous avez déclaré une case qui ne vous appartenait pas ou une destination non vide, dommage c'est au tour de l'adversaire");
nbTour:=nbTour+1;
end if;
AfficherPlateau(p);
end loop;
end jouerUnTour;
procedure FinDePartie (p:in Plateau;idJ1,idJ2:in character;nbTour:in IntervalleTour;Fini:out Boolean) is
n,n2:Integer:=0;
begin
Fini:=FALSE;
if (nbTour = NB_TOUR_MAX) then
Fini:=TRUE;
put("Le nombre de tour maximum a été dépassé; c'est un match nul");
else
for l in B_INF_LIGNE..B_SUP_LIGNE loop
for c in B_INF_COLONNE..B_INF_COLONNE+1 loop
if (p(l,c)='O') then
n:=n+1;
end if;
end loop;
end loop;
if (n=14) then
put("Le joueur utilisant les O a gagné la partie");
Fini:=TRUE;
end if;
for l in B_INF_LIGNE..B_SUP_LIGNE loop
for c in B_SUP_COLONNE-1..B_SUP_COLONNE loop
if (p(l,c)='X') then
n2:=n2+1;
end if;
end loop;
end loop;
if (n2=14) then
put("Le joueur utilisant les X a gagné la partie");
Fini:=TRUE;
end if;
end if;
end FinDePartie;
Et voilà les ceux qui gèrent la validité d'une case joué.
Ce n'est pas très propre au sens où si lidentification d'une ligne change par exemple A B C D au lieu de 1 2 3 4 alors ça marche plus; mais je ne me soucis pas de ce problème là puisque j'impose l'envoi d'un entier.
- Code: Tout sélectionner
function MarcheValide(caseInitiale:Cases;caseFinale:Cases) return Boolean is
test:Boolean;
begin
if ((caseFinale.l = caseInitiale.l) and ((caseFinale.c = caseInitiale.c+1)or(caseFinale.c = caseInitiale.c-1))) then
test:=TRUE;
elsif ((caseFinale.c = caseInitiale.c) and ((caseFinale.l = caseInitiale.l+1)or(caseFinale.l = caseInitiale.l-1))) then
test:=TRUE;
elsif ((caseFinale.c = caseInitiale.c+1) and ((caseFinale.l = caseInitiale.l+1)or(caseFinale.l = caseInitiale.l-1))) then
test:=TRUE;
elsif ((caseFinale.c = caseInitiale.c-1) and ((caseFinale.l = caseInitiale.l+1)or(caseFinale.l = caseInitiale.l-1))) then
test:=TRUE;
else
test:=FALSE;
end if;
return test;
end MarcheValide;
function SautEstValide(p:Plateau;ci:Cases;cf:Cases) return Boolean is
test:Boolean;
begin
if ((cf.l = ci.l) and ((cf.c = ci.c+2) and (p(ci.l,ci.c+1)/=' '))) then
test:=TRUE;
elsif ((cf.l = ci.l) and ((cf.c = ci.c-2) and (p(ci.l,ci.c-1)/=' '))) then
test:=TRUE;
elsif ((cf.c = ci.c) and ((cf.l = ci.l+2) and (p(ci.l+1,ci.c)/=' '))) then
test:=TRUE;
elsif ((cf.c = ci.c) and ((cf.l = ci.l-2) and (p(ci.l-1,ci.c)/=' '))) then
test:=TRUE;
elsif ((cf.c = ci.c+2) and ((cf.l = ci.l-2) and (p(ci.l-1,ci.c+1)/=' '))) then
test:=TRUE;
elsif ((cf.c = ci.c+2) and ((cf.l = ci.l+2) and (p(ci.l+1,ci.c+1)/=' '))) then
test:=TRUE;
elsif ((cf.c = ci.c-2) and ((cf.l = ci.l+2) and (p(ci.l+1,ci.c-1)/=' '))) then
test:=TRUE;
elsif ((cf.c = ci.c-2) and ((cf.l = ci.l-2) and (p(ci.l-1,ci.c-1)/=' '))) then
test:=TRUE;
else
test:=FALSE;
end if;
return test;
end sautEstValide;
Grosso modo; on peut dire que jouerUnPvP est la procédure principale.
Voici un exemple d'exécution:
- Code: Tout sélectionner
Lors d'une partie joueur contre joueur, le joueur 1 choisit son pion. Le joueur 2 commence le jeu
Chaque joueur peut se déplacer dans une case voisine libre et peut également sauter par dessus un pion dans n'importe quelle direction
La partie prend fin lorsqu'un joueur a mis tous ces pions dans le camp adverse ou lorsque le nombre de tour dépasse la limite de 100
Lors d'une partie contre l'ordinateur, c'est au joueur de commencer.
Voulez vous jouer une partie joueur contre joueur (1) ou contre l'ordinateur (2) ? (1/2) 1
Le joueur 1 choisit son pion (X/O):X
1 2 3 4 5 6 7
---------------
1 IXIXI I I IOIOI
---------------
2 IXIXI I I IOIOI
---------------
3 IXIXI I I IOIOI
---------------
4 IXIXI I I IOIOI
---------------
5 IXIXI I I IOIOI
---------------
6 IXIXI I I IOIOI
---------------
7 IXIXI I I IOIOI
---------------
Quelle case voulez vous déplacer ?
ligne:
1
colone: 6
Où voulez-vous jouer ?ligne: 1
colone: 5
raised CONSTRAINT_ERROR : mainsautemouton.adb:157 index check failed
Dan mon code, la ligne 157 correspond à :
elsif ((cf.c = ci.c) and ((cf.l = ci.l-2) and (p(ci.l-1,ci.c)/=' '))) then
de la fonction sautEstValide...alors qu'il ne s'agit même pas d'un saut mais d'une simple marche ici.
Le problème étant bien que je tape hors intervalle puisque lorsque l'utilisateur n'entre pas des cases correctes; un sous programmes fait passer un message d'erreur qui fait passer la main au joueur suivant.
Entre autre si je fais d'autre combinaison, certaines marchent:
- Code: Tout sélectionner
Le joueur 1 choisit son pion (X/O):X
1 2 3 4 5 6 7
---------------
1 IXIXI I I IOIOI
---------------
2 IXIXI I I IOIOI
---------------
3 IXIXI I I IOIOI
---------------
4 IXIXI I I IOIOI
---------------
5 IXIXI I I IOIOI
---------------
6 IXIXI I I IOIOI
---------------
7 IXIXI I I IOIOI
---------------
Quelle case voulez vous déplacer ?
ligne:
2
colone: 1
Où voulez-vous jouer ?ligne: 2
colone: 3
Vous avez déclaré une case qui ne vous appartenait pas ou une destination non vide, dommage c'est au tour de l'adversaire (normal puisque c'est le joueur 2 qui commence).
1 2 3 4 5 6 7
---------------
1 IXIXI I I IOIOI
---------------
2 IXIXI I I IOIOI
---------------
3 IXIXI I I IOIOI
---------------
4 IXIXI I I IOIOI
---------------
5 IXIXI I I IOIOI
---------------
6 IXIXI I I IOIOI
---------------
7 IXIXI I I IOIOI
---------------
Quelle case voulez vous déplacer ?
ligne:
2
colone: 1
Où voulez-vous jouer ?ligne: 2
colone: 3
1 2 3 4 5 6 7
---------------
1 IXIXI I I IOIOI
---------------
2 I IXIXI I IOIOI
---------------
3 IXIXI I I IOIOI
---------------
4 IXIXI I I IOIOI
---------------
5 IXIXI I I IOIOI
---------------
6 IXIXI I I IOIOI
---------------
7 IXIXI I I IOIOI
---------------
Voulez vous ressauter une case ? (o/n)n
1 2 3 4 5 6 7
---------------
1 IXIXI I I IOIOI
---------------
2 I IXIXI I IOIOI
---------------
3 IXIXI I I IOIOI
---------------
4 IXIXI I I IOIOI
---------------
5 IXIXI I I IOIOI
---------------
6 IXIXI I I IOIOI
---------------
7 IXIXI I I IOIOI
---------------
Quelle case voulez vous déplacer ?
ligne:
1
colone: 7
Où voulez-vous jouer ?ligne: 1
colone: 5
raised CONSTRAINT_ERROR : mainsautemouton.adb:151 index check failed
Désolé pour ce post; mais je dois bien avouer que j'y comprends plus rien là. Le programme marchait pourtant bien tout à l'heure...et je ne crois pas avoir rien changé depuis...
