Puissance 4 VB.net

Puissance 4 VB.net - VB/VBA/VBS - Programmation

Marsh Posté le 10-06-2009 à 20:13:38    

Bonjour, je réalise actuellement un puissance 4 en VB.net sur visual studio.
J'ai réalisé un tableau de PictureBox, à chaque fois que l'utilisateur place un pion, ce tableau est converti dans un autre tableau appelé TabConverti(), si la pion du joueur 1 est placé la case sera égale à 1 sinon à 2 pour un pion du joueur 2.
 
Ensuite la procédure verif() vérifie si (selon le pion placé) il vient de compléter une ligne, une colonne ou une diagonale. J'ai tenté de faire cette procédure verif() mais ça ne marche pas. Même si quatre pions sont alignés, aucun message ne s'affiche :
 
 

Code :
  1. Private Sub verif()
  2.         Dim i As Integer
  3.         Dim j As Integer
  4.         For i = 1 To 7
  5.             For j = 1 To 6
  6.                 If ((TabConverti(i, j) = "1" Or TabConverti(i, j) = "2" )) Then
  7.                     MsgBox("voila" )
  8.                     If ((TabConverti(i, j) = TabConverti(i + 1, j)) And (TabConverti(i + 1, j) = TabConverti(i + 2, j)) And (TabConverti(i + 2, j) = TabConverti(i + 3, j))) Then
  9.                          MsgBox("Gagné" & MsgBoxStyle.Critical)
  10.                      
  11.                     End If
  12.                 End If
  13.             Next
  14.         Next
  15.         For i = 1 To 7
  16.             For j = 1 To 3
  17.                 If (TabConverti(i, j) = "1" Or TabConverti(i, j) = "2" ) Then
  18.                     MsgBox("Félicitation ! " )
  19.                     If ((TabConverti(i, j) = TabConverti(i, j + 1)) And (TabConverti(i, j + 1) = TabConverti(i, j + 2)) And (TabConverti(i, j + 2) = TabConverti(i, j + 3))) Then
  20.                          MsgBox("Gagné" & MsgBoxStyle.Critical)
  21.                        
  22.                     End If
  23.                 End If
  24.             Next
  25.         Next
  26.         For i = 1 To 4
  27.             For j = 1 To 3
  28.                 If (TabConverti(i, j) = "1" Or TabConverti(i, j) = "2" ) Then
  29.                     If ((TabConverti(i, j) = TabConverti(i + 1, j + 1)) And (TabConverti(i + 1, j + 1) = TabConverti(i + 2, j + 2)) And (TabConverti(i + 2, j + 2) = TabConverti(i + 3, j + 3))) Then
  30.                         MsgBox("Gagné" & MsgBoxStyle.Critical)
  31.                      
  32.                     End If
  33.                 End If
  34.             Next
  35.         Next
  36.         For i = 1 To 4
  37.             For j = 4 To 6
  38.                 If (TabConverti(i, j) = "1" Or TabConverti(i, j) = "2" ) Then
  39.                     If ((TabConverti(i, j) = TabConverti(i + 1, j - 1)) And (TabConverti(i + 1, j - 1) = TabConverti(i + 2, j - 2)) And (TabConverti(i + 2, j - 2) = TabConverti(i + 3, j - 3))) Then
  40.                         MsgBox("Gagné" & MsgBoxStyle.Critical)
  41.                        
  42.                     End If
  43.                 End If
  44.             Next
  45.         Next
  46.     End Sub


 
 
 
Est-ce que quelqu'un saurait comment résoudre ce problème?

Reply

Marsh Posté le 10-06-2009 à 20:13:38   

Reply

Marsh Posté le 10-06-2009 à 21:19:57    

Bonjour,
 
Il faut avant tout vérifier le type déclaré pour le tableau: integer? variant? string?  
"1" et 1 sont différents...
 
Bon courage
 
ProduVBA, autoentrepreneur en informatique

Reply

Marsh Posté le 10-06-2009 à 21:28:38    

