From 963202a6d3ca31e9c48c0e1d599cf50059f50269 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Nadal Date: Mon, 28 Dec 2015 22:09:03 +0100 Subject: [PATCH] Import release 0.12. --- rsc/.DS_Store | Bin 0 -> 6148 bytes rsc/boite_intro.png | Bin 0 -> 7287 bytes rsc/boite_match_nul.png | Bin 0 -> 14067 bytes rsc/boite_victoire_jaune.png | Bin 0 -> 11421 bytes rsc/boite_victoire_rouge.png | Bin 0 -> 12400 bytes rsc/pointeur.png | Bin 0 -> 529 bytes rsc/sp_pion_jaune.png | Bin 0 -> 1977 bytes rsc/sp_pion_rouge.png | Bin 0 -> 2617 bytes rsc/sp_plateau.png | Bin 0 -> 36638 bytes src/.DS_Store | Bin 0 -> 6148 bytes src/Jeu.cpp | 750 +++++++++++++++++++++++++++++++++++ src/Jeu.h | 43 ++ src/Makefile | 39 ++ src/Makefile.deps | 6 + src/cintro.cpp | 119 ++++++ src/cintro.h | 50 +++ src/commun.h | 35 ++ src/config.h | 25 ++ src/cpion.cpp | 83 ++++ src/cpion.h | 54 +++ src/csprite.cpp | 175 ++++++++ src/csprite.h | 87 ++++ src/main.cpp | 33 ++ src/plateauview.cpp | 353 +++++++++++++++++ src/plateauview.h | 95 +++++ 25 files changed, 1947 insertions(+) create mode 100644 rsc/.DS_Store create mode 100644 rsc/boite_intro.png create mode 100644 rsc/boite_match_nul.png create mode 100644 rsc/boite_victoire_jaune.png create mode 100644 rsc/boite_victoire_rouge.png create mode 100644 rsc/pointeur.png create mode 100644 rsc/sp_pion_jaune.png create mode 100644 rsc/sp_pion_rouge.png create mode 100644 rsc/sp_plateau.png create mode 100644 src/.DS_Store create mode 100644 src/Jeu.cpp create mode 100644 src/Jeu.h create mode 100644 src/Makefile create mode 100644 src/Makefile.deps create mode 100644 src/cintro.cpp create mode 100644 src/cintro.h create mode 100644 src/commun.h create mode 100644 src/config.h create mode 100644 src/cpion.cpp create mode 100644 src/cpion.h create mode 100644 src/csprite.cpp create mode 100644 src/csprite.h create mode 100644 src/main.cpp create mode 100644 src/plateauview.cpp create mode 100644 src/plateauview.h diff --git a/rsc/.DS_Store b/rsc/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..aed5ec9a80839f26ed18966515abb69fcb0231a9 GIT binary patch literal 6148 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 literal 0 HcmV?d00001 diff --git a/rsc/boite_match_nul.png b/rsc/boite_match_nul.png new file mode 100644 index 0000000000000000000000000000000000000000..f17467bb43f58b0e66c17edc75d873f99032c1a1 GIT binary patch literal 14067 zcmXwA1yoy2(+*x7D!3I&k)kb9yinYWySuwvh2l`4NO36cL4rfEV8tOoa8fk5JOAbV z&VLBG$-TR?yR$p9JI_3cP*s+}$DzOhfk60jvXW{b5DEhLeEtLzcweVH$OkUy*5XRy zAP_hX_tq2x_>O6&AR`HSc>K$0D@p|JV7tibx`RNtPapqLCKiKkfty$!a!OKIW4KR= z-%|f++_nUP=sgF*vB@zH!Xwxc_6^N~~B@cM9_S#sG@y zLS~DkRv1WKneS+%1ZNGmTY!j(lVH}gOL17s`mp*m7-JO5DJX#44?FskeOZ(WI&cz(zioIVK6cAF{qo zjk^L~ja{@uibX{zY|tp6{1}a+jK6gY4ZoUf$&q*z=^D3#nVNrH;8E(hmxq_vPT#)4 ze93{caIB%CTVybz#FY;J&Y61dv zQclc}=OluD?6-?Fjx&UA`+o)K@I5M#Qw^CxXLa|OJb9mj8R}-lj%OMCGOzZG7h*K+ zVPC_;S&dnfCdx`;j$S1xZ=>vXHQ^TisdriwR~Xl8Zcm;3eN_w$a8%LqgvUM95e z)aNxHqX#{Gse|4CHxm)3gILhodzc}Zpf8SEyFtM$QC;!vJ`<)?75Bit0cfn9kN>ht zzk#4ng^C};MEi&^)z^57R5Fs6ux+Xunt#kzId)4hg8qL356u<6 z`_N$)OY>}?t8;S8mBj+ejPOLla@`G?9vehf>V)BIJ04OcW{g-eX1kYk&K6pfPe%;x zbg9d3&&L#Ux6SgIw4TUq(u{8Xd+^6(c(})<8}1AE`}j(_)sc>()cY~9*5%;`r{a%3 z>iVeY)~%p;d}071x*jlIObC3)9+;2rlZLt}JG6e(@$MDe7LTJ9;$WAflT`BjDOZ2-B%qU7XsgJT`k2goS}LErqp&yLD7x!!Qwa~7^e##f>j@Rs0ZTX zgU|vGuR~`S$@}4`Fy|{WwQbw{iOK(sKfs_f&NBMw18y2+B|HTGU?B&~EZ>woJku;e zOMcocfhL^&OR2hIjeksHz{rd1W#cOyEq!K*@-m2@Up2n05iUy8i(@M36_u))sL=YNT%dlr)PC@*H1;lB zE+}h=%$6MJWqa_NZ09FD2Zz5L{>6M1rHjkgX6BQ4mYN)7x;hE9%&b;0H`b7GHrI~ezRqBJ&j<}c#-d}aCQ z&J|IceZ>a)DKn5-{50^E18FICMa{~gYxFLzBq8t;N{FbLwY*+lm5y4Pf_jof^zYUZ z9yA2(cN)%L-m%b^wOY}r^L{E6*huMrR`fx!*F0rLa$3^XgUnh{GKwtxuDi9c;2WcP z9=(YRGY6)bo}JFy*LgKv9~2cnr81hAqQ{8|tz7XgQnTAc74xSrmXXksPO9M&U=d_@ zj&0>5f*PC--ds1O=ow8;Jhd7~W$graN_JM+#!UV0V2Z3rZ#gFTs~|#$7o)s!W<(U< z#-;PNkkO1@;OkeJ@2-daTwY6KVfRZmV=0mxY-f~odK6vwY~+(q>o%KEKzRM@;hibT z^o;9na?E*lwHIS0Ih>!vpMY}cs7@J)Fw6llXknx1f#i~s4(|$gYQRj95f+1*amJv^ z3;l&)R0OHD;(Vm$v`ChssZCFSh~x0t*1iq<+>yfc&_a~j2Fs@clXPy)7ml*SpS!KA z55`PB#rm!sl2cJC>R|4RjIy6k?H|PW;beXM{p`Jq&n!61&07YSkArGi;n2hXHb&%= zK}S=W&1bQGVa8HPQwX^_Z*$Ozo_6Ofhb*;7(x0V|MO^V2uEMe4qH|~#vzNm*7(Wd$ z@cdj@Xr%;Qj7KmcFbvZb;VIGx)SAC*qj{J$LG8nQ26VDBmc5M;H>lvRdY(L#&zwHu zchS??lZBA7oR@-pseigvI=&s{w_@7}|LOuh|7(ggs680V*?YwtN)>G5@sv>P?rCfm z>%Gp}f1^~NwNkVw#E6kld}Yn{wJ*#11XorXXeb%wWVOhc_43j`i;~%H<&9_7Q%%8w z++6l8dpg!Py%fhh@fn?+-Q9(bfChY1!WRuT0Y%{u^rVUSDvIx{>z%wDQqQx?$p;qA z1b&S2d(2vxtjOb>X7Zor@~Szv9CR{t7baxP+UsmUk$wi${`3Ng>hi)qJp!stBJFTx zkx%Eo@*4Qh&kJAc{VS~SKo)YGUX->4-1ujNt&oL1qxKxPzrG%}A77^Ig((?k#qPb{ z@)f!NO#f3tA+tzwI)u@j{;MmgW-FAY&B>2i2*c#JRyVlqoXSgmhvVPn6^@`v1ncK6 z#^(_vn#Ylny~S!IFBrsF1ymw#^IWi{@+OX-M&n=?JIUuve?iGA#V_i9#mew(fL!=~ z7v!|K6t=I)KI{82d+&a+Oz%s(1wAXOa+ut|@lFQoQ@$bWxHi8V|Ge0OX7jJuk2Qc9 z)_v>FLz?i|vq{sZzWK4wMymL$<`c^KMAm`+&o(!e?G$}xd!-UliUPEC{7F9_h0+jj zahyu{Z8R3m4aWKX?(;s_Q%!Jb7QxB1b~eHF({Q)l*$KpZaHuTqph57jVnI!*bXVq6 z5J$@{KIkQg7xWy2V+JM)2{xRqyi3O->e_X{bZ$Lr5H}WN7k7-u+-=^rQz>J$J*TGV z0j6Wtb8=eK*i)(Qr-nniE8DqTu{eL-VF$@K6;1~Q6DupKvom|r`z7=hUQioIqPR?* zC@K);4^@b7>+vAP)bt{`M@=!R!=lDzbBEoBAX1>iKg(FyV(KuS0SeRRMc$Gy06N!g zoPbB0gT;ExKm;h4+{zg`-;1*J!m@Aku|-6NeU@)HKsMdTD({t=A+^g9Z!I*RXSKC4 zjmLvC}{XzovtH-%Xt?vi+bWhn-tKmc6 zX`ipe7Zi%jO9fU^1glksE1Q>4G~;R_Q{2kwHW3A-wkZkiG95}maVg@q z=uc@j%yQ!njE(b^-aC!8WsnP+*S@n1kvfbw%R=#NPGMFA2ZhWo0I{7l68TlS6Duuv1PXh{3atI(UV4CU>)a zOEC+7kk3ObZ@z;9$Ql+<7u*z{JX}|aK^MI{o~ekO9bBF_jDmbfLzH{WjHQKxjK_4v zHO+*7xf!_1>TB8_jA9xp5lKiURk7(uGck31zrSbT@*Yb_@K}wA zcDK!(<+p>kbkSaR_?a-Hx9#FPs9c=wT>E{nXiUR$JO5UBE)GA>+X#`-IqlB#3#X63 zDhD=-?iAXaCZwG`eW`(EgIyv;I3XpZU%pMbz!-sC*e!F^4^4Ltq7Ay9OmV&TU~uZV zQvz|KJ~3S%)axy0_>!}Xo9-mOvD&y-l>*yc~@13YlpWrmuwXavgTcGXSUra#- zRklHB5))O}9E?Bf>}KWEMi{u%=Cno647?wd)5oq{9C9$#`p^E=_!tpaSDa}5WROPe zcBrG1LWfgXrMBtCzS3pC%l?Cnv-iVl{i_|T$U!r7 z9{$1l=Y|8m^8Zq5SjaC@515?r4@v-q{f9Qy^6efGa?lJ|<&eq46wPhT_|^&5V!b_Nos!qS@k*&PS$pdRu++||qWdUW^HRIk0vMCLf+EbAzMadgK8d0+=!4LyLX zD@eez!Pp#VC3L`%WFlc1Hf$)h?J-4B()YMw3I%z~C@9-Drp_4sov-2&Q!&ya6s!xYfp7|9=mB-lLa;d58KP>E@(xA9PV2>9t80S_*Ms)uueAt z$AOt1_)iZwC^)rNVqGkHRXA4LM)9lwUdmImjTPQpGBkbUz3Aa77rVST9%;yLn5n&4 zR*~K;4-qzh>~aDIBnu4JVuKL3?B!$VG@J=yXgALGRa&$I=hc(o!(2i~=)vuXF31ox z=pS@oSAFumiv(lKXgXnr@CwkvEVzJFMupMEgX?pI1*^5_7O*8Z3+bKNIX7$q9oZ`5 z!;euUIlF|fJp;}nv03saHXds5mw%Dqs^x|C*$rw7z>SrDfW0$nyY?z}>~&J8s@V&L zPzs&pLrO`oC@7uLT+qcXJ2{WW>xP0d^ls@3=c2%V-BjaE+?>_m}URU z%$k3i;ap$8xNJW*`7X3OEG!4((s4fMpS2bc<|L`!8jb2?o~s!=9Y>+6>>HRd7(xRVQsPxwtp5RTq#x?aD`Sd@&V}kTNL(On;E$w`)SXYA|;kLEqj{y zpt7S}!ZvKWJm->4LyCzA|<#bd0K|PmQN=qyRXkT ztS}#2d>xXjq{kJNTOF&vv%cA0*_c_EQCZM%;kfE&ar2CrSofqJOc z#k$xm5VXo@hFJFW^!&cJ+ao0@xr7e+X7<|s!z?|fUKvDxj_*OChZO@k(~wtKD0_nT z6aY~EAw5#(%2U>#E;@YehN%4vA7(sh^WSu+3DgR+3{UV7E39O8r z%l2=10@a3ACmAV@o#+d;H9tt2KqcZ1X6;yX+aT$8V1Py$CTwm zP+yPNE-9(e2qK9j@->8yInkDxllW5|pERx~uXjP*+c&8I-C!9r-Hr7iT1aVh@v#OQ zBAaK27$YAjFXl|({4@_=IDKU#C8wFHL+M8{ba8LMO}*uL956{bsN(^bL)1;OGtfdH zYT7AUYIaBPYCQMKfR@{rZoZC(5i?gPyC=tv&n-%}TMRI|PdSdzqss;o8e5cuw~c!r z*7uy5LaE{$djSclAK=l$B-(DM%_tVC8Kz1`7oP3`u4FJgg~zAWf8f!)Q3d979pFB# z$WMNJ`-#JIG;zzT)>_1X3E`9v&oa|IV09bovCOj4&9kh(qTSd`kke9mM*PY3XXktK z7%fSDOfhykA*F2H(vA!93O;_Z6veFWs-QFDuOnQ5Z9GL`d;YRWOM4VozdnRbi}>cn z59gl-wh5n8!^0y7FGA^ei>IgEyR^)67C0R^r6R60`{lb!ae>1h&z1u{eIBbiW?RYd z+EMTaR?BIvR{WY+4Op;H{9bVAX=7qyhlFsD%GlgTNlDG(a(QT4e0TF+p2bN~<-3QAG+D8#g=fWujo2{AvMM>hs&_Ut7`>3jKgzfpc!;XUI+O?{%LIfcA&xqrlyVl>; z4HyaEH-JKPc9lUf->nxaZ~sBr){aIoGBxPw^~}1~VV{R0^gQu<%(5}7@%EGD>yVxz z_;fKow;h<7JV24WE^(ExUsXQ0$ZN#@zRJf>J2{x}*Ru_jMJV~8e4@Bu-Yp9vV&azu z1e2yDb~ancV17zW%xSmb74x*QkD|yGmh&1klXWyZh37ax$sI9L=s6 zo@;kpWHZ|%Kj;&pl@2H`WbVr|2nytgjLF7*p&uQ=EJIJ8fN91WEBW@@=aY@>WgB(O zK0g!F`$|33YjZOuaw0o@ zN?30+(`B6=>^IaDmIrzA;>%BC_5BG{=O5P0c?)U30Aj)GCj#EaWm!|x^lwe$*t7W!tQ#1RZmr2o&zsdQ^QLA7==SKLvL#v3k*4dI` z#-qesESr`9Srx%&>7q1aFydQimAe_r&90n%6|f|ud#@K^tU85E$RCQFzL@8r-Ic%b z>R`+_8)%e>@Se7dV0hDp*w-%!Is!z#X`@t8ED@tQ0#i7&1ZX{cv7fitj9;EE>wF*d zvSDw~XAyW(&yGA^fRqsphR()X6w*6Yxzs)Pg%h9dof>TuM>mq0A_L!0VnW)NeiP#|8W_RNe^}8rB z7+*HiocnlTbP$7Dd7W+>)8pj1+kTc>5aTW|SsprT^fi}%sMIk`Idad%5HAauJl45! znk~>AGA^o%twQ;K03^ zAi_d)D4N5dyS(MX_rdo{4xElnHWXYazDF@2vO|{?m0~6xWpu4`fhlMZoX;_by}L zi@m6AA~jQXT~m{C)uvtP5IrQo=wVZ%l(#_t_+!8c^m(PO`Ld8!E7V3^I*p_3)~0l5 zBOgnrn8r}F3T9-`&)&OqU#YS0&#(RAPf9CftWI~l(l~jaa+#Z9*nLm0(8|3Exe>$C z27~@Aocm#ZFP;8&!hEpO)sExU-AI#M%6q)Qh-vH59e>3o7pEPZbqFE~W-5K&YhU`c z?rwa4D3h?>u-d~maS^OvFkES|wjtP-^@d`=Y<}JSx=y&1v=S9X8FUBUUxOEG14^+&)u%q_@_|-H={WL)s2b990?<~Pa*VTlZIP} z{U}HaS=u)^!j;$cSb*P|IkD@s^Rw4X9L6B6r(CPl?+eRjZBOL+zCWb#x=&y`M0$!M zhN(B}DhV9kRho%=?EX-SC{n^=R(=Z1YiWXDMZbJ6TzE7|em5gOR*c}fbdZ4)RBzZY z`w=~6a|r(!4+>;!{Gdq+RIIOX@`jaea=GqnDc~BmwnLm^Zq9;JzCYg}t|R(s4MrOy z|DD2k(b;qft>3JZZ4ELy8jY@d>w{BHeShJXQ)#%vC6``*DcP;l)3uvE+Ep^_1U8?Q zy0a5#>4MFxL?P2#8>Nv;ogy{;fO4qUZT_yzt9T8fj+}oPLzSg-3UIT%69I8fz&uya z4A3^+Pj;?q>kBdHTI<|s_i3+HLoc;od?Y5iER&WzO=4QV>9?MVhH@xejjF0USqUEmuF{^yT7 zt8Nz9AWe98qVA`aSf6NtLzQp39+z` zCU!+t?}GX2?9p?2fRpVCsHAv5j zz_{q)k8pXDHEXzi^Dexgq8&~7%0)?=V!W`o)T1JkKmPB5yQ#2tJtW5deO*aciLopp zwf;`4Qjv9iM|y%WPl6Or!oyUc(PW`v%DjE8AY@*xBHevG5tG5O)k}0{>#U8$80kSU zcQj3_=BaWK5qJflF#vQwfm8{!-xLWCxskO;~pS0D;_dwh<*I;KDWX-?!@0^z`dq8Ct3C z%lDw1)fj%R<%utcy-~6iMlrt>ID3VH4=%p6O9By7Vx)2Xc9PJ66Sj)zj`+bEqYjN@X%XmA8=fwL*P<`f`M^n_eeIZM(ax5xiw zCR9=hzp~%rRP8X>@5b?)#7m%)AKsRvBrrY4Fkj^&;Ndlu_%xO_U}9&7b0Amb>L?ha zU=&3Di!g|2U_`ktU{gq(DG5kO{)kLXzwWUX{R&MnhADK0=)DNEeIK3l{X@B?(u_sz zwWvHFE@Ps&KJ&NpU*xBSYS;HN6cmTQU%WXSUFCu>K5cZh!W?E`coMjRmg?vzwRh1@ z>M;=kD1jMCV9>YUL94{s9u9RN;hkf98~Ftuy0b+Dvdo1Gv=DjN*XUYAf1Yz;b2L^` z;*0VwQ1iJs<>8o`TIq{_a(|kja7fE()N?){$D^#6vvGIOhdl5l)CydGBW{fWgpA;t zOak|n%9gRywJ5(I_@NR}pJ&IUGch;%Ua@xMY z2=t)Yg=o&Y26MJ@WhD~-d*A4wRa|jvtp5aN5S+~3UHm>;Psz2YZTz9UiLTyD_VWa< zM~_JREqUA2f~Z(rRkl!A#Wv6V31iAiHU&kFMeWwr)oA?24`v`-imyo{I0x_lko22LK=R4;Btz{-eD`NzQy9|Ll4FpAzG0u3us0IP;hAw9sG>6&koPE@5Eh zvm|QO)C{8RjW#MMSxM1kPDYHv!wZOFU$8{+ArRh65!bcW>dgU=J=gc1RYU7&q%9h;K|LQDEXJ_Kp|89Pt=Z4C_( ziVo&lc^)W)r5_d6R#s8k6tg#6^C6?6gu88j!h<3>@Lu@5zHTL3Pag$jublDcwn+4a z%@WWP&nE%cy$V5xXrM76Q*wnCGrIGq7VmIB&+mz96}YhL7^f*C2$%eD9~`gT40L9# z_l^*sH>iPG4EvCxD(v-e2l`80etK@y{e!^-e5dW8KqBO6+o`^5SdrORiUkRxlB0te zU4V~V9pqjgZApYxsxp83OYM!G91Mhf)IaG+Bg0z{zpxNRbtmv>QJ44ZSRn49=cep` z>^>XtJs-RjG*4=pjSWzt|C}vFf2sQl71ZcpLRWnYfFL_L==G{Se+<319U;(jliqcM zNhd*1-92;u*K;~{5IdRs%O3PB2ZyP+@za(L%CY%JY=f?vz+kv94(SMS`c5@hk3>BO z)OC*H#)QS4oK`V%aTI~w3Y++ncy^`=l3ey-_#ylXXo;vlpSCJs?b$?5k?~JeO*Sp2 zA(B8Yt&dUN8Fhi>U+Nu_Ip(hFW@I)uTqZBy?>jp8b>R|QjRHP%P@OI@=o_bzWQ^<5 zHocN-$sPmpl93XJ5!1fqg#2qT^YgAE4ue1Gt6b8X8zHJs46E9Af~5hhQ1dWwB964< zN@>cd^$BBoZ`H=8J1VzHC2Mj$qy3H0FfV)h@Q{-mQQ3|?qCHpjNu-~PLsoX*5mcJ) zIVwqIA`o)FS)Pxk#M>*=o}MWqHGPr_eOh{N5MR{D<5XMP&gY5#Znq4>?3=_aA8%-f zjm;REt4LXCL^v~Hdjq+Qa@Nme)z7z9utDoc1w^U^(99$s`z579M=p`p$neW)SmDE> z??!Z$uNk0JfCyL5^z`H!XeJXtu{@;!TU8n6cm zAJz{yzD}P;I|}vC6AUbvF4u(yo<=p0Gwga=v4aXHs*le6K(KplLeMvfE!iShzD!s{ zX7JX_rC+OXrED~(pdmP^{%Zc2V;{}=(^DqD(S+od>NScJDRk|OY&iBMvrm3K zTW3o&ko;^uhuqV(mOsUIvL|AqX;4-8dWbh#BNJnm=Y^d>DpvVp5%hO#-j% z>`nvizfs}?qhc}@^H&ceg_5R2pXjp@m>LwYv=A|8`e~y{R2$85#L5w1cj`4Whk|+7 z&`l8T)Z098YwORUrh4QMY5=>DY3Ix>PNE`IR@oGho}C?y#{K=3V)%hs6=eU@_b?oT{3K_DJ zdQXi4#Fe*a$^LLcAlH}YfZ_8VdSdrBZCHu;NO!MhWK9a7zzWq#O{mNFSZ=pUGhW9b_S@xCh}0+ zMBc&A2mJtGP8dgl*u4!)cTVctu)T~axTta&PsGPu#p$K*fl9gRT2Hk&yCBq8LPII$ znhH_(3;!Ztv~Ms1&JSxjMOCrV@C`MZ!>+F3->X8DRCq)|cZvn0Y5G+$F^;K+8R|R} zlhXXs^#=c4&;x)4<6Jg>qX(TnjMJ{8fBLfkDP!pkm<0XZ>+xbVRagF{Fe>KY1jQf7 z7q9`~^!1lN_z4*!pZwOaq3!H#Wg13r)RuFEGUB z+7~YZ9=+QN@@Zt+n}^-e9|moLMZc4DGTD^fw+p7&_U&=*oaDRKPT-J+rLHTuUitnm z&t8kurtQ8`ImsjQJCE+qENySEGzeG&n9R^)&*|5{ z`1u`vj3}_Da}ObR^>TYNsf8@%gxtup6L*Dbtdw&8!?$0KC2)fbj{6yW+`BPBQJTYV z7~ffuXM3j^4w2Qdm*t^cP&d80X{U~$JDaY;O!Izp1*n|lXn!J|1JFoYn%&@^V_N@K zCTad$IO?G(&2uzHTiM&N$_PFk2eO>NASLM#(Uue!yPb*(xS$h_6ep{hw~YPo!C^C{ zHf1xZ$~jy_09gI$N|e98qRpRs9?nXeoNrjol|@FRt;m+9fUe3__%nW+FY zZyAuC4j;H}4_*R)~UYUZ#haF;_RD#xEhk^v#w2c z>>PfhrE^h=$u$jw(gAbP&fLOhK3=$d@AxG>qQ45Cf0I<$03xAH#-+tU*KKTKN-0 z5-lG>$ey=hiv$Hc-LVD`bxeA zm{DXM?|(lmwv}Qy630TBzXMdQ!j2pN-{QtkucABOfB49d2vD~^jGP06v4!T$P9K(M z&QpV{n0tR#O{pji@F;|ww?67~es$#z??Ah2n`d(l@=@2w>{@w`_yZ8qL zz!0w89pn7~S!edoCQU6AzmAWqV^i_oZk=98DouOWoWj>X9|eGb+TXI6dfyi&hXKVM z78fj8E8efi$+o^s*YRmf4&v`~PbWbL#AV5EWh-!ZSk?tFYo#p)!4`w07lL5Zf$N(~ z;DVWBy?PJINn7u~Lt6Fn9ol(E7C6raG)4sKN53>K>bTRl$LZH`UAY&%Ex0&z8)uYzHOG~}?3 zcN-UGr~r8{fn^a;r#crzuyB5~!Ygy_4AjJ5hZR@M|E9soxjumQvGlUcocB0u#Xs86 z^|ck9J1$hNdh7@w)2|q;pY*<0?b{{VK|Z@$l^CQ=zZRfbj9}@ybZzpZo7b3YW;XVf{DE0@t+TVwlAI3q zZ3eEE0DDPo=Z8{0X|QE{V0N%&Rzb*JIjVWfyn#6BA$Q22to;FGUz?^=&bC-iNOipe z_0D#_wm?<^BCA`F$$Z+d7{^*ne=O2ZY38lbcQL9pUcX`5_(l~#0Khv-QAbUoJ_zai z;GxmTve0Z>!O}=w-)OtwYFJh0^>UdfYF8Aw#v74+rncxZ5PqeJ2hgenvWqIxVQa9x zz==J(XA>?XUPnTI@0r)%{3UPv@)C2NZ`G+`)*F7cWn@VJ&^CY8`Hc!xyel*(n=D+K zZV+r0wZvI5&CS3M+@;G91+zbqz49DgW0X= z$pg?N047vLyx(1z3g2rz4+kz&{W}gV+Cll}Yf69GKYj)D)f>w$B1PUcz6hQz+~O~~ zWg(q$-ggVE)nvCNvE7?Yl80FtSJ+ly%Cm}4pYr~Y6!;m9G8-h`yJN}Uv-43`Wdfkx zcrBS!dIL2Wd6AEv(W$&{T1em2#!Oj{F4O4&xar|1T`#GUE(q&N3LMHPj zKOZorycD}0do6$e^oA0I>AK@IKyTx|Yx7i3S@#7znvH!s1t4zF!#oe;M1JqgHbrb* zGQ%VPM~DH7Z6%*p8*H&|Ch=j`%HXwyru_P0!9WB0)m+#GGOnK199-&#wDRTR!~6nh z-OR?LOCwLzC;zzb4j6-HIFufYxpl6gyj0y6K9NkD)_fWz%0#1-FM8* zRTN!)LKAbxBQj$3wLTl+p#y&NU479rV$F1}`RK1NA=u8l5oQuwwgDbopX!u(LdOJM zBf2$17Q7G<7V>a)11hia#qrXV+cIA#!-lKGgCmR9b3T4PDNvILK)$V-wN2*sVq=r0 z(Lm!?vFv7;PeVHTYfv)bgG)CGCsct^(EuxL)9&^V+_~^8raWjidiu*BGh3~NV8G-d z1vz&@I{iVMFONC}_VoqVxeKUfu5r+5#>Jd7CJva*aX?sPj z+OHS@KJQpj4Uf_9-IJX4?D@Lzt2ThjYrFBL0RdNtw<;TL_DN(dRJw`wxhro`$QBsW zr&e!ei7)7j0({E4qP5)u$41GeXfwIAZ09F6lYvHq0n9Bx6KUVk>N)<#ykUS4?lmeq zS}!&?4V`{uANlbrLB#r&d!eaKrCG&3-zc+3G*0bcgz`FHa}^*}0gkfoCyn{i^U~*i zf0=@(1Tu!J1c0S<*-QRNB(+@%e{|^;7tOn={6;g0+S|os+1M?k*8uYM@g*tglJ@jN0Qu3=ukxF0z6{p8aX4u1$Eg05ds&7;cBb-Gg` zJ;L^OEqag8GT8a~V%btuZoHhjrVC&#kB-$yX;?i&9=R7A{*iwdC04k-@ z=s@fyA3OAxPn0tVaw}Wgzh4`KJQwXVS_b?x^dQU7J!Ci4E`rzlecsV^{R!ELf>7M) zMb7VO51OJq=*9THKg0b9*`!@S++I7AMu2HDu=sHE9OJ)d6pWPz2~U@P*gWZvWof}I zLkyHImqQuhnL~SLeu0@j%DU}-BHrzN4pBTl%`l0{gV%;m6J{0{t;V+J3Caz9-Y2>j zewj}8cs(ZrBM1-my|de^4c+!-byliA@)UuV7M)Kl-`T_a$~Q)|p0jagpSd9l&O>Ft zx0MWKq$EhO_=(o=GhP*t6>Q~HOUi|sIX|MuA+G;{$RPsB(TJn>m41Di0uR7Z=aVaQ zMtT|$zUbi0yn8(1B-inug*o54jLiU8bDf23AGt9}3)>bFh^_VBDk91I%(#V*#~3hZ zPk|py{bufa2?PuL1>vry=IKWr!Z(~!B0j=27YxP#&=;WnH+8@j3Y@D@5O@ZU7xMw& zyvb~mo8t9gd%iROfSCj(O}-Sxfk1Ln%9525CSU#!;z9vK literal 0 HcmV?d00001 diff --git a/rsc/boite_victoire_jaune.png b/rsc/boite_victoire_jaune.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9c27dae51f865872fd7f1f2b886a4b0fb13024 GIT binary patch literal 11421 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 literal 0 HcmV?d00001 diff --git a/rsc/boite_victoire_rouge.png b/rsc/boite_victoire_rouge.png new file mode 100644 index 0000000000000000000000000000000000000000..0f4e87573e18a61a32dd6f060a74fb533f0d84c6 GIT binary patch literal 12400 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 literal 0 HcmV?d00001 diff --git a/rsc/sp_plateau.png b/rsc/sp_plateau.png new file mode 100644 index 0000000000000000000000000000000000000000..c22bde8f5f74bcd5e950b3e5942f985f6da6ac22 GIT binary patch literal 36638 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ð&@jAOpQ(<3`4r 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 literal 0 HcmV?d00001 diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..68a09634f25049d25e052ff506187020e279cd99 GIT binary patch literal 6148 zcmeHKyH3L}6uoW&Ev>3{WQUyEt<4AbuC{g_9 zfjyg}QZp#II3Ny)18WC(eTa}4V~eRly>uYcM*v`mY8@!^?*eNgi?PMjAX*U0NP$MG z>=8p5IqDwFH^nj&*^z;$0*iXp6W2j4h@HQG<{l N0d0e1;=qqO@C9n%q459! literal 0 HcmV?d00001 diff --git a/src/Jeu.cpp b/src/Jeu.cpp new file mode 100644 index 0000000..38e7834 --- /dev/null +++ b/src/Jeu.cpp @@ -0,0 +1,750 @@ +/********************************************************************************************/ +/* Jean-Baptiste NADAL, Jean-Gael REBOUL - PROJET PUISSANCE4 - CSII 3A - 2000/2001 */ +/********************************************************************************************/ + +#include "Jeu.h" +#include "time.h" + +// =================================================================== +// Le CONSTRUCTEUR =================================================== +// =================================================================== +// Initialise la plateau : met à vide, poids et tableau colonne ====== +// =================================================================== +Jeu::Jeu() +{ + // initialisation du plateau + int i, j; + for(i=0; i < 9; i++) + { + Plateau[i][0][QUI] = BORD; + Plateau[i][7][QUI] = BORD; + Plateau[i][0][POIDS] = -100; + Plateau[i][7][POIDS] = -100; + } + for (i=1; i < 7; i++) + { + Plateau[0][i][QUI] = BORD; + Plateau[8][i][QUI] = BORD; + Plateau[0][i][POIDS] = -100; + Plateau[8][i][POIDS] = -100; + } + for (i=1; i < 8; i++) + for(j = 1; j < 7; j++) + Plateau[i][j][QUI] = VIDE; + + + /* + -100 -100 -100 -100 -100 -100 -100 -100 -100 + -100 L H G F G H L -100 + -100 K F E D E F K -100 + -100 J E C B C E J -100 + -100 I D B A B D I -100 + -100 H E C B C E H -100 + -100 G F E D E F G -100 + -100 -100 -100 -100 -100 -100 -100 -100 -100 + + */ + + // col 1 + Plateau[1][1][POIDS] = L_CTE; Plateau[1][2][POIDS] = K_CTE; Plateau[1][3][POIDS] = J_CTE; + Plateau[1][4][POIDS] = I_CTE; Plateau[1][5][POIDS] = H_CTE; Plateau[1][6][POIDS] = G_CTE; + // col 2 + Plateau[2][1][POIDS] = H_CTE; Plateau[2][2][POIDS] = F_CTE; Plateau[2][3][POIDS] = E_CTE; + Plateau[2][4][POIDS] = D_CTE; Plateau[2][5][POIDS] = E_CTE; Plateau[2][6][POIDS] = F_CTE; + // col 3 + Plateau[3][1][POIDS] = G_CTE; Plateau[3][2][POIDS] = E_CTE; Plateau[3][3][POIDS] = C_CTE; + Plateau[3][4][POIDS] = B_CTE; Plateau[3][5][POIDS] = C_CTE; Plateau[3][6][POIDS] = E_CTE; + // col 4 + Plateau[4][1][POIDS] = F_CTE; Plateau[4][2][POIDS] = D_CTE; Plateau[4][3][POIDS] = B_CTE; + Plateau[4][4][POIDS] = A_CTE; Plateau[4][5][POIDS] = B_CTE; Plateau[4][6][POIDS] = D_CTE; + // col 5 + Plateau[5][1][POIDS] = G_CTE; Plateau[5][2][POIDS] = E_CTE; Plateau[5][3][POIDS] = C_CTE; + Plateau[5][4][POIDS] = B_CTE; Plateau[5][5][POIDS] = C_CTE; Plateau[5][6][POIDS] = E_CTE; + // col 6 + Plateau[6][1][POIDS] = H_CTE; Plateau[6][2][POIDS] = F_CTE; Plateau[6][3][POIDS] = E_CTE; + Plateau[6][4][POIDS] = D_CTE; Plateau[6][5][POIDS] = E_CTE; Plateau[6][6][POIDS] = F_CTE; + // col 7 + Plateau[7][1][POIDS] = L_CTE; Plateau[7][2][POIDS] = K_CTE; Plateau[7][3][POIDS] = J_CTE; + Plateau[7][4][POIDS] = I_CTE; Plateau[7][5][POIDS] = H_CTE; Plateau[7][6][POIDS] = G_CTE; + + // Pour les Colonnes + for (i = 1; i < 8; i++) + CaseCol[i] = 6; + // Joueur Courant : + JCo = J1; + Fini = false; + + // un petit random pour l'évaluation + srand( (unsigned)time( NULL ) ); +} + +// =================================================================== +// Le DESTRUCTEUR ==================================================== +// =================================================================== +Jeu::~Jeu() +{ +} + +// =================================================================== +// AFFICHE LE PLATEAU (pas beau !) =================================== +// =================================================================== +void Jeu::AffichePlateau() +{ + int i, j; + for (j = 0; j < 8; j++) + { + //cout << "------------------------------------" << endl; + for (i = 0; i < 9; i++) + { + cout << "| "; + if (Plateau[i][j][QUI] == BORD) cout << "B"; + else + if (Plateau[i][j][QUI] == VIDE) cout << " "; + else + if (Plateau[i][j][QUI] == J1) cout << "O"; + else + if (Plateau[i][j][QUI] == J2) cout << "X"; + } + cout << endl; + } +} + + +// =================================================================== +// AFFICHE LES POIDS DU PLATEAU (pas beau !) ========================= +// =================================================================== +void Jeu::AffichePlateau_Poids() +{ + int i, j; + for (j = 0; j < 8; j++) + { + cout << "------------------------------------" << endl; + for (i = 0; i < 9; i++) + { + cout << "| "; + cout << Plateau[i][j][POIDS]; + } + cout << endl; + } +} + +// =================================================================== +// INITIALISE LE JOUEUR ORDINATEUR =================================== +// =================================================================== +void Jeu::setJO(int i) +{ + if (i == 1) + JO = J1; + else + JO = J2; +} + +// =================================================================== +// FONCTION DONNANT LA MAIN : ======================================== +// -> Soit fait jouer l'ordinateur ================================== +// -> Soit interroge le joueur humain =============================== +// =================================================================== +void Jeu::DonneMain() +{ + bool Pasjouer = true; + int col=0; + + AffichePlateau(); + if (JCo == JO) + { + // c'est l'ordi qui joue + cout << "L'ordinateur doit jouer !" << endl; + // ici, on met en place min-max (puis, l'alpha-beta) + col = CalculCoup(Niv); + Joue(JCo, col); + } + else + { + while (Pasjouer) + { + // c'est l'humain + cout << "---------------------------" << endl; + cout << "| | 1| 2| 3| 4| 5| 6| 7| |" << endl; + cout << "---------------------------" << endl; + //cout << " Dans quelle colonne jouez-vous ?" << endl; + cin >> col; + // on vérifie que la colonne ne soit pas remplie + if (col > 0 && col < 8 && CaseCol[col]!=0) + { + Joue(JCo, col); + Pasjouer = false; + } + } + } + // on vérifie si le joueur courant n'a pas gagné. + if (Gagne(col)) + { + AffichePlateau(); + if (JCo == JO) + cout << "Le joueur ORDINATEUR vous a ecrase." << endl; + else + cout << "Vous venez d'ecraser le joueur ORDINATEUR." << endl; + setFini(); + } + else + // LE JOUEUR COURANT A JOUE ET N'A PAS GAGNE, LE JOUEUR COURANT CHANGE + JCo *= -1; +} + +// ====================================================== +// Cette fonction fait joueur le joueur humain +bool Jeu::JoueHumain( int numCol ) +{ + // -- Variables locales + bool resultat=false; + // -- Fin Variables locales + + if (numCol > 0 && numCol < 8 && CaseCol[numCol]!=0) + Joue(JCo, numCol); + + // on vérifie si le joueur courant n'a pas gagné. + //jige resultat = Gagne(numCol, CaseCol[numCol]+1); + resultat = Gagne(numCol); + + if (resultat) + setFini(); + else + JCo *= -1; + + return resultat; +} + +// ====================================================== +// Cette fonction fait jouer l'ordi et retourne la case que +// celui-ci a joué +int Jeu::JoueOrdi() +{ + // On calcul le coup qu'il va jouer + return CalculCoup(Niv); +} + +// ====================================================== +// On finit de faire jouer l'ordinateur +bool Jeu::FiniJoueOrdi( int numCol ) +{ + return JoueHumain(numCol); +} + +// =================================================================== +// Vérifie si le Joueur courant n'a pas gagné ======================== +// =================================================================== +bool Jeu::Gagne(const int x) +{ + int i, j; + int y = CaseCol[x] + 1; + int JoueurCourant = Plateau[x][y][QUI]; + bool continuer = true; + int naligner = 1; + /* + (i-1, j+1) | (i, j+1) | (i+1, j+1) + (i-1, j) | (i=x, j=y) | (i+1, j) + (i-1, j-1) | (i, j-1) | (i+1, j-1) + + */ + // direction 1 ----------------------------------- diag droite + i = x+1; + j = y+1; + while(continuer) + { + if (Plateau[i++][j++][QUI] == JoueurCourant) + naligner++; + else + continuer = false; + } + if (naligner >= 4) + return true; + continuer = true; + i = x-1; + j = y-1; + while(continuer) + { + if (Plateau[i--][j--][QUI] == JoueurCourant) + naligner++; + else + continuer = false; + } + if (naligner >= 4) + return true; + // direction 2 ---------------------------------- vert + naligner = 1; + continuer = true; + i = x; + j = y+1; + while(continuer) + { + if (Plateau[i][j++][QUI] == JoueurCourant) + naligner++; + else + continuer = false; + } + if (naligner >= 4) + return true; + continuer = true; + i = x; + j = y-1; + while(continuer) + { + if (Plateau[i][j--][QUI] == JoueurCourant) + naligner++; + else + continuer = false; + } + if (naligner >= 4) + return true; + // direction 3 ---------------------------------- diag gauche + naligner = 1; + continuer = true; + i = x-1; + j = y+1; + while(continuer) + { + if (Plateau[i--][j++][QUI] == JoueurCourant) + naligner++; + else + continuer = false; + } + if (naligner >= 4) + return true; + continuer = true; + i = x+1; + j = y-1; + while(continuer) + { + if (Plateau[i++][j--][QUI] == JoueurCourant) + naligner++; + else + continuer = false; + } + if (naligner >= 4) + return true; + // direction 4 ---------------------------------- horiz + naligner = 1; + continuer = true; + i = x-1; + j = y; + while(continuer) + { + if (Plateau[i--][j][QUI] == JoueurCourant) + naligner++; + else + continuer = false; + } + if (naligner >= 4) + return true; + continuer = true; + i = x+1; + j = y; + while(continuer) + { + if (Plateau[i++][j][QUI] == JoueurCourant) + naligner++; + else + continuer = false; + } + if (naligner >= 4) + return true; + return false; +} + + +void Jeu::Joue(int joueur, int col) +{ + if (CaseCol[col] != 0) + { + Plateau[col][CaseCol[col]][QUI] = joueur; + CaseCol[col] = CaseCol[col] - 1; + } +} + +void Jeu::DeJoue(int col) +{ + if (CaseCol[col] != 6) + { + CaseCol[col] = CaseCol[col] + 1; + Plateau[col][CaseCol[col]][QUI] = VIDE; + } +} + +int Jeu::Evalue(const int& i, const int& j, const int& jo) const +// retourne un incrément ou -1 quand il faut s'arrêter +{ + int qui = Plateau[i][j][QUI]; + if (qui == VIDE) + return 0; + if (qui == jo) + return Plateau[i][j][POIDS]; + return -1; +} + + +int Jeu::Evalue(int col) +// les gd principes de l'évaluation : il faut retourner la valeur max pour ce pion : +// ==> si pas possible de gagner +// si possibilité d'en aligner 4 : +// poids + nb d'aligner avec poids des alignés + dliberté +// sinon une valeur nulle. +// ==> sinon, si gagne, alors retourne INFINI (nbaligner = 4) +{ + // on a déjà posé le pion ici ==> x = col, y = CaseCol[col] + 1 + int x = col; + int y = CaseCol[col] + 1; + int joCo = Plateau[x][y][QUI]; + int joCopoids = Plateau[x][y][POIDS]; + // pour les variables locales + int i, j; + // nombre de pions alignés, nombre de vide aligné ------------- + int naligner = joCopoids, + nalpion=1, + nalignermax=1, + nalignervidemax=0, + nalignervide = 0, + retEvalue; + bool continuer = true; + // direction 1 ----------------------------------- diag droite + i = x+1; + j = y+1; + while(continuer) + { + retEvalue = Evalue(i, j, joCo); + switch(retEvalue) + { + case -1: + continuer = false; + break; + case 0: + nalignervide++; + if (nalignervide > 3) + continuer = false; + break; + default: + naligner+=retEvalue; + nalpion++; + break; + } + i++; + j++; + } + continuer = true; + i = x-1; + j = y-1; + while(continuer) + { + retEvalue = Evalue(i, j, joCo); + switch(retEvalue) + { + case -1: + continuer = false; + break; + case 0: + nalignervide++; + if (nalignervide > 6) + continuer = false; + break; + case 1: + naligner+=retEvalue; + nalpion++; + break; + } + i--; + j--; + } + if (nalpion >= 4) + return INFINI; // gagné ! + nalignermax = naligner; + nalignervidemax = nalignervide; + // direction 2 ---------------------------------- vert + naligner=joCopoids; + nalpion=1; + nalignervide=0; + continuer = true; + i = x; + j = y+1; + while(continuer) + { + retEvalue = Evalue(i, j, joCo); + switch(retEvalue) + { + case -1: + continuer = false; + break; + case 0: + nalignervide++; + if (nalignervide > 3) + continuer = false; + break; + case 1: + naligner+=retEvalue; + nalpion++; + break; + } + j++; + } + continuer = true; + i = x; + j = y-1; + while(continuer) + { + retEvalue = Evalue(i, j, joCo); + switch(retEvalue) + { + case -1: + continuer = false; + break; + case 0: + nalignervide++; + if (nalignervide > 6) + continuer = false; + break; + case 1: + naligner+=retEvalue; + nalpion++; + break; + } + j--; + } + if (nalpion >= 4) + return INFINI; // gagné ! + if (nalignermax <= naligner) + { + nalignermax = naligner; + if (nalignervidemax < nalignervide) + nalignervidemax = nalignervide; + } + // direction 3 ---------------------------------- diag gauche + naligner=joCopoids; + nalpion=1; + nalignervide=0; + continuer = true; + i = x-1; + j = y+1; + while(continuer) + { + retEvalue = Evalue(i, j, joCo); + switch(retEvalue) + { + case -1: + continuer = false; + break; + case 0: + nalignervide++; + if (nalignervide > 3) + continuer = false; + break; + case 1: + naligner+=retEvalue; + nalpion++; + break; + } + i--; + j++; + } + continuer = true; + i = x+1; + j = y-1; + while(continuer) + { + retEvalue = Evalue(i, j, joCo); + switch(retEvalue) + { + case -1: + continuer = false; + break; + case 0: + nalignervide++; + if (nalignervide > 6) + continuer = false; + break; + case 1: + naligner+=retEvalue; + nalpion++; + break; + } + i++; + j--; + } + if (nalpion >= 4) + return INFINI; // gagner + if (nalignermax <= naligner) + { + nalignermax = naligner; + if (nalignervidemax < nalignervide) + nalignervidemax = nalignervide; + } + // direction 4 ---------------------------------- horiz + naligner=joCopoids; + nalpion=1; + nalignervide=0; + continuer = true; + i = x-1; + j = y; + while(continuer) + { + retEvalue = Evalue(i, j, joCo); + switch(retEvalue) + { + case -1: + continuer = false; + break; + case 0: + nalignervide++; + if (nalignervide > 3) + continuer = false; + break; + case 1: + naligner+=retEvalue; + nalpion++; + break; + } + i--; + } + continuer = true; + i = x+1; + j = y; + while(continuer) + { + retEvalue = Evalue(i, j, joCo); + switch(retEvalue) + { + case -1: + continuer = false; + break; + case 0: + nalignervide++; + if (nalignervide > 6) + continuer = false; + break; + case 1: + naligner+=retEvalue; + nalpion++; + break; + } + i++; + } + if (nalpion >= 4) + return INFINI; // gagner + if (nalignermax <= naligner) + { + nalignermax = naligner; + if (nalignervidemax < nalignervide) + nalignervidemax = nalignervide; + } + + int dliberte=1; + // nombre de degré de liberté --------- + if (Plateau[x-1][y-1][QUI] == VIDE || Plateau[x-1][y-1][QUI] == joCo) dliberte++; + if (Plateau[x][y-1][QUI] == VIDE || Plateau[x][y-1][QUI] == joCo) dliberte++; + if (Plateau[x+1][y-1][QUI] == VIDE || Plateau[x+1][y-1][QUI] == joCo) dliberte++; + if (Plateau[x-1][y][QUI] == VIDE || Plateau[x-1][y][QUI] == joCo) dliberte++; + if (Plateau[x+1][y][QUI] == VIDE || Plateau[x+1][y][QUI] == joCo) dliberte++; + if (Plateau[x-1][y+1][QUI] == VIDE || Plateau[x-1][y+1][QUI] == joCo) dliberte++; + if (Plateau[x+1][y+1][QUI] == VIDE || Plateau[x+1][y+1][QUI] == joCo) dliberte++; + + // on ajoute à tout ça le poids de la case + //return (nalignermax+joCopoids)*joCopoids + (nalignervidemax * dliberte); + //return (((nalignermax*joCopoids)+dliberte*joCopoids)+nalignervidemax)*joCopoids; + //return nalignermax*joCopoids; + //return ((nalignermax*joCopoids)+(nalignervidemax*dliberte))*joCopoids; + //return ((nalignermax+(dliberte*joCopoids))+nalignervidemax)*joCopoids; + //return ((((nalignermax*joCopoids)+dliberte)*joCopoids)+nalignervidemax)*joCopoids; + //return ((nalignermax+dliberte*joCopoids)+nalignervidemax)*joCopoids; + //return (nalignermax*joCopoids) + (dliberte+nalignervidemax)*joCopoids; + //return ((nalignermax*joCopoids) + dliberte+nalignervidemax)*joCopoids; + //return ((nalignermax+(nalpion*joCopoids)) + dliberte+nalignervidemax)*joCopoids; + //return nalignervidemax + dliberte + nalpion + nalignermax*joCopoids; + //return nalignervidemax + dliberte + nalpion + nalignermax*joCopoids; + return nalignervidemax + dliberte + nalpion + nalignermax*joCopoids + rand()%30; +} + + +int Jeu::CalculCoup(int Niveau) +{ + int col=-1, c=-1; + JoueVirtuel_MinMax(Niveau, col, JCo, c, true); + return col; +} + +int Jeu::JoueVirtuel_MinMax(int Niveau, int& col, int jCo, int &c, bool racine) +{ + int i, M, T; + bool continuer = true; + if (Niveau%2==0) + M = INFINI+1; + else + M = -INFINI-1; + for (i = 1; i < 8; i++) + // pour toutes les colonnes + { + if (CaseCol[i] != 0) + // si colonne non remplie + { + c=-1; + Joue(jCo, i); + if (Gagne(i)) + { + if (racine) // premier coup de l'ordinateur + { // l'ordinateur gagne. on réfléchit plus, on joue + col = i; + DeJoue(i); + return i*-1; + } + if (Niveau == Niv-1) // 1er coup de l'adversaire + // c'est l'adversaire qui gagne, on doit forcément jouer + // dans cette colonne. sinon : on perd ! + // sauf si... col de l'humain = col de l'ordi + { + c = i; + DeJoue(i); + return Evalue(i); + } + if (Niveau == Niv-3) // 2eme coup de l'adversaire + // c'est l'adversaire qui gagne, on doit forcément jouer + // dans cette colonne. sinon : on perd ! + // sauf si... col de l'humain = col de l'ordi + { + c = i; + DeJoue(i); + return Evalue(i)/2; + } + } + if (Niveau == 1) + { + T = Evalue(i); + if (T >= M) + M = T; // MAJ du max de l'adversaire + } // fin if Niveau == 0 + else + { + T = JoueVirtuel_MinMax(Niveau-1, col, jCo*-1, c); + if (Niveau%2 == 0) // noeud ou on maximise + { + if (racine) + { + //debug cout << "COL = " << i << ", T = " << T << ", M = " << M << ", C = " << c << " [JOrdinateur = " << jCo << "]" << endl; + if (c != -1 && c != i) + { + col = c; + DeJoue(i); + return 1; + } + if (T < M) + col = i; // SAV + } + if (T < M) + M = T; // MAJ du MIN de l'adversaire + } // fin niveau pair + else // noeud ou on minimise + { + if (T >= M) + M = T; // MAJ du MAX de l'adversaire + } + } + DeJoue(i); + } + } + return M; +} \ No newline at end of file diff --git a/src/Jeu.h b/src/Jeu.h new file mode 100644 index 0000000..37fc2e1 --- /dev/null +++ b/src/Jeu.h @@ -0,0 +1,43 @@ +// Jeu.h: interface for the Jeu class. +// +////////////////////////////////////////////////////////////////////// + +#include "commun.h" +#include +//#include + +class Jeu +{ +public: + int JO; // Joueur Ordinateur + int Niv; // Niveau de l'IA + int JCo; // Joueur Courant + bool Fini; + int CaseCol[9]; + + Jeu(); + virtual ~Jeu(); + int getJO(){ return JO; } + int getJcourant() { return JCo; } + int Plateau[9][8][2]; // 0 : qui; 1 : poids + void AffichePlateau(); + void AffichePlateau_Poids(); + void setJO(int i); + void DonneMain(); + void setFini() {Fini = true;} + bool getFini() {return Fini;} + bool Gagne(int); + bool JoueHumain( int numCol); + int JoueOrdi(); + bool FiniJoueOrdi( int numCol ); + + // pour l'IA + void Joue(int j, int c); + void DeJoue(int c); + int Evalue(int); + int Evalue(const int& i, const int& j, const int& jo) const; + int CalculCoup(int); + int JoueVirtuel_MinMax(int Niveau, int&, int, int&, bool=false); +}; + + diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..25ef1aa --- /dev/null +++ b/src/Makefile @@ -0,0 +1,39 @@ +################################################# +# Makefile pour KNRPuissance4 +# Reboul Jean-Gael +# NADAL Jean-Baptiste +# +# Octobre 2000 +# +################################################# + +#flags de compilations + +CXX=g++ +CXXFLAGS= -O7 -DCPU=586 -Wall -I/usr/local/include/SDL/ -D_REENTRANT +#LDFLAGS= -Xlinker -s -L. -lSDL +LDFLAGS= -Xlinker -s -L/usr/local/lib -lSDL -lSDL_image -lpthread + +OFICHIERS=\ +main.o plateauview.o csprite.o cpion.o Jeu.o cintro.o + +CFICHIERS=\ +main.cpp plateauview.cpp csprite.cpp cpion.cpp Jeu.cpp cintro.cpp + +#defintion de la cible all +all: clear knrpuissance4 + +clear: + @ echo; echo -e "on efface tout\n";\ +/usr/bin/clear; + +clean: Makefile.deps + -rm -f *.o *~ knrpuissance4 + +knrpuissance4: $(OFICHIERS) + $(CXX) $(CFLAGS) -o knrpuissance4 $(LDFLAGS) $(OFICHIERS) + +Makefile.deps: + $(CXX) -MM $(CFLAGS) $(CFICHIERS) > Makefile.deps + +include Makefile.deps \ No newline at end of file diff --git a/src/Makefile.deps b/src/Makefile.deps new file mode 100644 index 0000000..1b0b1e3 --- /dev/null +++ b/src/Makefile.deps @@ -0,0 +1,6 @@ +main.o: main.cpp +plateauview.o: plateauview.cpp plateauview.h +csprite.o: csprite.cpp csprite.h +cpion.o: cpion.cpp cpion.h +Jeu.o: Jeu.cpp Jeu.h +cintro.o: cintro.cpp cintro.h \ No newline at end of file diff --git a/src/cintro.cpp b/src/cintro.cpp new file mode 100644 index 0000000..a6a94c2 --- /dev/null +++ b/src/cintro.cpp @@ -0,0 +1,119 @@ +/*************************************************************************** + cintro.cpp - description + ------------------- + begin : Sat Nov 18 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "cintro.h" + +#include "csprite.h" + +#include // pour cout deboug + +// ================================================= +// Constructeur +CIntro::CIntro(SDL_Surface* pecran ) +{ + spt_boiteIntro = new CSprite (pecran,50,100,"boite_intro.png"); + pCurseur = new CSprite (pecran,140,210,"pointeur.png"); + ecran = pecran; +} + +// ================================================= +// Destructeur +CIntro::~CIntro() +{ + delete spt_boiteIntro; + delete pCurseur; +} + + +// ================================================= +// Lancement : Permet d'afficher l'intro et de selection +// quel joueur commence +int CIntro::Lancement() +{ + // Variable locales + SDL_Event event; + int done; + int nResultat = 0; + Uint32 couleurfond; + // Fin Variables locales + + spt_boiteIntro->show(); +// pCurseur->show(); + + // On recupere la couleur de fond pour les sprites + couleurfond = SDL_MapRGB( ecran->format,0xde,0xde,0xde ); + + done = 0; + while ( !done ) + { + SDL_WaitEvent(&event); + + switch ( event.type ) + { + case SDL_MOUSEBUTTONDOWN: + if ( nResultat != 0 ) + done=1; + break; + case SDL_MOUSEMOTION: + if (( event.motion.y >212 ) && (event.motion.y < 245 )) + { + if ( nResultat !=2 ) + { + if ( nResultat == 1 ) + pCurseur->Hide(couleurfond); + + pCurseur->SetPosY(210); + pCurseur->show(); + SDL_Flip(ecran); + nResultat = 2; + } // fin if + } + else if (( event.motion.y >262 ) && (event.motion.y < 295 )) + { + if ( nResultat !=1 ) + { + if ( nResultat == 2 ) + pCurseur->Hide(couleurfond); + + pCurseur->SetPosY(265); + pCurseur->show(); + SDL_Flip(ecran); + nResultat = 1; + } // fin if + } + else + { + if ( nResultat !=0 ) + { + pCurseur->Hide(couleurfond); + nResultat =0; + SDL_Flip(ecran); + } + } + break; + case SDL_QUIT: + done = 1; + nResultat = -1; + break; + default: + break; + } // fin switch + + } // fin while + + return nResultat; +} \ No newline at end of file diff --git a/src/cintro.h b/src/cintro.h new file mode 100644 index 0000000..d23bf24 --- /dev/null +++ b/src/cintro.h @@ -0,0 +1,50 @@ +/*************************************************************************** + cintro.h - description + ------------------- + begin : Sat Nov 18 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef CINTRO_H +#define CINTRO_H + +#include "SDL.h" + + +// dépendance +class CSprite; + +/** + *@author NADAL Jean-Baptiste + */ + +class CIntro { +public: + // ================================================= + // Constructeur + CIntro(SDL_Surface* pecran); + // ================================================= + // Destructeur + ~CIntro(); + // ================================================= + // Lancement : Permet d'afficher l'intro et de selection + // quel joueur commence + int Lancement(); + +private: + CSprite* spt_boiteIntro; + CSprite* pCurseur; + SDL_Surface* ecran; +}; + +#endif diff --git a/src/commun.h b/src/commun.h new file mode 100644 index 0000000..6fb3ad4 --- /dev/null +++ b/src/commun.h @@ -0,0 +1,35 @@ +/********************************************************************************************/ +/* Jean-Baptiste NADAL, Jean-Gael REBOUL - PROJET PUISSANCE4 - CSII 3A - 2000/2001 */ +/********************************************************************************************/ + +#ifndef COMMUN_H +#define COMMUN_H + +#include "assert.h" +#include "stdlib.h" +#include "stdio.h" + +#define QUI 0 +#define POIDS 1 + +#define INFINI 30000 + +#define BORD 0 +#define VIDE 2 +#define J1 1 +#define J2 -1 + + +#define A_CTE 50 +#define B_CTE 45 +#define C_CTE 40 +#define D_CTE 35 +#define E_CTE 30 +#define F_CTE 25 +#define G_CTE 20 +#define H_CTE 15 +#define I_CTE 10 +#define J_CTE 5 +#define K_CTE 2 +#define L_CTE 1 +#endif \ No newline at end of file diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..830fc26 --- /dev/null +++ b/src/config.h @@ -0,0 +1,25 @@ +/*************************************************************************** + config.h - description + ------------------- + begin : Sun Oct 29 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef CONFIG_H +#define CONFIG_H + +#define VERSION "0.12" + +#define Coef_ALPHA 220 + +#endif \ No newline at end of file diff --git a/src/cpion.cpp b/src/cpion.cpp new file mode 100644 index 0000000..549d8fc --- /dev/null +++ b/src/cpion.cpp @@ -0,0 +1,83 @@ +/*************************************************************************** + cpion.cpp - description + ------------------- + begin : Tue Oct 31 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +//#include +#include "cpion.h" + +// ================================================= +// Constructeur de la classe +CPion::CPion(SDL_Surface *surface,Uint16 posX,Uint16 posY, char* fichier, CSprite* pP) +: CSprite (surface,posX,posY, fichier) +{ + pPlateau = pP; + +} + +// ================================================= +// Constructeur de la classe dont on ne passe pas +// que le strict minimum +CPion::CPion( SDL_Surface *surface, char* fichier, CSprite* pP ) +: CSprite (surface, fichier) +{ + pPlateau = pP; +} + + +//CPion::CPion(){} + +CPion::~CPion(){ +} + +// ================================================= +// cette fonction permet de faire glisser un pion +// de sa position actuelle vers sa nouvelle position +void CPion::Glisse(int nHauteur) +{ + // -- Variables locales + int nHauteurfinale=0; + // -- Fin Variables locales + + switch(nHauteur) + { + case 1: nHauteurfinale=60; break; + case 2: nHauteurfinale=126; break; + case 3: nHauteurfinale=194; break; + case 4: nHauteurfinale=262; break; + case 5: nHauteurfinale=330; break; + case 6: nHauteurfinale=398; break; + }// fin switch + + while ( Pos.y <= nHauteurfinale ) + { + SDL_LockSurface(pSurface); + Hide(); + Pos.y+=4; + show(); + pPlateau->show(); + SDL_Flip(pSurface); + SDL_UnlockSurface(pSurface); + } // fin while + + Pos.y = nHauteurfinale; +} + +// ================================================= +// Cette fonction retourne vrai si le pion se trouve en +// haut de l'échiquier +bool CPion::enHaut() +{ + return ( Pos.y ==0 ); +} diff --git a/src/cpion.h b/src/cpion.h new file mode 100644 index 0000000..d678d56 --- /dev/null +++ b/src/cpion.h @@ -0,0 +1,54 @@ +/*************************************************************************** + cpion.h - description + ------------------- + begin : Tue Oct 31 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef CPION_H +#define CPION_H + +#include + +#include "csprite.h" + +/** + *@author NADAL Jean-Baptiste + */ + +class CPion : public CSprite { +public: + // ================================================= + // Constructeur de la classe + CPion(SDL_Surface *surface,Uint16 posX,Uint16 posY, char* fichier, CSprite* pP ); + // ================================================= + // Constructeur de la classe dont on ne passe pas + // que le strict minimum + CPion( SDL_Surface *surface, char* fichier, CSprite* pP ); + // ================================================= + // Destructeur + virtual ~CPion(); + // ================================================= + // cette fonction permet de faire glisser un pion + // de sa position actuelle vers sa nouvelle position + void Glisse(int nHauteur); + // ================================================= + // Cette fonction retourne vrai si le pion se trouve en + // haut de l'échiquier + bool enHaut(); + +private: + CSprite* pPlateau; +}; + +#endif diff --git a/src/csprite.cpp b/src/csprite.cpp new file mode 100644 index 0000000..5cd7711 --- /dev/null +++ b/src/csprite.cpp @@ -0,0 +1,175 @@ +/*************************************************************************** + csprite.cpp - description + ------------------- + begin : Mon Oct 30 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "csprite.h" + +#include + +#include // pour cout et cerr + +// ================================================= +// Constructeur de la classe dont on passe +// la position de départ +CSprite::CSprite( SDL_Surface *surface,Uint16 posX,Uint16 posY, char* fichier ) +{ + // On initialise les differents champs de la classe + pSurface = surface; + Pos.x = posX; + Pos.y = posY; + Pos.w = 0; + Pos.h = 0; + pData = NULL; + // la couleur de fond sera noire + nCouleurFond = SDL_MapRGB(pSurface->format, 0x00, 0x00, 0x00); + // puis on charge les donnees du sprite + initDonnee(fichier); +} + +// ================================================= +// Constructeur de la classe dont on ne passe pas +// que le strict minimum +CSprite::CSprite( SDL_Surface *surface, char* fichier ) +{ + // On initialise les differents champs de la classe + pSurface = surface; + Pos.x = 0; + Pos.y = 0; + Pos.w = 0; + Pos.h = 0; + pData = NULL; + // la couleur de fond sera noire + nCouleurFond = SDL_MapRGB(pSurface->format, 0x00, 0x00, 0x00); + + // puis on charge les donnees du sprite + initDonnee(fichier); +} + + +// ================================================= +// Destructeur +CSprite::~CSprite() +{ + // on supprime les donnée du sprite + SDL_FreeSurface(pData); +} + +// ================================================= +// Cette méthode permet de charger le fichier du sprite +// et de mettre le premier pixel de l'image comme couleur +// de transparance +void CSprite::initDonnee(char* szFichier) +{ + // -- Variables locales + SDL_Surface *temp; + // -- Fin Variables locales + + // On charge l'image + pData = IMG_Load(szFichier); + // On vérifie que l'image c'est bien chargée + if ( pData == NULL ) + { + cerr <<" : Impossible de chargé "<w; + Pos.h = pData->h; + + // on signal que la couleur du premier pixel (0,0) de l'image est la couleur + // de transparance du sprite + SDL_SetColorKey(pData,(SDL_SRCCOLORKEY|SDL_RLEACCEL) ,*(Uint32 *)pData->pixels); + + // Puis pour des question d'optimisation, on transforme l'image du sprite dans le meme + // mode que celui du mode X courant + temp = SDL_DisplayFormat(pData); + SDL_FreeSurface(pData); + if ( temp == NULL ) + { + cerr <<" Impossible de convertir l'arrière plan: "< + +/** + *@author NADAL Jean-Baptiste + */ + +class CSprite { +public: + // ================================================= + // Constructeur de la classe + CSprite(SDL_Surface *surface,Uint16 posX,Uint16 posY, char* fichier); + // ================================================= + // Constructeur de la classe dont on ne passe pas + // que le strict minimum + CSprite( SDL_Surface *surface, char* fichier ); + // ================================================= + // Destructeur + virtual ~CSprite(); + // ================================================= + // Cette méthode permet d'afficher le sprite + void show(); + // ================================================= + // Cette méthode permet d'afficher le sprite + // Avec un coeficient de transparence + void showA(int val); + + // ================================================= + // Cette méthode permet de cacher un sprite si la surface a l'arrière plan + // est un fond uni + void Hide(); + // ================================================= + // Cette méthode permet de cacher un sprite + // en le remplaçant par la couleur de fond d'écran + void Hide(Uint32 color); + // ================================================= + // Cette fonction calcul les nouvelle coordonnée du sprite en fonction de la + // case du tableau passé en paramètre + void SetPosCase(int numCase); + // ================================================= + // Cette fonction permet de donner une nouvelle valeur pour + // la position en y du sprite + void SetPosY(int val_y); + + +protected: + // ================================================= + // Variables privée de la classe sprite + + SDL_Surface *pSurface; // pointeur sur la surface sur laquelle dessiner le sprite + SDL_Rect Pos; // Rectangle permettant de stouer les informations + // du sprite ( posX, posY, largeur hauteur ) + SDL_Surface *pData; // Donnee du sprite + Uint32 nCouleurFond; // Couleur de fond d'un sprite par défaut + + // ================================================= + // Méthodes privée a la classe sprite + + // ================================================= + // Cette méthode permet de charger le fichier du sprite + // et de mettre le premier pixel de l'image comme couleur + // de transparance + void initDonnee(char* szFichier); + +}; + +#endif diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..c8024da --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,33 @@ +/*************************************************************************** + main.cpp - description + ------------------- + begin : Sun Oct 29 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include // pour EXIT_SUCCESS +#include + +#include "plateauview.h" + +int main(int argc, char** argv) +{ + + CPlateauView* pMonPlateau = new CPlateauView(); + pMonPlateau->Lancement(); +return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/src/plateauview.cpp b/src/plateauview.cpp new file mode 100644 index 0000000..de522ea --- /dev/null +++ b/src/plateauview.cpp @@ -0,0 +1,353 @@ +/*************************************************************************** + plateau.cpp - description + ------------------- + begin : Sun Oct 29 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "config.h" + +#include + + +#include "plateauview.h" +#include "csprite.h" +#include "cpion.h" +#include "Jeu.h" +#include "cintro.h" + + +// ================================================= +// Constructeur +CPlateauView::CPlateauView() +{ + // -- Variables locales + int NivOrdi = 3; + int NumJordi=0; + // -- Fin Variables locales + + + // Initialisation de l'interface graphique + initSDL(); + nCaseSelect = 0; + // le premier joueur est le joueur Jaune +// pPionCourant = spt_Prouge; + + // On initialise le moteur du jeu + pMoteur = new Jeu(); + + pIntro = new CIntro(ecran); + + NumJordi = pIntro->Lancement(); + SDL_FillRect(ecran, NULL, 0); + spt_Plateau->show(); + SDL_Flip(ecran); + + cout <<" NumJordi de l'intro vaut :"<< NumJordi<setJO(NumJordi); + + if (NivOrdi > 0 && NivOrdi < 4) + pMoteur->Niv = NivOrdi*2; + else + pMoteur->Niv = 4; + nNbPionenJeu =0; + + bAbouge =false; + +} + +// ================================================= +// Destructeur +CPlateauView::~CPlateauView() +{ + // On efface les sprites + delete spt_Plateau; + delete spt_Prouge; + delete spt_Pjaune; +} + +// ================================================= +// Cette fonction permet d'initialiser toutes les couches graphique +// et de charger les differents sprites +int CPlateauView::initSDL() +{ + // -- Variables locales + + // -- Fin Variables locales + + + // Initialisation de la couche SDL + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) + { + fprintf(stderr, " Impossible d'initialisé la SDL: %s\n",SDL_GetError()); + exit(1); + } // fin if + + // On creer la fenetre et l'écran dans lequel on va dessiner + if ( (ecran=SDL_SetVideoMode(640,480, 16, SDL_SWSURFACE|SDL_DOUBLEBUF|SDL_HWSURFACE)) == NULL ) { + fprintf(stderr, " Impossible de creer un surface 640x480 dans le mode video: %s\n", SDL_GetError()); + exit(2); + } // fin if + + SDL_WM_SetCaption("KNRPuissance4 : v "VERSION" : NADAL-REBOUL -2000", "KNRPuissance4"); + + // Chargement du sprite pour le plateau du jeu + spt_Plateau = new CSprite(ecran,0,43,"sp_plateau.png" ); + // Puis on l'affiche + spt_Plateau->show(); + + // Chargement du sprite pour le poin rouge + spt_Prouge = new CPion(ecran,32,0,"sp_pion_rouge.png",spt_Plateau ); + + // Chargement du sprite pour le poin jaune + spt_Pjaune = new CPion(ecran,32,0,"sp_pion_jaune.png",spt_Plateau ); + + // Puis on charge les trois sprite pour la boite final du jeu + pb_MatchNul = new CSprite(ecran,50,100,"boite_match_nul.png" ); + pb_VictoireJaune = new CSprite(ecran,50,100,"boite_victoire_jaune.png" ); + pb_VictoireRouge = new CSprite(ecran,50,100,"boite_victoire_rouge.png" ); + + + // le sprite dans le coin droit pour a qu'il y a de plus reel + pPionRouge = new CSprite(ecran,565,10,"sp_pion_rouge.png" ); + pPionJaune = new CSprite(ecran,565,10,"sp_pion_jaune.png" ); + pPionCourant = pPionRouge; + + + + // tout est bon on retourn 0 + return 0; +} + + +// ================================================= +// Cette fonction contient la boucke infinie du programme. +int CPlateauView::Lancement() +{ + // -- Variables locales + int nQuitter=0; + SDL_Event event; + // Fin Variables locales + + pPionCourant->show(); + SDL_Flip(ecran); + + while ( nQuitter !=2 ) + { + if ( pMoteur->getJcourant() == pMoteur->getJO() ) + FaitJouerIA(); + + SDL_WaitEvent(&event); + { + switch (event.type) + { + case SDL_KEYDOWN: + if ( nQuitter == 1) + nQuitter = 2; + break; + case SDL_QUIT: + nQuitter = 2; + break; + case SDL_MOUSEMOTION: + if ( nQuitter != 1) { + slotMouseMove(event.motion.x ); + bAbouge =true; + } + break; + case SDL_USEREVENT: + if ( nQuitter != 1) + { + if ( slotMouseButtonDown() ) + nQuitter=1; + } + break; + case SDL_MOUSEBUTTONDOWN: + if ( nQuitter != 1) + { + if (bAbouge) + { + if ( slotMouseButtonDown() ) + nQuitter=1; + bAbouge =false; + } + } + break; + default: + break; + } // fin du switch + } // fin while ( SDL_PollEvent(&event) ) + + // Ajouter ici fonction de dessin +// JoueDeplacement(); + } // fin while ( !bQuitter ) + + // le programme est terminé, on quitte en retournat 0 + return 0; +} + +// ================================================= +// Cette fonction retourne la position dans le tableau +// en fonction des coordonnées de la souris passée en paramètres +int CPlateauView::PosSouris2Plateau(int x ) +{ + // -- Variables locales + int nXtemp; + int nValret; + // -- Fin Variables locales + + nXtemp = (int)(x-50)/5; + nXtemp *=5; + + nValret = nXtemp/65; + nValret++; + + return nValret; +} + + +//================================================= +// Cette fonction est appellée lorsque la souris est en +// déplacement +void CPlateauView::slotMouseMove(int x) +{ + // On ne deplace le pion que s'il s'agit du coup du joueur ordi. + if ( pMoteur->getJcourant() != pMoteur->getJO() ) + { + // on verifie que la souris est bien sur le plateau + if (( x >25 ) && ( x < 521 )) + { + int casetemp; + casetemp = PosSouris2Plateau( x ); + + if ( nCaseSelect != casetemp ) + { + nCaseSelect = casetemp; + SDL_LockSurface(ecran); + if ( pPionHumain->enHaut() ) + pPionHumain->Hide(); + pPionHumain->SetPosCase(nCaseSelect); + pPionHumain->show(); + spt_Plateau->show(); + SDL_Flip(ecran); + SDL_UnlockSurface(ecran); + } // fin if ( nCaseSelect != casetemp ) + } // fin if ( ( event.motion.x >25 ... + else + nCaseSelect =0; + } // fin if ( pMoteur->getJcourant() != getJO() ) +} + +//================================================= +// Cette fonction est appellé lorsque l'on clique sur un +// bouton de la souris +// retourne vrai si la partie est terminée +bool CPlateauView::slotMouseButtonDown() +{ + // -- Variables locales + bool bresultat=false; + int colonejouee; + bool bQuitter=false; + // -- Fin Variables locales + + // si le plateau est plein, on ne joue pas, + // il y a match nul + if (nNbPionenJeu == 42 ) + { + pb_MatchNul->showA(220); + SDL_Flip(ecran); + bQuitter = true; + } + else + { + // si c'est au tour de l'IA de jouer + if ( pMoteur->getJcourant() == pMoteur->getJO() ) + { + // On calcul le coup qu'il va jouer + colonejouee = pMoteur->JoueOrdi(); + // On fait glisser le pion de l'ordi + pPionOrdi->SetPosCase(colonejouee); + pPionOrdi->Glisse(pMoteur->CaseCol[colonejouee]); + // On finit de faire jouer l'ordinateur + bresultat = pMoteur->FiniJoueOrdi(colonejouee); + nNbPionenJeu++; + if ( bresultat ) // l'ordi vient de gagner + { + pb_bVicOrdi->showA(Coef_ALPHA); + SDL_Flip(ecran); + bQuitter = true; + } // fin if ( bresultat ) + } // fin if a l'ia de jouer + else + { + // On lance l'animation du glissement + pPionHumain->Glisse(pMoteur->CaseCol[nCaseSelect]); + // On joue le coup dans le moteur du jeu + bresultat = pMoteur->JoueHumain(nCaseSelect); + nNbPionenJeu++; + if ( bresultat ) // le joueur humain vient de gagner + { + pb_bVicHumain->showA(Coef_ALPHA); + SDL_Flip(ecran); + bQuitter = true; + } // fin if ( bresultat ) + } // fin else du si c'est à l'IA de jouer + ChangePcourant(); + } // fin else match null + + return bQuitter; +} + +//================================================= +// Cette fonction envoi un signal pour que l'IA puisse Jouer +void CPlateauView::FaitJouerIA(void) +{ + // -- Variables locales + SDL_Event event; + // -- Fin Variables locales + + event.type = SDL_USEREVENT; + SDL_PushEvent(&event); +} + +//================================================= +// Change le pion courant +void CPlateauView::ChangePcourant() +{ + pPionCourant->Hide(); + if (pPionCourant == pPionRouge) + pPionCourant = pPionJaune; + else + pPionCourant = pPionRouge; + pPionCourant->show(); + SDL_Flip(ecran); +} \ No newline at end of file diff --git a/src/plateauview.h b/src/plateauview.h new file mode 100644 index 0000000..c3a84a3 --- /dev/null +++ b/src/plateauview.h @@ -0,0 +1,95 @@ +/*************************************************************************** + plateau.h - description + ------------------- + begin : Sun Oct 29 2000 + copyright : (C) 2000 by NADAL Jean-Baptiste + email : jbnadal@ifrance.com + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + /** + *@author NADAL Jean-Baptiste + */ + + +#ifndef PLATEAU_H +#define PLATEAU_H + +#include + +// dépendance de la classe +class CSprite; +class CPion; +class Jeu; +class CIntro; + +class CPlateauView { +public: + CPlateauView(); + ~CPlateauView(); + /** Lancement du plateau */ + int Lancement(); + /** initialisation de l'interface graphique */ + int initSDL(); + // ================================================= + // Cette fonction retourne la position dans le tableau + // en fonction des coordonnées de la souris passée en paramètres + int PosSouris2Plateau(int x); + + +private: + SDL_Surface *ecran; // pointeur sur la surface d'affichage + CPion* spt_Prouge; // Objet sprite du pion rouge + CPion* spt_Pjaune; // Objet sprite du pion jaune + CPion* pPionHumain; // pointeur sur le pion de l'humain + CPion* pPionOrdi; // pointeur sur le pion de l'ordi + + + CSprite* spt_Plateau; // Sprite du plateau + Jeu* pMoteur; // pointeur sur le moteur du jeu + CIntro* pIntro; // pointeur sur l'Introduction du Jeu + CSprite* pb_MatchNul; // boite pour un match nul + CSprite* pb_VictoireJaune; // boite pour la victoire des jaunes + CSprite* pb_VictoireRouge; // boite pour la victoire des rouges + + CSprite* pb_bVicHumain; // pointeur sur la boite de la victoire de l'humain + CSprite* pb_bVicOrdi; // pointeur sur la boite de victoire de l'ordi + + int nCaseSelect; // Nuero de la case séléctionnée + int nNbPionenJeu; // Nombre de pions en jeu + bool bAbouge; // booleen permettant de savoir le joueur a boug sa souris + + CSprite* pPionRouge; // Pointeur sur le sprite de selection du joueur rouge + CSprite* pPionJaune; // Pointeur sur le sprite de selection du joueur jaune + CSprite* pPionCourant; // Pointeur sur le sprite de selection du joueur courant + + //================================================= + // Fonctions privées + + //================================================= + // Cette fonction est appellée lorsque la souris est en + // déplacement + void slotMouseMove(int x); + //================================================= + // Cette fonction est appellé lorsque l'on clique sur un + // bouton de la souris + // retourne vrai si la partie est terminée + bool slotMouseButtonDown(); + //================================================= + // Cette fonction envoi un signal pour que l'IA puisse Jouer + void FaitJouerIA(void); + //================================================= + // Change le pion courant + void ChangePcourant(); + +}; + +#endif