From 4ed51ead51c90e053f6028514a0b1b4a4a36d618 Mon Sep 17 00:00:00 2001 From: ibrahimi Date: Mon, 16 Mar 2026 16:57:51 +0100 Subject: [PATCH 1/2] changement sur le mode de triche --- projet_linea/src/Cercle.java | 5 +++++ projet_linea/src/Jeu.java | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/projet_linea/src/Cercle.java b/projet_linea/src/Cercle.java index 36a7cec..cea411a 100644 --- a/projet_linea/src/Cercle.java +++ b/projet_linea/src/Cercle.java @@ -143,6 +143,11 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl } } + // Méthode pour réinitialiser la vitesse + public void resetVitesse(){ + vitesse = 0; + } + } diff --git a/projet_linea/src/Jeu.java b/projet_linea/src/Jeu.java index 4ad8c5b..1acd390 100644 --- a/projet_linea/src/Jeu.java +++ b/projet_linea/src/Jeu.java @@ -245,6 +245,13 @@ public class Jeu implements KeyListener, ActionListener{ this.ecran.repaint(); // 3. Forcer l'affichage du texte GestionBDD.ajouterScore((int)this.score);// enregistrement du score dans la base de donne + } else if (this.modeTriche && this.laLigne.getSegCourant() != null) { + // En mode triche, forcer le cercle à rester sur la ligne + double yPoint = this.laLigne.SegCourant.y + (this.laLigne.SegCourant.yLong / this.laLigne.SegCourant.xLong) * (this.demiCercleAvant.x - this.laLigne.SegCourant.x); + this.demiCercleAvant.y = yPoint; + this.demiCercleArriere.y = yPoint; + this.demiCercleAvant.resetVitesse(); + this.demiCercleArriere.resetVitesse(); } } From 69ebe7a09a3ab94984c3a34d8455dda88c6b37d6 Mon Sep 17 00:00:00 2001 From: llample3 Date: Tue, 17 Mar 2026 15:03:07 +0100 Subject: [PATCH 2/2] bdd connexion utilisateur --- projet_linea/UserScoreBDD.db | Bin 0 -> 20480 bytes projet_linea/bin/BonusMalus.class | Bin 1812 -> 1442 bytes .../bin/BoutonScoresUtilisateur$1.class | Bin 0 -> 1639 bytes .../bin/BoutonScoresUtilisateur.class | Bin 0 -> 843 bytes projet_linea/bin/CadreDeConnexion.class | Bin 0 -> 5689 bytes projet_linea/bin/Cercle.class | Bin 2517 -> 2248 bytes projet_linea/bin/GestionBDD.class | Bin 4102 -> 7300 bytes projet_linea/bin/Jeu$1.class | Bin 1818 -> 0 bytes projet_linea/bin/Jeu.class | Bin 5721 -> 5321 bytes projet_linea/bin/Ligne.class | Bin 2857 -> 2358 bytes projet_linea/bin/LineaAppli.class | Bin 506 -> 304 bytes projet_linea/bin/Niveau.class | Bin 1246 -> 993 bytes projet_linea/bin/NiveauxDataConnect.class | Bin 5317 -> 4698 bytes projet_linea/bin/ObjetGraphique.class | Bin 748 -> 615 bytes projet_linea/bin/Segment.class | Bin 1217 -> 977 bytes projet_linea/bin/ZoneDessin.class | Bin 2585 -> 2263 bytes projet_linea/bin/bddInit.class | Bin 1308 -> 1135 bytes projet_linea/src/BoutonScoresUtilisateur.java | 47 ++++ projet_linea/src/CadreDeConnexion.java | 138 +++++++++++ projet_linea/src/GestionBDD.java | 223 +++++++++++++++--- projet_linea/src/Jeu.java | 48 +--- projet_linea/src/LineaAppli.java | 6 +- 22 files changed, 382 insertions(+), 80 deletions(-) create mode 100644 projet_linea/UserScoreBDD.db create mode 100644 projet_linea/bin/BoutonScoresUtilisateur$1.class create mode 100644 projet_linea/bin/BoutonScoresUtilisateur.class create mode 100644 projet_linea/bin/CadreDeConnexion.class delete mode 100644 projet_linea/bin/Jeu$1.class create mode 100644 projet_linea/src/BoutonScoresUtilisateur.java create mode 100644 projet_linea/src/CadreDeConnexion.java diff --git a/projet_linea/UserScoreBDD.db b/projet_linea/UserScoreBDD.db new file mode 100644 index 0000000000000000000000000000000000000000..49f67612a07ac630466a1b9b1423c7e7b2c9d66e GIT binary patch literal 20480 zcmeI(PjAyO90p+9NxP*|7cP^pmU^JkCZsXAQzmbU)}>pPO7v8PHb{}OcFP~&y50Ao zcHpCM;!;iwPB=*c=fHsr(x%r+9J_X${GR5LSUx`+#(5;(Ez^rI7yIN1p_IH5f)LVL z@9Iz`rgC##E)P^I|E<^}&u)Ko?R#Q&zY&|;cUzxS0SN*SfB*y_009U<00Izz00jP* z!1b}Y!8xZlMIOFQqHMNI>#TL)%RwMTFnB$bqWWF*J3^&+E?h5=N75IkzI!t8C*oL6 z#9$nZTu+^KBE4X@>iIrQq9Xm>+ZzSK8xMzdW0A*6oQ1jSG5s@S-F7(grF-O+w zvNm^nl*Eg9^l=?*Smev9KGkk&x~EkP^`LE*4_jC5)c#7;h6Di!KmY;|fB*y_009U< z00Izzz+(~UQj_rQq?m=--t+wz9TgX~)!aO0UOn6Zapw?#00bZa0SG_<0uX=z1Rwwb2ac0A|teKLN6t B#Z&+Q literal 0 HcmV?d00001 diff --git a/projet_linea/bin/BonusMalus.class b/projet_linea/bin/BonusMalus.class index b44426dd410938baf200e1164f83b636e76ef494..6119438003f22e733dcd7ab1a3b1e9d032764df6 100644 GIT binary patch literal 1442 zcmZuwZBrXn6n<`Yvzvqs0UBbk1zTU*WK%#LrxmFRg|@~Lf`Hh7A6UXB1h-k5Y^?kO zzjgfNsH1-Em(FzRG_=!k`~m(Ae}*$1pOcryw`6wjo^zjb?s=Yb?(ff^{RZHDd>%sx znhD)P7>2@daqrL#ZZw>ugW8>zt6*HI)oZ~A3R)(+6-5M56EO=zuoPlf{d%ieaJ*Ji zA?%ccT17!^3u@Rx0wW9$oSNq`kIIXC%)%)oX??|KSv)BVFLgY}Vog|hSu#i5X3$9< z#TiVRn6mH+&a%8i=SyeSxf{$b`JUh4snv$-))hup{<$+B!>f4B#OoH`zSAEtN$?W8JB*a)qQgr@|h0X#*aT#MK-lb4WZlmnEF}#O)6IU$uhN5@*dQQDM zTX2E{o^<5jCF{)ca+dO4MoIz}EnLNtg5JE-V1;^yn=x))vv3_ZSU}Yc)}3Rigy1UxCz2`PI zojvJuWU*4Il@DC@CiOQ_`>M}NaC{?h%3l>9-h84KpiUN#?WL ztaHO}HOlVwnw*gs%-xLi73VlQAxf%2$^7t(@x7H}NZX_*j8FJpr?p0;!S$^D1j^Ri zFzt~<8*%$W8>4o%jd6QC+(!CQC({PsQ_KLwpmUW$O)!6wCrlvD$sFe1CO++D|AV=8 zdVaPa!~6mIBd+Q1Vds9q=@XpG(HygMEvS)2xfH$XrWh=B8+Psq sJ{qtQ(tu7ZZ%Pk4Nu+qgoTr-)`Jp<(4xqe4{{vn950s#7hKI287mNY@)Bpeg literal 1812 zcmaJ>+fy4=9R8Nw>?Y|_5Ca79Le0mj`HdYGftgCJC5U{5B^Kebo|aHAsxptGkebOe))dClfRz-_6L9*Y6f}~#BX@@ zW@Fy2H5&#r1!s%fyCS&d+xt82-KJ0w6^$UYQJ`!nh}cfxRut%g?bd44D|s^4+`1cF zCy~nKHqvVfv^lRV;!ttcL>zqz)Kq#c1_dvfFrZ87WfM`vBsFMa2*V6@pI=T&MohdC zN)9CVs)-161$_m#E*6@5+rnS5w`KByg6G(^HQRS3-xg}Yj@wXR7P_rvSz05o{b0RA zl-SC)Y@Hp>Rw}NuBYXuzslu-PjXh=G3#M8aIE}0<`~uPjQiSJJJ?GUt--Lw>BUODN z>I(Y1-k~}h#{{MfOtSA&$4*=m@8Df#Z-^i?CL%9nZ~3R!WQ0p5F5`WgRtWi$Z~_HJ zD$if5va2ROkX5L@C`9A^I4WDzt z8h3r-prxpcQ&}>xflanq6~U5yAUo#D<=Cu4VW%9H=7@UWi+mvVxC<|ET!?7d<&xAL zcAzm#N$#&>!j^HRU|k9-CdyI}59ijbiKZ{bu8FD~XMEXf`i{8i%JuB)Zs4SxKh6;- zm3XMUxzZtUd=BBw$H3d5CXO>aO>*DTQfkMnr|7k`WAt17ea9HEE*v9arH_%c1|!E9 zeN3AkyvFl&MgSvdykmS|eTR633Oo{Y7w4R{<5wyp=M}L5o`4!_QxR@cEc)%kmkAX<7EHC+;;Ju%*OS3C9 z(|?bbR7w*MiX|<)rAef=RV+nL*{$My$F38NdTHKa%PsQ`yH#AsT%6EPFfFlALo6)f z01Oa?1aTPTpUe<0vA-)w;v*s=_$Tuaqxgx|U0e=NaXF;bb@nd!zCOkb5q?NiXGy8J z!N>;G=)~Wskep+J*2uC1O+wjgmDpnfxhhB1oll%mK)g*NEpwVJ<91F3H*u>S=ug%i zrNt_nCfX78NTS1U;JXAq@tnK_V_HjPp5W6eCC@OQ)W|Hi8Rr>RruC$rIl+3@>-!%O z(T>z325x~g6b^Zu%aSH67K_TT?a8pX%b{-d6p&SXfiGE}gzqZ?*+Z+V_?nbPNfKM6 z^bndDdScI!S5>utRz9G1Pv_|(!HIC6w|^ngT3S66Dq&8-Ll-`=|8Noi=fdaLb{S__ ViL!2Go?@qq{lC)CdN(ZL&OgetJX`<( diff --git a/projet_linea/bin/BoutonScoresUtilisateur$1.class b/projet_linea/bin/BoutonScoresUtilisateur$1.class new file mode 100644 index 0000000000000000000000000000000000000000..b9134bd4fcca6ee9439ce6ca6fb10e4de8ff6f49 GIT binary patch literal 1639 zcmZ`(?Q+{x5Ixs%EJs!v{~}gkv!5> z(pTXL_{|JWTbN<^%^T21=?}_Y$#Kk(X2x1&b@%MqvwQcie}4M|zzuXK5W|>;xPfsb z7_tpFkgn6}xSsIuO3Su&w1M=~T9Eyt2e3}eMoTSo?` zHB1{ggR>0!E#XVcbs8%x3^ShS1byKN?|*a|P8ZEmn7^tRSJy3HQtk}S8^~gYVQv`Q z6qapMi6O{H$qaGAFg4^E&K=WiNsr2D1eVR;IF4}4IgOu(7;EyPC1Sdj*c*B zyWHOpPpF5~x(6!a69b>3MoK!Nd-@1_q~Uc9izMH%z@{TbPf1(Hl7Y|gxuWODHn#&B zDnd4sXwc;8N}Ux0t5~BG(v8%lvHMSwfyPPPrs-*tCef^DxHIVLa6UKtYO=PtBXpQp zH_*fe5%YK51B&x`Ppnwnc6$tqgC_C=SzUJb`mQ4!Ss!U^G|Ho%0S&X%*09Ae8S(j_z$}kZIi(rA9@>sr0rFw zdDx&uaohE277f!OO_y!%`@%m zt;MtP%!NY~W)HEDxlAwj$Wc#%61+y0g4SIUGej>>Z?h=l0^Q33eV-$l=h49eEL?(1 z)}ycYC?b#8Yt)d?5YzCrh6>Y=(e&DOu4Dm{}Yha3DPCI>aAzKX3=mjJwqKp@$nG=l^;5Tbw!36*S literal 0 HcmV?d00001 diff --git a/projet_linea/bin/CadreDeConnexion.class b/projet_linea/bin/CadreDeConnexion.class new file mode 100644 index 0000000000000000000000000000000000000000..83b5d19e5319102cb6ef5e74810498ba3cd689fe GIT binary patch literal 5689 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 tL*xlALDwO4u!_?hMoCg$ZD|Zbm7dq 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 Qn}dOafeWZu0IXFI0IWnCiU0rr literal 506 zcmZut+fKqj5ItK8g;D`Q@GkNOn#c!WOi-eUY19NmVtm?`4K67ySz7!xJxFUP>#zAlDb|s&G<#m7#w%4*dewF zmmx!~`RuNh`>~SYsM8wQ*hIxbnS9=eSuCUQve$F4rDZF=5-Y{N?0Pd1#==64Y~G5* zMin_7b{*{L>FiKUxKct9&ee$4{}Ci?EE0yaOB7_z?njC8#kJI*T6}YPsWWXA4bVKD z5-{jRr=Vz2)uzlSr%&d{zAa#zqK5Too}#lHpu9m<4h0mcqn96O!k}FGKQoyz{sVgcU6ud< diff --git a/projet_linea/bin/Niveau.class b/projet_linea/bin/Niveau.class index b7f0f89c7215edce80e09c29cd9a5b4399e993cf..ff7abfa27583999faf1965418191f155086b7e9e 100644 GIT binary patch literal 993 zcmZuvU2hUW6g@+M1-g`vLR;Emty+aGw!Uk9Au%CAe8BL&ER)SN>|&N(ew7cJxH0j; zAK;HNp4pmOmkr6iGjq>9+Gfx2lu$NMF|iAiwTaqDI}*sLg@738@}7wr>V*3%PoO#e$2biG<-4yn zsA*zf6POzn%Jo`~mFr7gXq!0Dg^E9)O4pNqxYo}{COVq5pgh}6fF~wSHE`dHmZAEz zRE{0WD405{AgMnxai%+}&MI26FqDC_lma)s(e_BAtha4geDakvEsY zM|-Y`3$6@DRDm*$s0?otEkLW+-zH)|>$3;Db5PxJzqCL}^XY8`4tRXOy(aBqVfg=k zmFX%99QjV^nRf5|xzZlsoI2*{y1_{Ic*<#~l1wv_Ozo3Qv6D=RlT0a@OW>M#%y`b* zg8e1tf%P52I*DOegBVq-8>3;h^D$ahrx4@NY8PW1TOA`t_bc%NPZ*!0%xEHyDo=a- z)%Z!&X>)_dHF3e)C0ay3#k0Tv*ku;%Dp=oOe7>hDCXYvq7o@!#?jf}LB?Ubt=tU-L tBh9Lp?PWq+X{esEpE>VE@)#xt*!&Pde|%x6%s* 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 Q#xJ=N=IpQV8=OP*e{qM$P5=M^ literal 5317 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 diff --git a/projet_linea/bin/ObjetGraphique.class b/projet_linea/bin/ObjetGraphique.class index 5843ecfb9a87ff1120137877b890223573bb1cdc..f1e9512fd1ade45aff80f671311184ff0ac67ae6 100644 GIT binary patch literal 615 zcmZuv+fKqj5IqYEl~NJGyW#~e0ZimYpHvb9!55+r8X}LSE?9$9YwP8!jETlX6FNd4GHcu!$udA%rzZ0}(_8lE>zSS?rkIc5%0PtSnC;x?y*1 zuOtx89QY|yXo zIlgPDs?7t_y}nl1ikv06A=+>ll3h?HS$lBOHt38(@X9Gp&}}WqfZ@UeMBxcqBc6(- zVh_;o(SJ(-fk}!9A_QfURyu@?1g4N-ZcGyaqh>JsMVTQ1f@+b%9nv?!Pp06Bz%s?T mf1#s)p+$mbF;9_&W{H)JMGMP4%J>}tt7K`7kPDQDu=oM!gJie> literal 748 zcmZuu%TC)s6g`tTHW)V{34|6(dGwVS32*3%DiTT*HW4gZMP=!jfebQn>)37iDpaWm z2_!zCf?q$A9jxZUD65TF40$_xmR@*^T|L1NAMH77T&e6aTyK zh5qo^sw}+vF^aRU*yPPszhzDLNUf zpm&;|c9Rg4AFU4EcJ&>YcQ5hGy+-L^rc$nyFHyO`{4WCJus~~3lP(ci8FN_1bE-K+ zL5+BUMOMKQUg~|B$U$$fure0$h=s8Q_cvD0>5!4K6JX;3Ss^2%`uda2uOByiPd2~B nyRmYUq;e!;x*HSo*t)t!5q;1MwG1_u=aAl0SQI+y+HT`7A?kJ4 diff --git a/projet_linea/bin/Segment.class b/projet_linea/bin/Segment.class index 7a930f0b6482ba96e7165fda9bc1610bda8a3bba..170829812a7bbbaf3c4d0445cc5236e9d8d111e7 100644 GIT binary patch literal 977 zcmZva=~5Fx6opS`8;DInAR#PaaU+ueaYIy=f+8h_h57>v_2&?VFjO+5!$jZ>d>hLu z0m~mgfDdJP?l1uh?5gSI_UW(hJw3nw{QL!A5ld;r5I2y}NFt?>d9%H52W!6danJeG zvK3Mbj_U+V3h|=3)rk&t8c1v0fL1Uz?RwL80|j-&uPWOajc(af$EoFYUcn~eK8=0} zCyzEfw=R*K#y}W3Zbt?+hA>QQ&1*I6maovWv2T60D%N38S@jy8Kc7YcqXxz_#xbFA z^J4ovnp<%i8$}20_V}icda(5IG#j5#I zt}``CD3iP6TZbEtOHYjAI-9U!nAVt)RMO$KVcrtHukip6iK*MchtRyLgdc0nw!`na zyXx(b*DcuBt>(7vzqPg-;SE(bbBoum?Cv_XJ)3Ui{wb$j@4RSIE3VTNMS9a~`8E56 zBMcqA&Wx0Z30fZGW5keF45rmkw^)bf9bv;``Kkfa%vufh(! WJjaTZ|Hyx&kFH56THx^*7XJc2J(gGi literal 1217 zcmaJaLEUK=kF_q2+En z=DVu>zGVr7+Qmk_A|ML1JD#nr+I8Dq6X;8&O9H{o#=aFn9}ENi2!}x!1B1|*)t0x* z28PtFqpk0dnM=Ay4TPXcD`7yF0fR-mZoOz7?ODz%bFW7Fp<<(K)=H*h%e(Ikx>dU= z5H9-4^DH7&;F4+r?KZbgM?h=)+O>`^yno~1z%ExUhvcc^q4~kgna6IA(_l~hI z3<%%~_i+UgC)g+<#t=mUalTCOWt{JZ2Zkg)P(+hH(MJ-6=}Ri2IZ2e3M2V2(N$4lI zKr=y_NhVE^<|;;TjTF<0W{EWs%BPXm6ott;l8n?;UAWl$kK$H=U-S*@f$(pm}qqcRr~sVWiQ8ZJT2O# zU_~EJDtLyYAE(5mw7-EtS=I_k{kr8OX0`%-IL+}K;vy}z4GuEwo0v=M)`+R)myN4y zx{3h|bDV*P0ODC=RX1(SvmB$gOELAlW@IS|E}Y{SM?(A|g+mG^{!Ny)ZpC&_n=kYX z`EVW=6ijhk#3hD+xaA3mCArso9y1)5krJQFQEw8@bG(2T#ZU5B^8jAvxPk)N z%rEPv4;`4}n8$)R?QX1C#FBz#4uev1#a(xllm*=y%w=+>f)$2J=d0NuXL4D~i&aW^ z+%&X|iZpU|cJtyZcawJ!CPx95_`!X!{ThAzk$7UbZDM-(f{I04=eU7970-gHtxs8| zkzLyC>Dm0^ct9S^El}lDjT>1#xwbl|n-{gYj4p1w4vXJhN2-Zn%F^an5?X#YknnV~ zkHqVqjtwv64Uo}*SMVwrZqmwy*T|wmbs|)T&P=66-VG=I20Ua_q0@MaJU1N+I2$g3 zg{6B??4dIJ0M)4yYVM(y%mA77MKqAvlJZM!e%Iwv3)+f!k~|$LKYsS(OR0oV5z%cr zl;O4*P&zgk-o#twi-H7a1FPY$Q5z|ud#0?keNH3_AG%2W_8#0J@-vEi!ZI=aSAUG2 z(M$1n{zq@WVcUK&q3m67f;RM#=iR*xCS4#=yqlmZ<#NkphhH)6PiI~3;B<$pp^(Dw-S z1VFV;qn-ZygyN=oAsi`TEb*UOZ{m+n6Pg+$60 zf{`6)Md*Xi|`LpqoPU-1msnh4=9R%_{MKNDcY1?E43eg8|9_ literal 2585 zcmZuzYf}?f7=D%n7M4{A2r3rEJ0wUfYO7*x!$ph)P(c)|)g?K?V%Wvqjfl3j_j~Qd z-s~T6rr&gGnAVw&pZgp72RhSV&<~~0*<4ZbVfUQ#zUO(L_qzG>zu*4=(2x5nDiml_ zwk7(7>zbB|pn`@uMokrO!U-g!xCu)^{#MCBRwG;*R-v3@qPu$DFy5LY|Hfw z%bPIL8Bs}8`BN0=3x?yF;xt3nIpMhqniA4vG~=1+ zC^d|w1f@N^F=ozKhL>@8WA9oz#}Yoopkpk|n%6U;=QwXw9WyP{JFXzm-Z7yd*k`AN zh5(v$gwRj}1sio}sFkbDI&{>k*rK3u4GtPw&?NP?>R5;MD%wca*E1HqXs_+0gp)9q z?2M;j8=5p~?$oghyUE=ZUQVQ7OM8yIyp%f|HY{UCI6WN`D)#0>9+l#Lb6!|7#2WUX zLoyC4sBDkNJ0>K0r;dH-^3&m+cEnY|c&5h8TMW>~G9yJ4-@twa>x-oO?6mD@h@xA9 zA7Ho$o<~2V<0ZVztde`Lk-RqJ*cmIu(3C;@_X(?@E@4_?Br`uPoN;41O$rSOJINX` zSSj4+4};#U$sFs6QkgMHx-rM73CGW$Z{e9tN`G7Ms*cwXV=9dlc{JsDqzzW4)K7Xn z9jq)hW94z`pDhRq4Zr3b1=T4rFE?B^dyZk!e6O8JrbWy$=MB#fdJ9hKh=ZkFE#-!1 zOYQcKvg(WH&wFZ-z=(?BLjL^vEl72Y;xwzz5;r{s8wv>J)K#2iW>)*H;S9!goI?XM zBY6o&nmMoI0w(Fqtl^IMh%D|YSrHd?ye^ehM=ThoMOy)TdX709^O(V5VJxX#uXJZ^~J&|=ydnj;3{TS%&_K)(zC*1FK}X1Fog{bLxTXt483Hr(^-eHc4YA0;VtHyh5^_U#98t&i& z*`FVl`r7w-%#$(h$u;b4e5~UWe9Gh#Rzfg9W$wxoX0#fga~uuEh6mb4CkD<+mS5_) zE3vhdV=U${Iis1-#*$A3=4{r$OgH__PiZ-&3bO8gO0_XN<0QoiQ;vYTQkQp0@7U>a z%Mwms+HhUrs`!!Pu;}*l3866-0=BcV1N@Q%IRh$D#huDs1**B?==LQX-2R(`nWuHW zyx!O4nCD3&Pwx7A;AD6i8^VFdXqJyn;U{RBT*eEJ(aPmEF1Kf~gUdaWp+H-x;=(f8 zvxx8@IvK)WA^Z|p#*0}TeCS&_%;yer0ouqggc{mfkB!*O(_Pq!LwpWmH;zz4CllJo zQS|Vw;22)XbL*u)6+F|zzoIpg#qskcbj_D^5_zAG(wx)Gqwo%T(MKGGU-5#k2dN`% zRfU6e@mZ{cjN_p)MpZ>d18X42AU%t4m47w^ds4{jXcW0Y4o1L)k|6s9u5Z@IBx1Bk}`j I{1mMDAJ0HPpa1{> diff --git a/projet_linea/bin/bddInit.class b/projet_linea/bin/bddInit.class index 22b4134496e98ba37d61129bb36fde6dea4954a9..3780038952b3e08e8d9841c4d129868e62c0392c 100644 GIT binary patch delta 706 zcmY*WOHUI~6#njX;I?Hd&_Z8O9RV$mK71iU#o8i;fAfeg5sO z@FRhf9H$hh2-uHUc#MI!P2I4XhSS89f@#dy`)o!&%Mi8qrD(v1S7&4 zKWt?vgDl561?O?W&P!ptDv7;I4C$iQ5o*2F*1tRT)P`ns)TU5P2eyT2wRF?byQXGX z880p~B;6F>HWYqO0rF4X;sdYEey^G@tL+IacEZtu3)kWLVTh#axRutq47-SfB zr>R(4{ppse)dj~YjaX|mN``JR$ZM^Jpr}o%SMKiAgt?{Fn#9OD>Gn%ccJC^^pR*(| z=LPA!Mkqm+ksX*n0((ymL!M4Y2E6d$Izr?-p+AU~$v*VtK7nrseMcDDbiEVg-CF2l zC x(eM)T_6s?=yg|$zM2MXrK8E{UMaGkqx!q0>(L!W)06Z%ogworI(v%e(vScRA;~?8{ew{0(3kO$!+TtLyvqFi0)r z1g0L#9a-(m@L_em`&ji-fr*;|wO|+*0JL0dAgb#(|c{m$~#&kO<@(V>pkYbYK&A%fe{^$AAY>btUL48`A=XX0W5=aJS-j z3z$MlL(T}4<{O7R+i4tx55027##zRwRFC@1Id~J3OhfGkNt)zw0dHG)>qx5YCrPTd z9k{qiI?<4%N+Sf4X)%0C5GA)g85fKh(ahw>Rp|Re?*#aR2M;74RuO zxA571dIwZ=w-N_m;09aTBQJr?af1$QOdiKD%-wg#E)U6i|62Ss>>OrDa;_>{?jCszF(y j&nk5tTGa71@xGzOX=GpFuCOr0uVG;^N8<(+8La&a$2K@9 diff --git a/projet_linea/src/BoutonScoresUtilisateur.java b/projet_linea/src/BoutonScoresUtilisateur.java new file mode 100644 index 0000000..7cd98b8 --- /dev/null +++ b/projet_linea/src/BoutonScoresUtilisateur.java @@ -0,0 +1,47 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + +public class BoutonScoresUtilisateur { + + public static JButton creerBouton(JFrame fenetre, int utilisateurId) { + + JButton boutonScores = new JButton("Voir mes scores"); + + // Style + boutonScores.setBackground(Color.BLACK); + boutonScores.setForeground(Color.WHITE); + + // Position + boutonScores.setBounds(300, 20, 160, 30); + + // Action au clic + boutonScores.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + + List scores = GestionBDD.recupererScoresUtilisateur(utilisateurId); + int meilleurScore = GestionBDD.recupererMeilleurScoreUtilisateur(utilisateurId); + + StringBuilder message = new StringBuilder(); + message.append("Meilleur score : ").append(meilleurScore).append("\n\n"); + message.append("Tous les scores :\n"); + + for (int score : scores) { + message.append(score).append("\n"); + } + + JOptionPane.showMessageDialog( + fenetre, + message.toString(), + "Mes Scores", + JOptionPane.INFORMATION_MESSAGE + ); + } + }); + + return boutonScores; + } +} \ No newline at end of file diff --git a/projet_linea/src/CadreDeConnexion.java b/projet_linea/src/CadreDeConnexion.java new file mode 100644 index 0000000..0cbb2eb --- /dev/null +++ b/projet_linea/src/CadreDeConnexion.java @@ -0,0 +1,138 @@ +import java.awt.*; +import javax.swing.*; + +public class CadreDeConnexion extends JFrame { + + public CadreDeConnexion() { + // 1. Configuration de base + setTitle("Connexion Linea"); + setSize(800, 600); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setLocationRelativeTo(null); // Centre la fenêtre + + // 2. Style du panneau principal (Gris foncé) + JPanel panel = new JPanel(new GridBagLayout()); + panel.setBackground(new Color(30, 30, 30)); + add(panel); + + // Conteneur pour les éléments (pour les empiler verticalement) + Box box = Box.createVerticalBox(); + + // 3. Création des composants + JLabel titre = new JLabel("CONNEXION"); + titre.setForeground(Color.WHITE); + titre.setFont(new Font("Arial", Font.BOLD, 24)); + titre.setAlignmentX(Component.CENTER_ALIGNMENT); + + JTextField userField = new JTextField(15); + userField.setMaximumSize(new Dimension(250, 30)); + + JPasswordField passField = new JPasswordField(15); + passField.setMaximumSize(new Dimension(250, 30)); + + JButton loginBtn = new JButton("Entrer"); + loginBtn.setBackground(new Color(70, 130, 180)); // Bleu acier + loginBtn.setForeground(Color.WHITE); + loginBtn.setFocusPainted(false); + loginBtn.setAlignmentX(Component.CENTER_ALIGNMENT); + + // 4. Ajout des composants avec des espaces (Struts) + box.add(titre); + box.add(Box.createVerticalStrut(30)); // Espace + box.add(new JLabel("Utilisateur :")); + box.add(userField); + box.add(Box.createVerticalStrut(15)); + box.add(new JLabel("Mot de passe :")); + box.add(passField); + box.add(Box.createVerticalStrut(30)); + box.add(loginBtn); + box.add(Box.createVerticalStrut(10)); + + JButton createBtn = new JButton("Créer un compte"); + createBtn.setBackground(new Color(70, 130, 180)); + createBtn.setForeground(Color.WHITE); + createBtn.setFocusPainted(false); + createBtn.setAlignmentX(Component.CENTER_ALIGNMENT); + box.add(createBtn); + + panel.add(box); // Ajoute la boîte au centre du GridBagLayout + + // 5. Logique du bouton + loginBtn.addActionListener(e -> { + String user = userField.getText(); + String pass = new String(passField.getPassword()); + int userId = GestionBDD.verifierConnexion(user, pass); + + if (userId != -1) { + dispose(); + Jeu jeu = new Jeu(userId); + jeu.demarrer(); + } else { + JOptionPane.showMessageDialog(this, "Acces refuse"); + } + }); + + createBtn.addActionListener(evt -> { + JFrame createFrame = new JFrame("Creation de compte"); + createFrame.setSize(800, 600); + createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + createFrame.setLocationRelativeTo(null); + + JPanel createPanel = new JPanel(new GridBagLayout()); + createPanel.setBackground(new Color(30, 30, 30)); + createFrame.add(createPanel); + + Box createBox = Box.createVerticalBox(); + + JLabel createTitre = new JLabel("CREATION DE COMPTE"); + createTitre.setForeground(Color.WHITE); + createTitre.setFont(new Font("Arial", Font.BOLD, 24)); + createTitre.setAlignmentX(Component.CENTER_ALIGNMENT); + + JTextField newUserField = new JTextField(15); + newUserField.setMaximumSize(new Dimension(250, 30)); + + JPasswordField newPassField = new JPasswordField(15); + newPassField.setMaximumSize(new Dimension(250, 30)); + + JButton createAccountBtn = new JButton("Créer"); + createAccountBtn.setBackground(new Color(70, 130, 180)); + createAccountBtn.setForeground(Color.WHITE); + createAccountBtn.setFocusPainted(false); + createAccountBtn.setAlignmentX(Component.CENTER_ALIGNMENT); + + createBox.add(createTitre); + createBox.add(Box.createVerticalStrut(30)); + createBox.add(new JLabel("Nouvel utilisateur :")); + createBox.add(newUserField); + createBox.add(Box.createVerticalStrut(15)); + createBox.add(new JLabel("Mot de passe :")); + createBox.add(newPassField); + createBox.add(Box.createVerticalStrut(30)); + createBox.add(createAccountBtn); + + createPanel.add(createBox); + + createAccountBtn.addActionListener(e -> { + String u = newUserField.getText().trim(); + String p = new String(newPassField.getPassword()); + if (u.isEmpty() || p.isEmpty()) { + JOptionPane.showMessageDialog(createFrame, "Utilisateur et mot de passe requis"); + return; + } + + boolean ok = GestionBDD.creerUtilisateur(u, p); + if (ok) { + JOptionPane.showMessageDialog(createFrame, "Compte cree avec succes."); + createFrame.dispose(); + } else { + JOptionPane.showMessageDialog(createFrame, "Échec : le nom d'utilisateur existe deja ou erreur."); + } + }); + + createFrame.setVisible(true); + }); + + setVisible(true); + } +} diff --git a/projet_linea/src/GestionBDD.java b/projet_linea/src/GestionBDD.java index 4cf46fb..ec9004b 100644 --- a/projet_linea/src/GestionBDD.java +++ b/projet_linea/src/GestionBDD.java @@ -4,85 +4,157 @@ import java.util.List; public class GestionBDD { - private static final String URL = "jdbc:sqlite:score.db"; + private static final String URL = "jdbc:sqlite:UserScoreBDD.db"; - //connexion bdd + // connexion BDD private static Connection connecter() throws SQLException { return DriverManager.getConnection(URL); } - //creation de la table score a ca premiere execution - public static void creerTableSiAbsente() { + // Création table utilisateur + public static void creerTableUtilisateurSiAbsente() { String sql = """ - CREATE TABLE IF NOT EXISTS scores ( + CREATE TABLE IF NOT EXISTS utilisateur ( id INTEGER PRIMARY KEY AUTOINCREMENT, - score INTEGER NOT NULL, - date TEXT NOT NULL + username TEXT NOT NULL UNIQUE, + password TEXT NOT NULL ); """; - try (Connection connexion = connecter(); - Statement statement = connexion.createStatement()) { + try (Connection conn = connecter(); + Statement stmt = conn.createStatement()) { - statement.execute(sql); + stmt.execute(sql); } catch (SQLException e) { e.printStackTrace(); } } - // Ajouter un score a la fin de la partie - public static void ajouterScore(int score) { + // Création table score + public static void creerTableScoreSiAbsente() { - String sql = "INSERT INTO scores(score, date) VALUES(?, ?)"; + String sql = """ + CREATE TABLE IF NOT EXISTS score ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + valeur INTEGER NOT NULL, + utilisateur_id INTEGER, + FOREIGN KEY(utilisateur_id) REFERENCES utilisateur(id) + ); + """; - try (Connection connexion = connecter(); - PreparedStatement requete = connexion.prepareStatement(sql)) { + try (Connection conn = connecter(); + Statement stmt = conn.createStatement()) { - requete.setInt(1, score); - requete.setString(2, java.time.LocalDate.now().toString()); - - requete.executeUpdate(); + stmt.execute(sql); } catch (SQLException e) { e.printStackTrace(); } } - // Récupérer tous les scores - public static List recupererTousLesScores() { + // Créer un utilisateur + public static boolean creerUtilisateur(String username, String password) { - List listeScores = new ArrayList<>(); + String sql = "INSERT INTO utilisateur(username, password) VALUES(?, ?)"; - String sql = "SELECT score FROM scores ORDER BY date DESC"; + try (Connection conn = connecter(); + PreparedStatement stmt = conn.prepareStatement(sql)) { - try (Connection connexion = connecter(); - Statement statement = connexion.createStatement(); - ResultSet resultat = statement.executeQuery(sql)) { + stmt.setString(1, username); + stmt.setString(2, password); - while (resultat.next()) { - listeScores.add(resultat.getInt("score")); + stmt.executeUpdate(); + return true; + + } catch (SQLException e) { + System.out.println("Utilisateur déjà existant !"); + return false; + } + } + + // Vérifier connexion utilisateur + public static int verifierConnexion(String username, String password) { + + String sql = "SELECT id FROM utilisateur WHERE username = ? AND password = ?"; + + try (Connection conn = connecter(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setString(1, username); + stmt.setString(2, password); + + ResultSet rs = stmt.executeQuery(); + + if (rs.next()) { + return rs.getInt("id"); } } catch (SQLException e) { e.printStackTrace(); } - return listeScores; + return -1; } - // Récupérer le meilleur score - public static int recupererMeilleurScore() { + // Ajouter score + public static void ajouterScore(int score, int utilisateurId) { - String sql = "SELECT MAX(score) AS meilleur FROM scores"; + String sql = "INSERT INTO score(valeur, utilisateur_id) VALUES(?, ?)"; - try (Connection connexion = connecter(); - Statement statement = connexion.createStatement(); - ResultSet resultat = statement.executeQuery(sql)) { + try (Connection conn = connecter(); + PreparedStatement stmt = conn.prepareStatement(sql)) { - if (resultat.next()) { - return resultat.getInt("meilleur"); + stmt.setInt(1, score); + stmt.setInt(2, utilisateurId); + + stmt.executeUpdate(); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + // Récupérer scores d'un utilisateur + public static List recupererScoresUtilisateur(int utilisateurId) { + + List scores = new ArrayList<>(); + + String sql = "SELECT valeur FROM score WHERE utilisateur_id = ? ORDER BY valeur DESC"; + + try (Connection conn = connecter(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setInt(1, utilisateurId); + + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + scores.add(rs.getInt("valeur")); + } + + } catch (SQLException e) { + e.printStackTrace(); + } + + return scores; + } + + // Meilleur score d'un utilisateur + public static int recupererMeilleurScoreUtilisateur(int utilisateurId) { + + String sql = "SELECT MAX(valeur) as meilleur FROM score WHERE utilisateur_id = ?"; + + try (Connection conn = connecter(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setInt(1, utilisateurId); + + ResultSet rs = stmt.executeQuery(); + + if (rs.next()) { + return rs.getInt("meilleur"); } } catch (SQLException e) { @@ -91,4 +163,79 @@ public class GestionBDD { return 0; } -} + + // Meilleur score global + public static int recupererMeilleurScoreGlobal() { + + String sql = "SELECT MAX(valeur) as meilleur FROM score"; + + try (Connection conn = connecter(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { + + if (rs.next()) { + return rs.getInt("meilleur"); + } + + } catch (SQLException e) { + e.printStackTrace(); + } + + return 0; + } + + // Vérifier si un utilisateur existe (par username) + public static boolean utilisateurExiste(String username) { + String sql = "SELECT 1 FROM utilisateur WHERE username = ?"; + + try (Connection conn = connecter(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setString(1, username); + + ResultSet rs = stmt.executeQuery(); + return rs.next(); + + } catch (SQLException e) { + e.printStackTrace(); + } + + return false; + } + + // Créer un compte et retourner l'id de l'utilisateur créé, ou -1 en cas d'erreur + public static int creerCompte(String username, String password) { + if (username == null || username.isBlank() || password == null || password.isBlank()) { + return -1; + } + + if (utilisateurExiste(username)) { + return -1; // déjà existant + } + + String sql = "INSERT INTO utilisateur(username, password) VALUES(?, ?)"; + + try (Connection conn = connecter(); + PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + + stmt.setString(1, username); + stmt.setString(2, password); + + int affected = stmt.executeUpdate(); + if (affected == 0) { + return -1; + } + + try (ResultSet keys = stmt.getGeneratedKeys()) { + if (keys.next()) { + return keys.getInt(1); + } + } + + } catch (SQLException e) { + e.printStackTrace(); + } + + return -1; + } +} \ No newline at end of file diff --git a/projet_linea/src/Jeu.java b/projet_linea/src/Jeu.java index 1acd390..d8bdcb1 100644 --- a/projet_linea/src/Jeu.java +++ b/projet_linea/src/Jeu.java @@ -40,6 +40,8 @@ public class Jeu implements KeyListener, ActionListener{ protected boolean jeuCommence = false; protected boolean modeTriche = false; + + private int utilisateurId; //------------------------------------------------------------------------- // METHODES @@ -48,7 +50,11 @@ public class Jeu implements KeyListener, ActionListener{ //------------------------------------------------------------------------- // Constructeur de la classe //------------------------------------------------------------------------- - public Jeu(){ + public Jeu(int utilisateurId){ + this.utilisateurId = utilisateurId; + // Créer les tables si elles n'existent pas + GestionBDD.creerTableUtilisateurSiAbsente(); + GestionBDD.creerTableScoreSiAbsente(); // Gestion du score : a réactiver en fin de TP, inutile au début ecran.setLayout(null); @@ -145,42 +151,9 @@ public class Jeu implements KeyListener, ActionListener{ ecran.requestFocusInWindow(); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // 🔹 Création du bouton Voir Scores - javax.swing.JButton boutonScores = new javax.swing.JButton("Voir mes scores"); - boutonScores.setBackground(Color.BLACK); // Couleur fond - boutonScores.setForeground(Color.WHITE); // Couleur texte - //boutonScores.setFont(new Font("Arial", Font.BOLD, 14)); // Police - // Position du bouton - boutonScores.setBounds(300, 20, 160, 30); - - // Action quand on clique - boutonScores.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - - java.util.List scores = GestionBDD.recupererTousLesScores(); - int meilleurScore = GestionBDD.recupererMeilleurScore(); - - StringBuilder message = new StringBuilder(); - message.append("Meilleur score : ").append(meilleurScore).append("\n\n"); - message.append("Tous les scores :\n"); - - for (int score : scores) { - message.append(score).append("\n"); - } - - javax.swing.JOptionPane.showMessageDialog( - fenetre, - message.toString(), - "Mes Scores", - javax.swing.JOptionPane.INFORMATION_MESSAGE - ); - } - }); - - // affichier le bouton à l'écran - ecran.setLayout(null); + // 🔹 Bouton Voir Scores (appel de la classe externe) + javax.swing.JButton boutonScores = BoutonScoresUtilisateur.creerBouton(fenetre, utilisateurId); ecran.add(boutonScores); // Création du timer @@ -244,7 +217,8 @@ public class Jeu implements KeyListener, ActionListener{ this.ecran.partiePerdue = true; // 2. Signaler à l'écran this.ecran.repaint(); // 3. Forcer l'affichage du texte - GestionBDD.ajouterScore((int)this.score);// enregistrement du score dans la base de donne + GestionBDD.ajouterScore((int)score, utilisateurId);// enregistrement du score dans la base de donne + } else if (this.modeTriche && this.laLigne.getSegCourant() != null) { // En mode triche, forcer le cercle à rester sur la ligne double yPoint = this.laLigne.SegCourant.y + (this.laLigne.SegCourant.yLong / this.laLigne.SegCourant.xLong) * (this.demiCercleAvant.x - this.laLigne.SegCourant.x); diff --git a/projet_linea/src/LineaAppli.java b/projet_linea/src/LineaAppli.java index 9c8ee13..08ecd84 100644 --- a/projet_linea/src/LineaAppli.java +++ b/projet_linea/src/LineaAppli.java @@ -5,11 +5,7 @@ public class LineaAppli { //------------------------------------------------------------------------- public static void main(String[] arg) { - GestionBDD.creerTableSiAbsente(); - - Jeu jeu = new Jeu(); - - jeu.demarrer(); + new CadreDeConnexion(); }