TabConverti(i, j) est déclaré en String donc ça devrait marcher normalement, je ne suis pas sur de mes tests en fait je m'embrouille dans les lignes et colonnes

Reply

Marsh Posté le 10-06-2009 à 21:49:29    

Line88 a écrit :

TabConverti(i, j) est déclaré en String donc ça devrait marcher normalement, je ne suis pas sur de mes tests en fait je m'embrouille dans les lignes et colonnes


 
Tu m'étonnes que tu t'embrouilles, c'est pas super lisible ton histoire !  ;)  
 
Si ce n'est qu'un exercice pour un vague cours d'informatique pas important, effectivement, vaut mieux ne pas se prendre la tête et partir sur un code comme le tien à base de répétition de "for" et de "if" (au risque de t'embrouiller), mais si tu te destines à programmer souvent, je te conseille fortement de te pencher sur la récursivité, ça s'applique exactement à ce genre de situation. En quelques lignes, tu remplacerais efficacement tout ton pavé, et tu pourrais voir facilement si tu couvres bien tous les cas de figure.
 
Si tu as besoin d'un petit exemple, n'hésite pas à demander.


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 10-06-2009 à 22:48:50    

Oui je veux bien un petit exemple car je dois rendre mon TP rapidement et je n'arrive vraiment pas à résoudre cette vérification

Reply

Marsh Posté le 10-06-2009 à 22:58:25    

Line88 a écrit :

Oui je veux bien un petit exemple car je dois rendre mon TP rapidement et je n'arrive vraiment pas à résoudre cette vérification


 
Je veux bien te faire un petit truc rapide, mais si c'est pour un TP et que vous n'avez pas encore abordé la récursivité, ne l'utilise pas, on verra tout de suite que ce n'est pas de toi ! Ça va changer radicalement la méthode de vérification.


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 10-06-2009 à 23:03:43    

Non mais j'ai vu la récursivité en cours mais je suis vraiment perdu je m'embrouille ...

Reply

Marsh Posté le 10-06-2009 à 23:32:52    

Bon, c'est fait comme ça, je l'ai pas testé, doit y avoir des merdes, ou peut-être juste de l'optimisation, je vais éditer 50 fois mon message, mais c'est juste à titre indicatif.
 
Je ne te donne pas de commentaires, j'aimerais savoir si tu comprends le code par toi-même (sinon, encore une fois, n'utilise pas un code que tu ne sais pas expliquer, tu vas au casse-pipe). Je répondrais néanmoins à tes questions.
 
Si tu l'utilises, j'aimerais que tu le ré-écrives par toi-même, histoire que je ne fasse pas ton boulot à ta place (c'est contre la charte du forum  :ange: )
 

Code :
  1. Private Sub verif(TabConverti[] as String)
  2. Dim i as Integer
  3. Dim j as Integer
  4. Dim victoire=false as boolean
  5. for i=1 to LARGEUR_DE_LA_GRILLE
  6.  for j=1 To HAUTEUR_DE_LA_GRILLE
  7.   if not victoire and not IsNull(TabConverti(i, j)) Then
  8.    if alignement(i,j,1,0,TabConverti(i, j)) >= 4 then victoire=true
  9.    if alignement(i,j,0,1,TabConverti(i, j)) >= 4 then victoire=true
  10.    if alignement(i,j,1,1,TabConverti(i, j)) >= 4 then victoire=true
  11.    if i>=4 then
  12.     if alignement(i,j,-1,1,TabConverti(i, j)) >= 4 then victoire=true
  13.    end if
  14.   end if
  15.  next
  16. next
  17. if victoire then msgbox "Gagné !"
  18. end sub
  19. Function alignement(pos_i as integer, pos_j as integer, op_i as integer, op_j as integer, joueur as string) As Integer
  20. Dim exploration as Integer
  21. exploration=0
  22. if pos_i <= LARGEUR_DE_LA_GRILLE and pos_j <= HAUTEUR_DE_LA_GRILLE and pos_j > 0 then
  23.  if joueur = TabConverti(pos_i, pos_j) then
  24.   exploration = alignement(pos_i + 1 * op_i, pos_j + 1* op_j, op_i, op_j, joueur) + 1
  25.  end if
  26. end if
  27. return exploration
  28. End Function


 
Précisons, ce ne doit pas être 100% VB.net compliant, y'a plein de trucs dont je ne sais plus la syntaxe exacte vu que je l'ai fait sur bloc-notes (merci le correcteur automatique dans VB...), genre "bool" ou "boolean", "return" ou "nom_de_la_fonction =", ...


Message édité par Turkleton le 11-06-2009 à 02:20:29

---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 00:20:12    

Merci beaucoup, c'est assez compliqué mais je pense avoir compris le système, j'ai corrigé les erreurs et j'ai testé mais pour l'instant toujours aucun message n'affiche que le joueur a gagné malgré l'alignement de 4 de ses pions...

Reply

Marsh Posté le 11-06-2009 à 00:22:45    

Line88 a écrit :

Merci beaucoup, c'est assez compliqué mais je pense avoir compris le système, j'ai corrigé les erreurs et j'ai testé mais pour l'instant toujours aucun message n'affiche que le joueur a gagné malgré l'alignement de 4 de ses pions...


Me suis sans doute planté quelque part, à toi de découvrir où  ;)


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 00:22:45   

