Publié par SFLPMEA le 13/01/2007
Source Qbasic Version 4.5 (ou 1.1). Déplacement aléatoire de plusieurs balles avec tests de collision. Par SFLPMEA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
' *********************************** ' * D‚placement de plusieurs balles * ' * avec tests de collision * ' *********************************** ' TESTBOUM.BAS SCREEN 12: WINDOW SCREEN (1, 1)-(640, 480) OPTION BASE 1 ' ***** TEST DE RAPIDITE Debut! = TIMER DO Tempo& = Tempo& + 1 LOOP UNTIL TIMER > Debut! + .5 Nb% = (10) ' ***** Nombre de balles (MODIFICATION POSSIBLE) DIM R(Nb%) AS INTEGER ' ***** Rayon DIM X(Nb%) AS INTEGER ' ***** Abscisse du centre (C'est un ENTIER) DIM Y(Nb%) AS INTEGER ' ***** Ordonnée du centre Idem DIM CX(Nb%) AS INTEGER ' ***** Pas des abscisses DIM CY(Nb%) AS INTEGER ' ***** Pas des ordonnées ' ***** Formule donnée par Billy pour déterminer une valeur aléatoire ' ***** entre deux limites INCLUSES ' INT ((limite supérieure - limite inférieure + 1) * RND + limite inférieure ' SOIT en utilisant des noms de zones plus courts ' Pour les ENTIERS ' INT (Ls - Li + 1) * RND + Li ' Et pour des SINGLES (Billy ne le dit pas .....) ' A! = (Ls! - Li! + 1) * RND + Li! ' OU PEUT-ETRE A! = (Ls! - Li! + .1) * RND + Li! ' ***** Indication des minis et maxis Rs% = 40: Ri% = 20 ' ** Rayon (s pour supérieur et i pour inférieur) Xs% = 640 - Rs%: Xi% = Rs% ' ** Abscisse du centre Ys% = 480 - Rs%: Yi% = Rs% ' ** Ordonnée du Centre Cxs% = 2: Cxi% = 1 ' ** Pas des Abscisses Cys% = 2: Cyi% = 1 ' ** Pas des ordonnées X.Mini% = Rs%: X.Maxi% = 640 - Rs% ' ***** Pour ne pas sortir de l'écran Y.Mini% = Rs%: Y.Maxi% = 480 - Rs% Couleur% = 8 ' ***** Initialisation des tables (Données de départ) RANDOMIZE TIMER FOR T% = 1 TO Nb% R(T%) = INT(Rs% - Ri% + 1) * RND + Ri% X(T%) = INT(Xs% - Xi% + 1) * RND + Xi% Y(T%) = INT(Ys% - Yi% + 1) * RND + Yi% CX(T%) = (Cxs% - Cxi% + 1) * RND + Cxi% CY(T%) = (Cys% - Cyi% + 1) * RND + Cyi% NEXT T% DO FOR B% = 1 TO Nb% ' ** Zones auxilliaires pour faciliter l'écriture SX% = X(B%): SY% = Y(B%) ' ***** TESTS de COLLISION avec les AUTRES BALLES FOR C% = 1 TO Nb% IF SX% <> X(C%) AND SY% <> Y(C%) THEN ' ***** Ce doit être une balle différente C1.2 = (SX% - X(C%)) ^ 2 ' *** Pitre à Gore décomposé C2.2 = (SY% - Y(C%)) ^ 2 Hypo! = SQR(C1.2 + C2.2) IF Hypo! <= R(B%) + R(C%) + 2 THEN CX(B%) = -CX(B%) ' ***** Je ne sais pas quelle solution est la meilleure 'CY(B%) = -CY(B%) CX(C%) = -CX(C%) 'CY(C%) = -CY(C%) END IF END IF NEXT C% ' ***** TESTS de Tentative de sortie SX% = X(B%): SY% = Y(B%) IF SX% + CX(B%) < X.Mini% OR SX% + CX(B%) > X.Maxi% THEN CX(B%) = -CX(B%) END IF IF SY% + CY(B%) < Y.Mini% OR SY% + CY(B%) > Y.Maxi% THEN CY(B%) = -CY(B%) END IF ' ***** Effacer le cercle existant CIRCLE (X(B%), Y(B%)), R(B%), 0 CIRCLE (X(B%), Y(B%)), R(B%) - 1, 0 ' ***** Calcul des nouvelles coordonnées du centre X(B%) = X(B%) + CX(B%): Y(B%) = Y(B%) + CY(B%) ' ***** Dessiner le nouveau cercle Couleur% = Couleur% + 1 IF Couleur% > 15 THEN Couleur% = 9 CIRCLE (X(B%), Y(B%)), R(B%), Couleur% CIRCLE (X(B%), Y(B%)), R(B%) - 1, Couleur% 'SLEEP NEXT B% FOR Z& = 1 TO Tempo&: NEXT ' ***** Ralentisseur LOOP UNTIL INKEY$ = CHR$(27)