From 3e8da05d1ee9b1d042aa749e1e06d9da2421ab6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Dubard?= <loic.dubard@ensiie.fr> Date: Tue, 11 Dec 2018 19:28:19 +0100 Subject: [PATCH] terminer test cavalier + test de fin de partie --- obj/main.o | Bin 7000 -> 7168 bytes obj/tableau.o | Bin 11376 -> 12136 bytes src/deplacement.c | 19 ++++++++----------- src/deplacement.h | 2 +- src/main.c | 3 ++- src/tableau.c | 13 +++++++++++++ src/tableau.h | 7 +++++++ stackchess | Bin 37232 -> 37768 bytes 8 files changed, 31 insertions(+), 13 deletions(-) diff --git a/obj/main.o b/obj/main.o index 982deb19e71fb45fd96ce0099a364ee379963600..002e6f66c9d75b1012b84d6576ad88725219043c 100644 GIT binary patch delta 623 zcmXw!O=uHQ5Xawae97BocgaV|Za3g5f<5VaNOKUjB9(w&c!=n!EoH^fQcX=kp|n!4 zP~xG>cofBR4>qia`hlc)kY0p(5RdiLf(T76R;cK_-OV57zs&sR4gdXKd0bsT4c%a5 zMfq6|HtJ{F^@H}+<63+CaP3QN?ehU6J?XZvU5|&~2E#2$c0Qp3<IoRla3i%W__Q1* z>L*`#{yW83PIe$nxuFDClC~s~5{%`qG0-wGn=M4EruH{tlX06BLG*GWZga`<t^5Oj zmO)-r6c*b2GC&`<H48W{rgy->OPP};HQ@Y=crO;XE`D%Toad?QToVNjx5LFuE`{q_ zIUl9HU}jg9i$+@crDp`)al$>VCQpv&ui-Abx&;fktuI^mr{-G?f8tJKuHmyezty_; z$e(8nJ!1-%@ReZ=ugaewouHDDkN?GbhPy;xNJNr!h-yGTBAC{xuM&|YEm95Wz8sR| z+zJhIMo_d}t$<I9Wo^rd7!!c+iWNAAy`o3%TGE^3H?c$B#UA-2y0(Xhw!nvW6*jSB zd+J6yKA_?sdldH29roZ2HpyRNhx`Nf$h+t|9vorQ@zf(Neldn`ol&)#1Xzk9>7}xo LmElR7Nl5)aGMA<U delta 505 zcmYL^&r1S96vyX{uDfpTriSj0Leiz|Rvpya8W9La)FEh3SrG_%iy|oK2N860eW$>S z$DmMHf}lF&ss01KcJ0!wOHs2sN)P5c^O^5^Z{D01dbxTQOlSJsxm%+jH#i52&~*=C zHE<$J+vGpGgCjJ*0))go0$KMmsIxS{v}aML7+)q3mW5Xv^HVkT$M-4%M-|7f+z=QY zB(KN!c4`D-N{$k@B$WZW_>we$;%(>+7#_&urbK8E8lEVRzV7?_?zZJv0H4(<%^!7M zk6zLREyU|HZgiyNwX!2^ENE4H&?@ZM8;b|!OXBPMSHuO*>IQ3g7LTE83M5V3)D7)v zKtaAI+<Sdj;ms$Eyjs+R(<8WL<R}IHdJ;QEc6j_Wvivj5v|ti#t|ne{oxwiWGBRd? zf;O|lM<LNDge{hb0`|FchAd@44egXguT;@Fm4!O?`Sl92v=x3;MOhR#)A?{OBB+Wj MPSu2<4xcph2MY~o%m4rY diff --git a/obj/tableau.o b/obj/tableau.o index 6656502d35d47551951fdca5d99e6a56502da20d..71278f037ff174ed6f999b3f36e0ef37428143f3 100644 GIT binary patch delta 3058 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 T^Ed=bak>1i-&9@%Mfd&>wLY$h delta 2310 zcmZ9OduUr#9LLYOX|j9sYHnUPCtH(dYaUJ7be(I$HqF{7xXdv&e03;u;H#BR-Bbt& zYga_*L}~bK>L92San3qyiGzwDU2zYmL#Kbt7n3S<Lj>*gkAd@XPVVmxIR}z+e&5gU z{2nLCxw*3Q_rb}GvN}DJ9ks)5M{L!kgOC;?hDyb|TfF^$4BH#09Q`(U-Wl=F+6d8~ zBy?}6z*kCb&=1qj91X$`PFD8tF#1yuj}ST%e}PBfSl`Nx^n*>~E`69AdEuqhHtCOX zqt7(@i9;1WJ}A1{><@@Au*21v4~jBqg%@a!0mYnY{V4bG3xigoVl7g^v@7aysK>eK zP(^t`_{_zEs@-zEC49s6nk&tVZg;c5T8>3W1;5y+)P_h1wz%8e2T|_~9dChW+y(Cb zo}2kEq1+xc-Fe!J?%1fWSxa=8Xxkb(E@<7$I}kad0rS*`i0L1)i>|F<;DXjm=pVY_ z9}$eIs%XF(Q@EgY9iH~&m7^{2mgjQYD`iFlJfEG|)b*|nu63?TK;irST=2p>-maKV z{mc3zFPna$Jl)7_UehzpDgn6ay<Zu&!;%qJ{#6=7t=AR!#Gi#f{HaDNkhL|ohQ}$~ zl#Mjh$QufL6P+?Y9|kkajmGrySq09<GW0cAiWzJd))>Os$!GDp8xrx`+0Ce0vqcAC zf83~yHNTF8Y?k(3M}51bpFn+3(htEx++b@^-7V2p(Ay0*j^C_(60O1jr>#g2OY{lY z({5CDpxTh=Z&=Tqq(6uDc}f2qF7R9zao1&u-T^dWz*t<>74)!9>v8B!^z>fE8oMO= zI_m2sJqfjh!Jfq|_ek^roaEHbe?(&JmFUN?l<1);NUSv2&lvw*$>%(5=Tt-Wv_x-( z{hW5=-k&787G^lzfb<`UmSKU@3eqUf)@hsueU-r$aZgdA>tKM>d8At;nua}`da&z9 zB)Scba9YN_Qxbg}E^yk3drwJp4bTpQy^rc8iLQj+4x{p?dD!HdME^qlZ%JQ7UBjH# z2?U_l(L;~G$qs`O__m{my@WOIlsvzOMA8^u!LKwiUX<vsrc6GR^dQzThq?$Zq&d8s zf;e0CL@;|CXo}wm60KpDN1-=mjP8>u=K4U=PoVx0>Q)VJVy>?w{~G#h*sE3BVbp!5 z4rfw2>yvz{7_%Ric!dukwKDc0JtXal;_1{S|F5y%FC_nMSjmr)ZhdyYn0l62iRUp; zt9ku4uT|03cNi!NGiiful;~|()@E2p8}Mq{M{5l&b1!XFJAG7K`v<ZGXO)?;zf|B{ zwxAqqJ`5m|%UH|7Tt+*Fg~nhaS9G31>!1V9<qFPCE6fO2RB(0`l>6LJ?kXvZ9vJ7- z>Lko}m9((e^s#}~T~u}@q1;{47(O-cgb6N=1Yy3rq)Y_G(+DE@j5gW)Pe8~RRPsfw lnlwYGFu^Tf*tBNhQ*NDYJ~IiK0<EX$97~yOn(z)|{{b6*6bk?V diff --git a/src/deplacement.c b/src/deplacement.c index 5173933..e38f926 100644 --- a/src/deplacement.c +++ b/src/deplacement.c @@ -78,7 +78,7 @@ void case_destination(pile **tableau,int N,int i_src,int j_src, int *i_dest,int tmp=tmp->next; } if (valide){ - effectuer(tableau,i_src,j_src,*i_dest,*j_dest,nb); + effectuer(tableau,i_src,j_src,*i_dest,*j_dest,nb,*tour); *tour=*tour+1; } else { printf("Déplacement illégal pour au moins un pion de la pile"); @@ -211,26 +211,23 @@ int fous(pile** tableau,int i_src,int j_src,int i_dest, int j_dest) int cavaliers(pile **tableau,int i_src,int j_src,int i_dest,int j_dest) { - if (i_dest==i_src+2 || i_dest==i_src-2){ - if (j_dest==j_src+1 || j_dest==j_src-1){ - return 1; - } - } else if (j_dest==j_src+2 || j_dest==j_src-2){ - if (i_dest==i_src+1 || i_dest==i_src-1){ - return 1; - } + if ((i_dest==i_src+2 && longueur_pile(tableau[i_src+1][j_src])==0 && longueur_pile(tableau[i_src+2][j_src])==0) || (i_dest==i_src-2 && longueur_pile(tableau[i_src-1][j_src])==0 && longueur_pile(tableau[i_src-1][j_src])==0)){ + if (j_dest==j_src+1 || j_dest==j_src-1) return 1; + } else if ((j_dest==j_src+2 && longueur_pile(tableau[i_src][j_src+1])==0 && longueur_pile(tableau[i_src][j_src+2])==0) || (j_dest==j_src-2 && longueur_pile(tableau[i_src][j_src-1])==0 && longueur_pile(tableau[i_src][j_src-2])==0)){ + if (i_dest==i_src+1 || i_dest==i_src-1) return 1; } return 0; } -void effectuer(pile **tableau,int i_src,int j_src, int i_dest,int j_dest,int nb) +void effectuer(pile **tableau,int i_src,int j_src, int i_dest,int j_dest,int nb,int tour) { pile p; int i; for (i=0 ; i<nb ; i++){ empiler(&p,depiler(tableau[i_src]+j_src)); } - reset(tableau[i_dest]+j_dest); + if (sommet(tableau[i_dest][j_dest])[0]=="BN"[tour%2+1]) + reset(tableau[i_dest]+j_dest); for (i=0 ; i<nb ; i++){ empiler(tableau[i_dest]+j_dest,depiler(&p)); } diff --git a/src/deplacement.h b/src/deplacement.h index 2e021c4..00349c8 100644 --- a/src/deplacement.h +++ b/src/deplacement.h @@ -71,5 +71,5 @@ int cavaliers(pile ** tableau,int i_src,int j_src,int i_dest,int j_dest); * @assign * @ensure : effectue le déplacement d'une pile de pion d'une case vers une autre */ -void effectuer(pile **tableau,int i_src, int j_src,int i_dest, int j_dest,int nb); +void effectuer(pile **tableau,int i_src, int j_src,int i_dest, int j_dest,int nb,int tour); #endif diff --git a/src/main.c b/src/main.c index 248cf52..d8b4aa8 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,7 @@ #include"tableau.h" #include"affichage.h" #include"action.h" +#include"deplacement.h" /*main.c*/ @@ -15,7 +16,7 @@ int main(int argc, char **argv) char action; int tour=0; char sel[4]="\0\0\0\0"; - while (1){ + while (! partie_finie(tableau, N,tour)){ affichage(tableau,N,sel,tour,"Entrez une action (c,d,a) >"); scanf("%c",&action); realiser(action,tableau,N,sel,&tour); diff --git a/src/tableau.c b/src/tableau.c index a7eef0b..3c308f0 100644 --- a/src/tableau.c +++ b/src/tableau.c @@ -122,3 +122,16 @@ int nb_de_pion(pile p,char couleur) } return i; } + +int partie_finie(pile ** tableau,int N,int tour) +{ + int i,j,k=0; + for (i=0 ; i<N ; i++) + for (j=0; j<N ; j++) + if (nb_de_pion(tableau[i][j],"BN"[tour%2+1])==0) k++; + if (k==2*N){ + printf("La partie est finie"); + return 1; + } + return 0; +} \ No newline at end of file diff --git a/src/tableau.h b/src/tableau.h index 1a642d9..8599360 100644 --- a/src/tableau.h +++ b/src/tableau.h @@ -94,5 +94,12 @@ void determiner_indices(char *sel,int N,int *i,int *j); * @ensure retourne le nombre de pion d'une couleur donnée placés sur le haut de la pile/case */ int nb_de_pion(pile p,char couleur); + +/* + * @require + * @assign + * @ensure retourne 1 si la partie est finie, 0 sinon + */ +int partie_finie(pile ** tableau, int N,int tour); #endif diff --git a/stackchess b/stackchess index 0816eaf67adcc40d16e83698ecf7e762bb6316e5..ef37a891f0b869551dd442a5dfcbdc3150025051 100755 GIT binary patch delta 8011 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 Lrn#W7^{)Q|(h^%R delta 6754 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 -- GitLab