Reply

Marsh Posté le 11-06-2009 à 00:24:58    

Oui je vais cherché !!! En tout cas merci bcp !!
Bonne soirée

Reply

Marsh Posté le 11-06-2009 à 00:27:38    

Ce que je ne comprends pas c'est pourquoi dans la fonction alignement il faut rappeler celle-ci, et pourquoi rajouter 1 au résultat... :s

Reply

Marsh Posté le 11-06-2009 à 00:31:17    

Line88 a écrit :

Ce que je ne comprends pas c'est pourquoi dans la fonction alignement il faut rappeler celle-ci, et pourquoi rajouter 1 au résultat... :s


T'es sûr d'avoir vu la récursivité en cours ?  :heink:  C'est le principe même de rappeler une fonction à l'intérieur d'elle-même. Si j'ajoute 1 à chaque fois, c'est pour faire augmenter la longueur de la chaine de pions en train d'être vérifiée. Si c'est au moins égal à 4, tu as ton puissance 4 !


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 00:34:15    

Quel est le type de la variable joueur(ligne 32)  
J'ai un peu de mal j'avoue..

Reply

Marsh Posté le 11-06-2009 à 00:37:29    

Pardon c'est String je viens de retrouver... je ne suis pas sur d'y arriver je vais chercher mais je sens que je vais devoir trouver une autre solution

Reply

Marsh Posté le 11-06-2009 à 00:42:34    

Line88 a écrit :

Pardon c'est String je viens de retrouver... je ne suis pas sur d'y arriver je vais chercher mais je sens que je vais devoir trouver une autre solution


Je t'avais prévenu(e) !  ;)  Ca allège considérablement (pas de gros blocs "for" et "if" ), mais c'est plus compliqué. Néanmoins, si tu destines à la programmation, faudra forcément y passer à un moment ou à un autre. C'est dur, ça fait peur, mais une fois que tu as bien compris le truc, ça peut te faire gagner un max de lignes de code ! (imagine juste que tu joues sur une grille de 7000 par 6000 et que tu dois faire un puissance 25 pour gagner, je n'ai juste que 3 valeurs à changer et c'est ok !)


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 00:46:44    

Oui j'imagine c'est très pratique .. Merci et j'espère trouver la solution !!

Reply

Marsh Posté le 11-06-2009 à 00:53:32    

En fait j'ai encore une question.. joueur est de type String mais il n'est jamais initialisé, à quoi correspond-il?

Reply

Marsh Posté le 11-06-2009 à 01:13:46    

Line88 a écrit :

