Forum

Catégorie : Programmes
Forum : Aide à la programmation
Vues : 946
Réponses : 7
Type : discussion
Etat : réponses autorisées

Puissance 4 ralenti par test victoires...

Adrisaboss le 05/02/2010 à 19:26
Bonjour à vous gens heureux!

Je programme actuellement un Puissance 4 quand je m'ennuie en cours de maths, et le programme de la journée c'était le test des victoires en diagonales. J'ai trouvé une solution assez ergonomique niveau code, mais qui fait ramer à mort... :/

Je fais ces tests de victoires uniquement apres qu'un nouveau piont ait été joué.
Voici le bout de code qui m'interesse :
Code

4->dim(L1)
4->dim(L2)
4->Dim(L3)
(6,7)->dim([A]) #[A] étant la matrice contenant les valeurs du contenu des cases :
#0 = vide; 1 = X, 2 = O
... #Autres declarations
Lbl A
... #Tetkey avec Goto Bapres selection d'une touche valide
Lbl B
... #Test si case non prise
... #Dessin des points
... #Test des victoires horizontales et verticales

For(X,0,3)
 For(Z,0,3)
  P-X+Z -> L1(Z+1) #P et Q étant les coordonnées des cases dans la matrice [A]
  Q-X+Z -> L2(Z+1)
  Q+X-Z -> L3(Z+1)
 End
 If min(L1)>0 et min(L2)>0 et max(L1)<8 et max(L2)<7 #Que j'ai pas d'erreur avec les dimensions de [A]
 Then
  If [A](L2(1),L1(1)) != 0 et [A](L2(1),L1(1)) = [A](L2(2),L1(2)) et [A](L2(2),L1(2)) = [A](L2(3),L1(3)) et [A](L2(3),L1(3)) = [A](L2(4),L1(4))
   Goto V
 End
 ... #Memes If avec [A](L3,L1)
End

Lbl V
..."Comment t'es trop un génie t'as gagné!"


Vous auriez des suggestions pour accellerer ou améliorer ca, svp? Parce que je trouve pas plus classe comme algo, mais ya certainement plus rapide...

Ah, et aussi, j'ai pas trouvé mieux que :
Code
If [A](L2(1),L1(1)) != 0 et [A](L2(1),L1(1)) = [A](L2(2),L1(2)) et [A](L2(2),L1(2)) = [A](L2(3),L1(3)) et [A](L2(3),L1(3)) = [A](L2(4),L1(4))
pour tester si les 4 valeurs sont identiques... Le langage a pas l'air d'apprécier les formules comme "If X = Y = Z != 0"

Merci d'avance! happy.gif
linkakro le 05/02/2010 à 19:54
Pour les tests d'égalitées tordues, il y a mieux !
représente le joueur actif par une variable (J=1 pour X ou J=2 pour O ; et au changement de joueur fait 3-J->J)

Code
If [A](L2(1),L1(1))*[A](L2(2),L1(2))*[A](L2(3),L1(3))*[A](L2(4),L1(4))=J^3
gotoV
Adrisaboss le 05/02/2010 à 21:32
Oui, j'y avais pensé, à utiliser ce genre de trucs.
Je mettrai certainement en application pour mon morpions qui est geré qu'avec des listes, avec les outils qu'il y a deja implementés ca sera plus ergonomique, et là aussi en fait, c'est toujours mieux

Mais je crois que ce qui ralentit c'est de faire 9 tours de 2 if...
Je me demandais (et j'ai pas trouvé) si yavait pas moyen de réduire le nombre de tour en testant si le nombre de la liste généré correspond aux limites de la matrice avant plutot que pendant la boucle...

Si vous avez une idée... ^^

En tout cas merci pour ton idée linkakro, je vais le faire en fait happy.gif
Stupid le 06/02/2010 à 21:21
Déjà plutôt que de mettre un Goto tu peux donner la valeur qui correspond au joueur à une variable quelconque qui fait sortir de la boucle principale si !=0.
Les Lbl Goto sont les pires boucles je crois niveau lourdeur (à confirmer).

Personnellement j'en ai refais un en 3/4h en début d'année qui est assez rapide. J'ai plus de pile là, mais jme souviens de deux trois trucs.

Déjà X correspondait à -1 et O à 1, du coup y'avait qu'à faire -J pour changer de joueur. Après j'avais pas besoin que d'une liste, qui donnait le nombre de coups joués dans chaque colonne (L1(1)=nombre de coups joués dans 1), qui donnait aussi la coordonnée de l'ordonnée de la matrice. Une autre ligne de code de type ((Positionnement en longueur de la ou on vient de jouer - décalage par rapport à l'abscisse 0)/taille de la case)->V donnait la coordonnée de l'abscisse de la matrice.
Là ou on venait de jouer, [A](L1(V),V), je le foutais dans une variable (on va dire A, et L1(V) dans B, du coup on gagnait pas mal d'octets.
Pour genre deux diagonales ça faisait un truc comme:

Code

:If B>1 et B<5
:Then
:If V<6 et V>1
:Then
:If H=[A](B+1,V+1) et H=[A](B+2,V+2) et H=[A](B-1,V-1)
:J->C
:End
:If V<7 et V>2
:Then
:If H=[A](B+1,V-1) et H=[A](B+2,V-2) et H=[A](B-1,V+1)
:End
...


Y'a encore moyen de gratter (si on utilise la technique de linkakro qui marche pas avec -1 et 1 ça fait plus que :If J^3=H*[A](B+1,V-1)*[A](B+2,V-2)*[A](B-1,V+1) )
sypotu le 06/02/2010 à 22:40
sextuple post bravo !!! ^^
Monstercrunch le 06/02/2010 à 23:47
J'avoue que j'ai rarement vu ça ^^
Stupid le 07/02/2010 à 15:07
Oui, je pensais que ma connexion internet avait coupé mais elle était juste très lente donc j'ai du cliquer 6 fois avant de laisser tomber. cupsmiley.gif
sypotu le 07/02/2010 à 21:01
lol moi aussi ça m'arrive j'écris depuis une PSP donc j'ai regulierements des pbs