En fait j'ai encore une question.. joueur est de type String mais il n'est jamais initialisé, à quoi correspond-il?


 
Tu te trompes, il est initialisé ici : "alignement(i,j,1,0,TabConverti(i, j))". Quand j'appelle ma fonction la première fois comme ça, je donne à "joueur" la valeur de la cellule "scannée", c'est à dire la (1,1) au tout premier passage dans la fonction "alignement".
 
Ensuite, pendant la phase récursive, je vais garder cette valeur et la comparer avec la valeur de la cellule suivante dans mon parcours de la chaine de pions. Si elles sont différentes, c'est que la chaine est interrompue, on retourne "0".


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 01:32:16    

J'allais couper mon ordinateur quand je me suis dit que j'allais repasser voir si tu avais répondu, et là : Massive Fail Spotted !!
 
Effectivement, ça ne risquait pas marcher, et ça pouvait même planter.
 
Mes boucles i et j n'étaient pas bien limitées, toutes les cases n'étaient pas vérifiées.
De plus, j'ai rajouté un test ligne 34 pour être sûr de ne pas avoir d'indices en dehors du tableau.
 
C'est édité. Teste-le pour voir, ça devrait être bon maintenant (enfin, j'éspère...)


Message édité par Turkleton le 11-06-2009 à 02:24:45

---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 13:09:59    

En effet maintenant il rentre dans le IF mais il me met que j'ai gagné la partie à chaque fois que je place un pion et non quand 4 pions sont alignés

Reply

Marsh Posté le 11-06-2009 à 14:13:47    

Line88 a écrit :

En effet maintenant il rentre dans le IF mais il me met que j'ai gagné la partie à chaque fois que je place un pion et non quand 4 pions sont alignés


Ca peut venir du "IsNull(TabConverti(i, j)" car je ne sais pas la valeur d'une case vide dans ton tableau. J'ai donc pensé que c'était NULL, mais tu as pu mettre autre chose genre "0".
 
A toi d'adapter le code à ton appli.


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 14:52:09    

Oui j'avais déjà modifié j'ai mis If (Not reussite And Not (TabConverti(i, j) = "0" )) Then
Je ne vois pas d'où vient l'erreur...

Reply

Marsh Posté le 11-06-2009 à 14:55:18    

Line88 a écrit :

Oui j'avais déjà modifié j'ai mis If (Not reussite And Not (TabConverti(i, j) = "0" )) Then
Je ne vois pas d'où vient l'erreur...

 

Fais du pas-à-pas et vérifie les valeurs de tes variables pour comprendre ce qui se passe.

 

EDIT : une précision importante que j'ai oublié de faire, c'est que pour moi le point (1,1) est celui en haut à gauche. Ça change peut-être pour toi.


Message édité par Turkleton le 11-06-2009 à 15:00:17

---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 15:02:41    

Mon (1, 1) est bien en haut à gauche aussi, je vais chercher j'espère trouver une solution.
Merci pour ton aide,
si jamais tu as une idée tiens moi au courant


Message édité par Line88 le 11-06-2009 à 15:03:52
Reply

Marsh Posté le 11-06-2009 à 15:39:31    

Je viens de tester tel quel le code suivant dans une macro VBA Excel (note les 3 constantes, dont je t'ai parlé un peu plus haut) :
 

Code :
  1. Const LARGEUR_DE_LA_GRILLE = 7
  2. Const HAUTEUR_DE_LA_GRILLE = 6
  3. Const LONGUEUR_CHAINE_GAGNANTE = 4
  4. Private Sub verif()
  5. Dim i As Integer
  6. Dim j As Integer
  7. Dim victoire As Boolean
  8. victoire = False
  9. For i = 1 To LARGEUR_DE_LA_GRILLE
  10.   For j = 1 To HAUTEUR_DE_LA_GRILLE
  11.    If Not victoire And Cells(j, i) <> 0 Then
  12.     If alignement(i, j, 1, 0, Cells(j, i)) >= LONGUEUR_CHAINE_GAGNANTE Then victoire = True
  13.     If alignement(i, j, 0, 1, Cells(j, i)) >= LONGUEUR_CHAINE_GAGNANTE Then victoire = True
  14.     If alignement(i, j, 1, 1, Cells(j, i)) >= LONGUEUR_CHAINE_GAGNANTE Then victoire = True
  15.     If i >= LONGUEUR_CHAINE_GAGNANTE Then
  16.      If alignement(i, j, -1, 1, Cells(j, i)) >= LONGUEUR_CHAINE_GAGNANTE Then victoire = True
  17.     End If
  18.    End If
  19.   Next
  20. Next
  21. If victoire Then MsgBox "Gagné !" Else MsgBox "Toujours pas..."
  22. End Sub
  23. Function alignement(pos_i As Integer, pos_j As Integer, op_i As Integer, op_j As Integer, joueur As String) As Integer
  24. Dim exploration As Integer
  25. exploration = 0
  26. If pos_i <= LARGEUR_DE_LA_GRILLE And pos_j <= HAUTEUR_DE_LA_GRILLE And pos_j > 0 Then
  27.   If joueur = Cells(pos_j, pos_i) Then
  28.     exploration = alignement(pos_i + 1 * op_i, pos_j + 1 * op_j, op_i, op_j, joueur) + 1
  29.   End If
  30. End If
  31. alignement = exploration
  32. End Function


 
J'ai testé quelques configurations de grille différentes (remplies de 0, 1 et 2), et à chaque fois j'ai obtenu le résultat que je voulais. Je ne vois pas ce qui cloche chez toi, peut-être en examinant ton code j'en apprendrais un peu plus.
 
EDIT : et commente ton code ! Ça me permettra de savoir si tu en as bien compris le fonctionnement, et accessoirement je pense que tu seras obligé de le faire pour rendre ton TP.


Message édité par Turkleton le 11-06-2009 à 15:47:45

---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 15:52:22    

Je t'envoie ce que j'ai en message privé

Reply

Marsh Posté le 11-06-2009 à 16:21:49    

Line88 a écrit :

Je t'envoie ce que j'ai en message privé


Tu ne passes pas ton tableau TabConverti en paramètre dans ta fonction verif(), c'est normal ? Comment est-il déclaré ?
 
Sinon, il n'y a pas de raison pour que ça ne marche pas. Concernant la nouvelle constante LONGUEUR_CHAINE_GAGNANTE, elle détermine la longueur que doit avoir la chaine de pion pour gagner (par exemple : 4 pour un puissance 4). Tu n'es pas obligée de l'utiliser, c'était juste pour étayer mon propos plus haut comme quoi il suffit de modifier ces 3 constantes pour jouer sur une grille plus grande, ou jouer à un "puissance 25", tout en conservant exactement le même code.
 
EDIT : et les commentaires ???  :whistle:


Message édité par Turkleton le 11-06-2009 à 16:24:09

---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 11-06-2009 à 17:03:32    

Je ne pensais pas que c'était utile car j'utilise TabConverti à l'intérieur.
Et si je met en paramètre TabConverti(i, j) ça ne marche pas.
J'appelle ma fonction verif de la manière suivante: verif(TabConverti(i, j)) et verif serait déclaré comme ceci : Private Sub verif(TabConverti(i, j))
Ca ne fonctionne pas j'appelle deux fois TabConverti donc je ne vois pas l'utilité
 
 
Sinon niveau commentaire je vais les ajouter :)

Reply

Marsh Posté le 11-06-2009 à 18:08:27    

Line88 a écrit :

Je ne pensais pas que c'était utile car j'utilise TabConverti à l'intérieur.
Et si je met en paramètre TabConverti(i, j) ça ne marche pas.
J'appelle ma fonction verif de la manière suivante: verif(TabConverti(i, j)) et verif serait déclaré comme ceci : Private Sub verif(TabConverti(i, j))
Ca ne fonctionne pas j'appelle deux fois TabConverti donc je ne vois pas l'utilité


Houla, tu ferais la fierté de ton prof d'algo là !  :pt1cable: (ou alors je comprends pas ton message...)
 
Tu pensais que c'était inutile de passer ton tableau en paramètre de ta procédure "vérif" parce que tu utilises ce tableau à l'intérieur de cette procédure ? Mais c'est tout le contraire, si tu utilises ton tableau dans ta procédure sans l'avoir passé en paramètre, il va être vide ! (à moins qu'il ne soit déclaré de façon à être visible de partout mais c'est pas une bonne idée). C'est justement parce que tu vas l'utiliser qu'il faut le passer en paramètre.
 
Tu dois déclarer ta procédure comme ceci : "Sub verif(TabConverti() As Integer)" sans i et j à l'intérieur de TabConverti, car tu veux l'intégralité du tableau, et pas juste la valeur de la case (i,j). Dans ta procédure principale, tu l'appelleras de cette manière : "verif TabConverti".
 
Et non, tu "n'appelles pas deux fois" ton tableau. Tu appelles la procédure "verif" en lui disant "tiens, voila les valeurs de mon tableau, tu vas en avoir besoin", et de son côté, tu déclares cette procédure en lui indiquant que pour qu'elle fonctionne, il faut lui fournir les valeurs d'un tableau. Si ça t'embrouille que le même nom revienne, tu peux déclarer verif de cette manière "Private Sub verif(le_tableau_dont_j_ai_besoin_dans_ma_procedure() As Integer)" et changer toutes les occurrences de TabConverti en cet autre nom à l'intérieur de ta procédure verif, ça marchera pareil.
 
C'est très important tout ça, ça fait partie des bases de la programmation de bien comprendre le passage de paramètres dans une procédure/fonction.  
 


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 12-06-2009 à 10:41:19    

Le problème est que lorsque j'appelle verif : verif(TabConverti()) en l'ayant déclaré seulement dans ma procédure qui converti mon tableau dans TabConverti() on me demande des paramètres, est ce que je dois déclaré dans chacun de mes bouton qui correspondent aux colonnes le TabConverti(donc à chaque fois que je l'utilise, ou une seule fois au début de ma classe, ou autre?
 
Et en déclarant une fois avec les paramètres (i, j) et une fois sans les paramètres () ça me met une erreur...
 
Oui j'avoue je suis complètement perdue...

Reply

Marsh Posté le 12-06-2009 à 11:20:38    

Line88 a écrit :

Le problème est que lorsque j'appelle verif : verif(TabConverti()) en l'ayant déclaré seulement dans ma procédure qui converti mon tableau dans TabConverti() on me demande des paramètres, est ce que je dois déclaré dans chacun de mes bouton qui correspondent aux colonnes le TabConverti(donc à chaque fois que je l'utilise, ou une seule fois au début de ma classe, ou autre?
 
Et en déclarant une fois avec les paramètres (i, j) et une fois sans les paramètres () ça me met une erreur...
 
Oui j'avoue je suis complètement perdue...


 
Heu, j'ai du mal à te suivre là. Alors, on va résumer.
 
1 -> Déclaration de TabConverti : "Dim TabConverti(7, 6) As String" (encore que, si c'était moi, je l'aurais déclaré en integer vu qu'il ne va prendre que 0, 1 ou 2 comme valeur). Cette déclaration est à faire dans ta procédure principale vu que tu vas l'utiliser un peu partout (mais vu que je n'ai pas ton code en entier, je peux me tromper)
 
2 -> Dans chaque procédure/fonction où tu vas utiliser ton tableau, il faut le déclarer en paramètre ainsi : "Sub Ma_Procédure(TabConverti() As String)". Si tu veux, tu peux mettre un autre nom que TabConverti ici, pour peu que tu n'utilises que ce nom dans le reste de ta procédure Ma_Procédure.
 
3 -> Ensuite, quand tu appelles ta procédure, fais-le comme ça : "Ma_Procédure TabConverti". Pas de parenthèses ni avant, ni après.
 
Je pense que c'était ce problème qui te bloquait dès le début (ton premier post avec ton premier code). Il ne considérait pas que tu avais gagné malgré l'alignement de 4 pions car le tableau TabConverti utilisé dans la procédure vérif était vide. Pour t'en assurer, fais du pas-à-pas, et surveille quand tu rentres dans ta procédure verif que TabConverti contient bien des valeurs (ou un simple Msgbox TabConverti(1,1) suffirait).


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 13-06-2009 à 20:16:54    

Je l'ai fait mais comme je déclare TabConverti() sans paramètre et ensuite lors du test je lui met les paramètres i et j j'ai des messages d'erreur...

Reply

Marsh Posté le 15-06-2009 à 06:52:49    

Line88 a écrit :

Je l'ai fait mais comme je déclare TabConverti() sans paramètre et ensuite lors du test je lui met les paramètres i et j j'ai des messages d'erreur...


 
Pourquoi tu le déclares sans paramètres ? Je t'ai dit de le déclarer ainsi : "Dim TabConverti(7, 6) As String", y'a bien deux paramètres que je sache !  (encore que ça ne soit pas des paramètres mais juste les deux dimensions de ton tableau) ;)  
 
Quels sont tes messages d'erreur ?
 
EDIT : Pour info, ce code VBA sous Access marche très bien chez moi :

Code :
  1. Const LARGEUR_DE_LA_GRILLE = 7
  2. Const HAUTEUR_DE_LA_GRILLE = 6
  3. Const LONGUEUR_CHAINE_GAGNANTE = 4
  4. Sub Procedure_principale()
  5. Dim TabConverti(7, 6) As Integer
  6. Dim i, j As Integer
  7. For i = 1 To 7
  8.     For j = 1 To 6
  9.         TabConverti(i, j) = Cells(j, i)
  10.     Next
  11. Next
  12. verif TabConverti
  13. End Sub
  14. Sub verif(LeTableau() As Integer)
  15. Dim i As Integer
  16. Dim j As Integer
  17. Dim victoire As Boolean
  18. victoire = False
  19. For i = 3 To LARGEUR_DE_LA_GRILLE
  20.   For j = 1 To HAUTEUR_DE_LA_GRILLE
  21.    If Not victoire And LeTableau(i, j) <> 0 Then
  22.     If alignement(i, j, 1, 0, LeTableau(i, j)) >= LONGUEUR_CHAINE_GAGNANTE Then victoire = True
  23.     If alignement(i, j, 0, 1, LeTableau(i, j)) >= LONGUEUR_CHAINE_GAGNANTE Then victoire = True
  24.     If alignement(i, j, 1, 1, LeTableau(i, j)) >= LONGUEUR_CHAINE_GAGNANTE Then victoire = True
  25.     If i >= LONGUEUR_CHAINE_GAGNANTE Then
  26.      If alignement(i, j, -1, 1, LeTableau(i, j)) >= LONGUEUR_CHAINE_GAGNANTE Then victoire = True
  27.     End If
  28.    End If
  29.   Next
  30. Next
  31. If victoire Then MsgBox "Gagné !" Else MsgBox "Pas encore..."
  32. End Sub
  33. Function alignement(pos_i As Integer, pos_j As Integer, op_i As Integer, op_j As Integer, joueur As Integer) As Integer
  34. Dim exploration As Integer
  35. exploration = 0
  36. If pos_i <= LARGEUR_DE_LA_GRILLE And pos_j <= HAUTEUR_DE_LA_GRILLE And pos_j > 0 Then
  37. If joueur = Cells(pos_j, pos_i) Then
  38.   exploration = alignement(pos_i + 1 * op_i, pos_j + 1 * op_j, op_i, op_j, joueur) + 1
  39. End If
  40. End If
  41. alignement = exploration
  42. End Function


Tu remarqueras que j'ai utilisé un nom différent pour le tableau dans la procédure "verif".


Message édité par Turkleton le 15-06-2009 à 07:45:23

---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed