Visual Basic (for Applications) - VB/VBA

Si vous avez des problèmes ou autre, c'est la qu'il faut en parler...

Visual Basic (for Applications) - VB/VBA

Messagede Edonist le 12 Déc 2013 14:14

Hello tout le monde!

Vous n'êtes pas sans savoir (ou peut-être que si!) que j'ai suivi une formation en VB / VBA qui s'est terminé mardi soir, et pour l'examen, j'ai notamment un projet à faire.
Ce projet s'appelle : PUISSANCE 4.

Vous connaissez tous le principe du Puissance 4 je suppose : une grille de 42 cases (6 lignes, 7 colonnes) dans laquelle on glisse des pions, et quand on en aligne 4 verticalement, horizontalement ou diagonalement, on a gagné!

Bref, jusque là, en environ 10 heures de travail, j'ai réussi à faire la grille (le design quoi) et surtout, à faire qu'on puisse insérer les jetons dedans.
Le petit +, c'est que quand une colonne est remplie, le bouton assigné à la colonne se "lock".
Et qu'une fois, les 42 jetons placés, j'ai une message-box qui apparaît pour dire que "la partie est terminée, match nul!".

Maintenant, il va me rester le gros du travail à mon avis, à savoir tester le nombre de pions rouges ou jaunes dans tous les sens pour désigner le gagnant.
Je sens déjà que ça va pas être de la tarte, alors peut-être je ferais appelle à vous les amis...

PS : je précise, concernant la règle du jeu, que c'est le premier qui aligne 4 jetons qui a gagné. Point.
Et ça n'est pas : on remplit toute la grille, et ensuite on compte de nombre d'alignements de 4 jetons d'une même couleur.
In Edo We Trust!
Avatar de l’utilisateur
Edonist
Chocobo à la patte cassée
Chocobo à la patte cassée
 
Messages: 4700
Inscription: 18 Déc 2008 22:46
Localisation: Vitry-Sur-Orne
Le jeu qui vous a fait connaître le site: Star Ocean till the end of time
Jeu(x) du moment: Bloodborne

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 12 Déc 2013 15:14

Tu tests juste si le dernier jeton placé permet au joueur de gagner.
Tu as concrètement 4 directions (hori, verti, 2 diags).
Tu les tests une par une tant que tu n'as pas 4 pions de la même couleur à la suite (sans oublier que jeton placé n'est pas forcément le premier de la série).

Concretement
Tu créé un entier genre pion_count.
Tu pars à gauche (par rapport au pion qui vient d'être placé), tu comptes le nbre de pion de ta couleur, tu trouves un pion de l'autre couleur ou le bord de la grille ou une absence de pion, tu t'arrêtes. Tu pars à droite, tu fais pareil sans réinitialiser pion_count. Si à tout moment pion_count fait 4 ou plus, tu arrêtes tout et balances un message de victoire.
Pareil sur la verticale (tu réinitialise pion_count avant évidemment)
Pareil sur les 2 diags.

le détail bête mais je le dis quand même. N'oublie pas de compter le pion qui vient d'être joué. Ca fait déjà 1.

Te déplacer dans la grille est bidon à priori. J'imagine que tu as créé une matrice statique, c'est juste une question de coordonnées à incrémenter du coup. Piece of cake.

Ca prend 30 minutes à tout péter. Je peux t'écrire l'algo complet si tu veux.

PS: je m'ennuie :'(
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Re: Visual Basic (for Applications) - VB/VBA

Messagede Deacon le 12 Déc 2013 16:22

En compliquant (comprendre optimisant), tu peux aussi, à partir des coordonnées d'entrée du pion "actuel" réduire les tests.
Genre le pion posé dans la première colonne, forcément il n'y a rien à gauche, donc l'horizontale sera forcément 2 3 4 donc tu n'ass que ça a tester, si par contre c'est en rang 4 tu as plus de tests à faire, idem pour la verticale.
MAis avec une bonne équation de calcul, ces "cas particuliers" (même si 4 pions sur 6 ou 7 cases, ils sont assez fréquents) sont pris en compte.
vu que tu as un nombre assez réduit, tu peux choisir la facilité:
prendre chaque valeur, (x pour les abscisses, y pour les ordonnées) genre if X = 1 then... 2, then... et pareil pour y
Ou alors tu fais un truc plus compliquer avec par exemple n = le nombre de rang max, tant que x est compris entre 1 et n....
qui à l'avantage de pouvoir rendre ton programme évolutif.
(encore une fois c'est de l' "optimisation", commence déjà par faire un truc qui marche et ça au pire ça peut t'ajouter des points et ça ne demandera pas d'énorme changements).

Sinon concernant le langage, j'en ai fait (à l'arrache tout seul) pour un truc, de mémoire c'est assez basique (dans le mauvais sens du terme), mais tu peux même faire une interface graphique (moche), et limite faire cliquer le joueur sur une colonne pour placer son pion (encor eune fois, ça c'est "pour le fun" quand ton programme fonctionne parfaitement).
Tiens d'ailleurs, en fait le joueur choisit juste les abscisses, c'est toi qui doit tester s'il y a déjà des pions sur la colonne pour savoir l'ordonné d'arrivée (genre tableau de pions).
N’importe qui peut haïr l’humanité après une agression. Seuls les grands esprits la haïssent… avant.
_House
Avatar de l’utilisateur
Deacon
Drakcobo écrivain
Drakcobo écrivain
 
Messages: 20895
Inscription: 09 Mai 2005 10:17

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 12 Déc 2013 16:36

J'ai quand même précisé que tu t'arrêtais quand tu sortais de la grille. Donc si t'es colonne 1, quand tu pars à gauche tu fais 1 test, tu t'appercois que t'es sorti de la grille et tu vas à droite.
Pas de tests inutiles.
La seule opti qui est un cas anecdotique : T'es allé à gauche, t'as compté aucun pion et tu te rends compte qu'à droite il reste moins de 3 colonnes et donc que c'est pas la peine de les faire une par une. T'as gagné 3 tests au prix d'un seul dans le meilleur des cas.
Le gain en complexité n'est pas significatif et à mon sens ça alourdi l'algo pour pas grand chose. Le nombre d'opération est totalement illusoire, le gain sera microscopique.
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Re: Visual Basic (for Applications) - VB/VBA

Messagede Edonist le 12 Déc 2013 16:55

Je vais vous donner un peu ma stratégie pour la grille, j'ai donné aux emplacements les noms suivants :

IMG50 IMG51 IMG52 ... IMG56
IMG40 IMG41 IMG42 ... IMG46
... ... ... ... ...
IMG00 IMG01 IMG02 ... IMG06

Le premier chiffre correspond au numéro de ligne, le deuxième au numéro de colonne.
A partir de là, j'essaie de récupérer la valeur des lignes et des colonnes avec des trucs genre : Ligne = Val(Mid(Nom, 4, 1)
(Nom étant une variable devant être égale au nom de l'emplacement. Exemple : si Nom = IMG51, Ligne doit être égale à 5)

Ensuite pour ma logique des 4 pions en ligne :
il faut que la colonne soit statique et que la ligne augmente de 1.
Ex : 52 53 54 55 (le 1er "5" est statique, l'autre chiffre augmente : 2 3 4 5)

En colonne, c'est le contraire :
Ex : 11 21 31 41 (le 1er chiffre augmente : 1 2 3 4, le 2è est statique : "1")

Diagonale montante : tout augmente de 1
Ex : 02 13 24 35 (1er chiffre : 0 1 2 3, 2è chiffre : 2 3 4 5)

Diagonale descendante : les lignes diminuent de 1 et les colonnes augmentent de 1
Ex : 31 22 13 04 (1er chiffre = lignes : 3 2 1 0, 2è chiffre = colonnes : 1 2 3 4)

Voilà, donc j'ai ma logique, mais je n'arrive pas à la mettre en place.
Mon gros problème est que je n'arrive pas à récupérer le n° de la Ligne. (pour l'instant, j'ai juste essayé de faire gagner un joueur en "ligne" : j'y vais pas à pas)
In Edo We Trust!
Avatar de l’utilisateur
Edonist
Chocobo à la patte cassée
Chocobo à la patte cassée
 
Messages: 4700
Inscription: 18 Déc 2008 22:46
Localisation: Vitry-Sur-Orne
Le jeu qui vous a fait connaître le site: Star Ocean till the end of time
Jeu(x) du moment: Bloodborne

Re: Visual Basic (for Applications) - VB/VBA

Messagede Edonist le 12 Déc 2013 16:56

Voilà le code que j'ai déjà fait, au cas où :

Option Explicit

Dim Rouge As Boolean
Dim NbCoups As Integer
Dim Grille(6, 7) As Integer
Const Pion_Rouge = 1
Const Pion_Jaune = -1
Const Cell_Vide = 0

Dim Cell As String

Dim Nom As String

Dim Ligne As Integer

Private Function Somme_Ligne(ByVal Ligne As Integer) As Integer
Dim i As Integer, Somme As Integer

For i = 0 To 6 Step 1
Somme = Somme + Grille(Ligne, i)
Next i

Somme_Ligne = Somme

End Function






Private Sub BT0_Click()

'Call Traiter_Click(Cell)

Dim Colonne As Integer
Ligne = Val(Mid(Nom, 4, 1))
Colonne = 0

Nom = "IMG" & Ligne & Colonne

If IMG40.BackColor = 3 Then
Nom = "IMG50"
ElseIf IMG30.BackColor = 3 Then
Nom = "IMG40"
ElseIf IMG20.BackColor = 3 Then
Nom = "IMG30"
ElseIf IMG10.BackColor = 3 Then
Nom = "IMG20"
ElseIf IMG00.BackColor = 3 Then
Nom = "IMG10"
Else
Nom = "IMG00"
End If

If Nom = "IMG5" & Colonne Then
IMG50.BackColor = 3
Nom = "IMG5" & Colonne
BT0.Enabled = False
ElseIf Nom = "IMG4" & Colonne Then
IMG40.BackColor = 3
Nom = "IMG4" & Colonne
ElseIf Nom = "IMG3" & Colonne Then
IMG30.BackColor = 3
Nom = "IMG3" & Colonne
ElseIf Nom = "IMG2" & Colonne Then
IMG20.BackColor = 3
Nom = "IMG2" & Colonne
ElseIf Nom = "IMG1" & Colonne Then
IMG10.BackColor = 3
Nom = "IMG1" & Colonne
Else
Nom = "IMG0" & Colonne
IMG00.BackColor = 3
End If



If Rouge Then 'ce code se trouve pour chaque bouton, car pour la partie "Traiter_Click", la ligne et la colonne ne sont pas définis. Or, ce ne sont jamais les mêmes pour les différents boutons.
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_rouge.jpg")
Grille(Ligne, Colonne) = Pion_Rouge
Else
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_jaune.jpg")
Grille(Ligne, Colonne) = Pion_Jaune
End If



Call Traiter_Click(Cell)


End Sub


Private Sub Traiter_Click(ByVal Cell As String)


If Rouge Then
If Somme_Ligne(Ligne) = 4 Then
Call MsgBox("Jeu terminé, le joueur rouge à gagné", vbExclamation)
End
End If
End If
If Not Rouge Then
If Somme_Ligne(Ligne) = -4 Then
Call MsgBox("Jeu terminé, le joueur jaune à gagné", vbExclamation)
End
End If
End If

NbCoups = NbCoups + 1
If NbCoups = 42 Then
Call MsgBox("Partie terminée, Match nul", vbExclamation)
End
End If

Rouge = Not Rouge



End Sub

Private Sub BT1_Click()



Dim Colonne As Integer
Ligne = Val(Mid(Nom, 4, 1))
Colonne = 1

Nom = "IMG" & Ligne & Colonne




If IMG41.BackColor = 3 Then
Nom = "IMG51"
ElseIf IMG31.BackColor = 3 Then
Nom = "IMG41"
ElseIf IMG21.BackColor = 3 Then
Nom = "IMG31"
ElseIf IMG11.BackColor = 3 Then
Nom = "IMG21"
ElseIf IMG01.BackColor = 3 Then
Nom = "IMG11"
Else
Nom = "IMG01"
End If

If Nom = "IMG5" & Colonne Then
IMG51.BackColor = 3
Nom = "IMG5" & Colonne
BT1.Enabled = False
ElseIf Nom = "IMG4" & Colonne Then
IMG41.BackColor = 3
Nom = "IMG4" & Colonne
ElseIf Nom = "IMG3" & Colonne Then
IMG31.BackColor = 3
Nom = "IMG3" & Colonne
ElseIf Nom = "IMG2" & Colonne Then
IMG21.BackColor = 3
Nom = "IMG2" & Colonne
ElseIf Nom = "IMG1" & Colonne Then
IMG11.BackColor = 3
Nom = "IMG1" & Colonne
Else
Nom = "IMG0" & Colonne
IMG01.BackColor = 3
End If



If Rouge Then
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_rouge.jpg")
Grille(Ligne, Colonne) = Pion_Rouge
Else
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_jaune.jpg")
Grille(Ligne, Colonne) = Pion_Jaune
End If




Call Traiter_Click(Cell)

End Sub

Private Sub BT2_Click()

Dim Colonne As Integer
Ligne = Val(Mid(Nom, 4, 1))
Colonne = 2

Nom = "IMG" & Ligne & Colonne




If IMG42.BackColor = 3 Then
Nom = "IMG52"
ElseIf IMG32.BackColor = 3 Then
Nom = "IMG42"
ElseIf IMG22.BackColor = 3 Then
Nom = "IMG32"
ElseIf IMG12.BackColor = 3 Then
Nom = "IMG22"
ElseIf IMG02.BackColor = 3 Then
Nom = "IMG12"
Else
Nom = "IMG02"
End If

If Nom = "IMG5" & Colonne Then
IMG52.BackColor = 3
Nom = "IMG5" & Colonne
BT2.Enabled = False
ElseIf Nom = "IMG4" & Colonne Then
IMG42.BackColor = 3
Nom = "IMG4" & Colonne
ElseIf Nom = "IMG3" & Colonne Then
IMG32.BackColor = 3
Nom = "IMG3" & Colonne
ElseIf Nom = "IMG2" & Colonne Then
IMG22.BackColor = 3
Nom = "IMG2" & Colonne
ElseIf Nom = "IMG1" & Colonne Then
IMG12.BackColor = 3
Nom = "IMG1" & Colonne
Else
Nom = "IMG0" & Colonne
IMG02.BackColor = 3
End If



If Rouge Then
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_rouge.jpg")
Grille(Ligne, Colonne) = Pion_Rouge
Else
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_jaune.jpg")
Grille(Ligne, Colonne) = Pion_Jaune
End If




Call Traiter_Click(Cell)
End Sub

Private Sub BT3_Click()
Dim Colonne As Integer
Ligne = Val(Mid(Nom, 4, 1))
Colonne = 3

Nom = "IMG" & Ligne & Colonne




If IMG43.BackColor = 3 Then
Nom = "IMG53"
ElseIf IMG33.BackColor = 3 Then
Nom = "IMG43"
ElseIf IMG23.BackColor = 3 Then
Nom = "IMG33"
ElseIf IMG13.BackColor = 3 Then
Nom = "IMG23"
ElseIf IMG03.BackColor = 3 Then
Nom = "IMG13"
Else
Nom = "IMG03"
End If

If Nom = "IMG5" & Colonne Then
IMG53.BackColor = 3
Nom = "IMG5" & Colonne
BT3.Enabled = False
ElseIf Nom = "IMG4" & Colonne Then
IMG43.BackColor = 3
Nom = "IMG4" & Colonne
ElseIf Nom = "IMG3" & Colonne Then
IMG33.BackColor = 3
Nom = "IMG3" & Colonne
ElseIf Nom = "IMG2" & Colonne Then
IMG23.BackColor = 3
Nom = "IMG2" & Colonne
ElseIf Nom = "IMG1" & Colonne Then
IMG13.BackColor = 3
Nom = "IMG1" & Colonne
Else
Nom = "IMG0" & Colonne
IMG03.BackColor = 3
End If



If Rouge Then
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_rouge.jpg")
Grille(Ligne, Colonne) = Pion_Rouge
Else
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_jaune.jpg")
Grille(Ligne, Colonne) = Pion_Jaune
End If




Call Traiter_Click(Cell)
End Sub

Private Sub BT4_Click()
Dim Colonne As Integer
Ligne = Val(Mid(Nom, 4, 1))
Colonne = 4

Nom = "IMG" & Ligne & Colonne




If IMG44.BackColor = 3 Then
Nom = "IMG54"
ElseIf IMG34.BackColor = 3 Then
Nom = "IMG44"
ElseIf IMG24.BackColor = 3 Then
Nom = "IMG34"
ElseIf IMG14.BackColor = 3 Then
Nom = "IMG24"
ElseIf IMG04.BackColor = 3 Then
Nom = "IMG14"
Else
Nom = "IMG04"
End If

If Nom = "IMG5" & Colonne Then
IMG54.BackColor = 3
Nom = "IMG5" & Colonne
BT4.Enabled = False
ElseIf Nom = "IMG4" & Colonne Then
IMG44.BackColor = 3
Nom = "IMG4" & Colonne
ElseIf Nom = "IMG3" & Colonne Then
IMG34.BackColor = 3
Nom = "IMG3" & Colonne
ElseIf Nom = "IMG2" & Colonne Then
IMG24.BackColor = 3
Nom = "IMG2" & Colonne
ElseIf Nom = "IMG1" & Colonne Then
IMG14.BackColor = 3
Nom = "IMG1" & Colonne
Else
Nom = "IMG0" & Colonne
IMG04.BackColor = 3
End If


If Rouge Then
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_rouge.jpg")
Grille(Ligne, Colonne) = Pion_Rouge
Else
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_jaune.jpg")
Grille(Ligne, Colonne) = Pion_Jaune
End If




Call Traiter_Click(Cell)
End Sub

Private Sub BT5_Click()
Dim Colonne As Integer
Ligne = Val(Mid(Nom, 4, 1))
Colonne = 5

Nom = "IMG" & Ligne & Colonne




If IMG45.BackColor = 3 Then
Nom = "IMG55"
ElseIf IMG35.BackColor = 3 Then
Nom = "IMG45"
ElseIf IMG25.BackColor = 3 Then
Nom = "IMG35"
ElseIf IMG15.BackColor = 3 Then
Nom = "IMG25"
ElseIf IMG05.BackColor = 3 Then
Nom = "IMG15"
Else
Nom = "IMG05"
End If

If Nom = "IMG5" & Colonne Then
IMG55.BackColor = 3
Nom = "IMG5" & Colonne
BT5.Enabled = False
ElseIf Nom = "IMG4" & Colonne Then
IMG45.BackColor = 3
Nom = "IMG4" & Colonne
ElseIf Nom = "IMG3" & Colonne Then
IMG35.BackColor = 3
Nom = "IMG3" & Colonne
ElseIf Nom = "IMG2" & Colonne Then
IMG25.BackColor = 3
Nom = "IMG2" & Colonne
ElseIf Nom = "IMG1" & Colonne Then
IMG15.BackColor = 3
Nom = "IMG1" & Colonne
Else
Nom = "IMG0" & Colonne
IMG05.BackColor = 3
End If



If Rouge Then
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_rouge.jpg")
Grille(Ligne, Colonne) = Pion_Rouge
Else
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_jaune.jpg")
Grille(Ligne, Colonne) = Pion_Jaune
End If




Call Traiter_Click(Cell)
End Sub

Private Sub BT6_Click()
Dim Colonne As Integer
Ligne = Val(Mid(Nom, 4, 1))
Colonne = 6

Nom = "IMG" & Ligne & Colonne




If IMG46.BackColor = 3 Then
Nom = "IMG56"
ElseIf IMG36.BackColor = 3 Then
Nom = "IMG46"
ElseIf IMG26.BackColor = 3 Then
Nom = "IMG36"
ElseIf IMG16.BackColor = 3 Then
Nom = "IMG26"
ElseIf IMG06.BackColor = 3 Then
Nom = "IMG16"
Else
Nom = "IMG06"
End If

If Nom = "IMG5" & Colonne Then
IMG56.BackColor = 3
Nom = "IMG5" & Colonne
BT6.Enabled = False
ElseIf Nom = "IMG4" & Colonne Then
IMG46.BackColor = 3
Nom = "IMG4" & Colonne
ElseIf Nom = "IMG3" & Colonne Then
IMG36.BackColor = 3
Nom = "IMG3" & Colonne
ElseIf Nom = "IMG2" & Colonne Then
IMG26.BackColor = 3
Nom = "IMG2" & Colonne
ElseIf Nom = "IMG1" & Colonne Then
IMG16.BackColor = 3
Nom = "IMG1" & Colonne
Else
Nom = "IMG0" & Colonne
IMG06.BackColor = 3
End If



If Rouge Then
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_rouge.jpg")
Grille(Ligne, Colonne) = Pion_Rouge
Else
Puissance4.Controls(Nom).Picture = LoadPicture("F:\jeton_jaune.jpg")
Grille(Ligne, Colonne) = Pion_Jaune
End If




Call Traiter_Click(Cell)
End Sub
In Edo We Trust!
Avatar de l’utilisateur
Edonist
Chocobo à la patte cassée
Chocobo à la patte cassée
 
Messages: 4700
Inscription: 18 Déc 2008 22:46
Localisation: Vitry-Sur-Orne
Le jeu qui vous a fait connaître le site: Star Ocean till the end of time
Jeu(x) du moment: Bloodborne

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 12 Déc 2013 17:00

Je vais lire ce que tu as fait mais à mon avis, tu fais fausse route.

De mon coté, j'ai fais un algo.

Je précise que je considère qu’il existe 3 couleur
0 = pas de jeton
1 = jaune
2 = rouge

grille est un tableau à 2dimension de 7 sur 6 d'entiers (les entiers représentent une couleur).
Avoue que c'est une structure méga simple et facilement manipulable.

Ce n'est pas du vba mais c'est normalement intelligible. Exit est volontairement flou, c'est toi qui gere.

//tu prends en paramètre la couleur et la position du pion qui vient d'être inséré dans le jeu.
Function (entier couleur, entier abs, entier ord, grille)

Entier pion_count ;
Pion_count = 1;

I = abs;
J = ord;

// on va à gauche
While (i > 1 ET grille[i-1][j].couleur == couleur ET pion_count <4)
{
i-- ;
pion_count++ ;
}
//On va à droite
I = abs ;
While (i < 7 ET grille[i+1][j].couleur == couleur ET pion_count <4)
{
I++ ;
pion_count++ ;
}

If pion_count >= 4 then exit(gagné) ;

//On va en bas
Pion_count = 1;
I = abs ;
While (j > 1 ET grille[i][j-1].couleur == couleur ET pion_count <4)
{
j-- ;
pion_count++ ;
}
//puis en haut
j = ord ;
While (j < 6 ET grille[i][j+1].couleur == couleur ET pion_count <4)
{
I++ ;
pion_count++ ;
}

If pion_count >= 4 then exit(gagné) ;

//Et maintenant les diagonales
Pion_count = 1;
j = ord ;
While (j > 1 ET i> 1 grille[i-1][j-1].couleur == couleur ET pion_count <4)
{
j-- ;
i--;
pion_count++ ;
}
j = ord ;
I = abs;
While (j < 6 ET i < 7 grille[i+1][j+1].couleur == couleur ET pion_count <4)
{
I++ ;
J++;
pion_count++ ;
}

If pion_count >= 4 then exit(gagné) ;

Pion_count = 1;
j = ord ;
I = abs;
While (j < 6 ET I > 1 grille[i-1][j+1].couleur == couleur ET pion_count <4)
{
J++ ;
i--;
pion_count++ ;
}
j = ord ;
I = abs;
While (j > 1 ET i < 7 grille[i+1][j-1].couleur == couleur ET pion_count <4)
{
I++ ;
J--;
pion_count++ ;
}

If pion_count >= 4 then exit(gagné) else exit(next);
Dernière édition par thyre le 12 Déc 2013 17:51, édité 1 fois.
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 12 Déc 2013 17:16

Heu stop stop stop. A mon avis tu vas dans un mur là. Déjà tes magouilles IMG50 c'est nimp.
Ton code est incompréhensible en l'état en plus. C'est trop long, t'as aucun commentaire, tu fais aucune fonction...

encore une fois je te conseille un tableau à deux dimensions d'entiers avec les codes suivants :
0 = pas de jeton
1 = rouge
2 = jaune

Je te conseille de maintenir ton tableau à jour pendant la partie et de complétement le séparer de l'affichage. Ca coute rien niveau machine et on manipule jamais une structure graphique surtout que le vba c'est pour excel et que excel met juste 30ans à afficher un truc :D.

J'ai l'impression que tu recréer un tableau à chaque fois que tu comptes vérifier s'il y a victoire oO. Heu non.
En début de partie du initialise ta grille avec des 0 partout. A chaque fois qu'un mec joue, tu met à jour ton tableau. C'est tout con grille(i,j) = 1 ou grille(i,j) = 2 selon la couleur.

A chaque fin de tour, tu vérifie que le coup n'est pas gagnant via la méthode que je te propose dans mon premier message.
Il s'agit tout connement de regarder si le jeton inséré fait une ligne ou une diag de 4.

Tout con.
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Re: Visual Basic (for Applications) - VB/VBA

Messagede Deacon le 12 Déc 2013 18:05

J'avoue que ce que j'imaginais ressemblait déjà plus à ce qu'Ark 0 écrit.
Oui Edo, lâche l'affaire avec tes noms constitués.
Utilise les coordonnées comme le fait Ark, ça sera nettement plus simple.

(bon, il ne faut pas oublier, je répète, que le pion jouer doit être positionné en fonction de ceux déjà présents dans chaque colonnes, j'ai pas l'impression de vous voir le traiter alors que vous partez direct dans les testes de victoires)
N’importe qui peut haïr l’humanité après une agression. Seuls les grands esprits la haïssent… avant.
_House
Avatar de l’utilisateur
Deacon
Drakcobo écrivain
Drakcobo écrivain
 
Messages: 20895
Inscription: 09 Mai 2005 10:17

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 12 Déc 2013 18:15

heu oui on est d'acc deacon.
J'ai pas codé la gestion de l'ajout d'une piece mais il m'a dit qu'il l'avait déjà fait.

Spo dur non plus.
Tu met une colonne en paramètre, tu vérifie qu'elle est pas pleine et tu parcours la colonne de haut en bas. Quand tu trouves une case occupée tu t'arrêtes et tu mets ton pion au dessus. Une petite boucle et l'affaire est réglée.

ajout(couleur, col, grille)

if (grille[col][6] != 0)
then
{
j = 6;
while (j>0 ET grille[col][j] != 0) {j--;}
grille[col][j-1]=couleur;
exit(ok);
//t'as plus qu'à gérer l'affichage
}
else
exit(choisi une autre colonne)


Avec ça, j'ai fait tout le boulot en terme d'algo. Le reste c'est juste de l'affichage et de l'IHM.

Enfin je pense sérieusement Edo qu'il n'y a pas 36 solutions de traiter ton projet. Tu peux factoriser le code ou faire légèrement différent mais la base c'est ce que je t'ai mis et pas autre chose à mon sens.
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Re: Visual Basic (for Applications) - VB/VBA

Messagede Deacon le 12 Déc 2013 18:37

Ah j'avais pas vu qu'il l'avait déjà fait.
Faut retourner la position du jeton ajouté pour pourvoir y appliquer les testes (horizontaux, verticaux et diagonaux) puisque c’est quand le joueur insère un pion que ça doit tester la victoire.
(désolé si ça à été dis, je lis ne diagonale et je suis à moitié décédé).
N’importe qui peut haïr l’humanité après une agression. Seuls les grands esprits la haïssent… avant.
_House
Avatar de l’utilisateur
Deacon
Drakcobo écrivain
Drakcobo écrivain
 
Messages: 20895
Inscription: 09 Mai 2005 10:17

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 12 Déc 2013 19:19

tout à fait. Mes retours sont dégueulasses. Faut faire ça un peu plus propre mais je suis allé à l'essentiel pour faire passer l'idée.
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 12 Déc 2013 21:46

sinon, pour tenir compte de l'opti de Deacon. M'enfin je veux pas t'embrouiller edo donc laisse tomber.

Je reprend juste la recherche d'une victoire horizontale parce que c'est pareil pour les autres.

// on va à gauche
While (i > 1 ET grille[i-1][j].couleur == couleur ET pion_count <4)
{
i-- ;
pion_count++ ;
}
// On vérifie qu'il y a assez de colonne à droite pour permettre une victoire. Si c'est pas le cas, on se fera pas chier à chercher et on passe à autre chose.
limite = abs + pion_count - 4;
if limite <= 8 then
{
//On va à droite
i = abs;
While (grille[i+1][j].couleur == couleur ET pion_count <4)
{
I++ ;
pion_count++ ;
}
}

If pion_count >= 4 then exit(gagné) ;

Bien noter que dans la 2eme boucle, j'ai retiré le test pour vérifier qu'on sort pas de la grille. Ben ouais... je sais déjà qu'on ne rencontrera pas le bord de la grille avant de perdre ou gagner vu que c'est testé au dessus.
Voila mais c'est vraiment pour la forme parce que le gain en perf n'est pas significatif.
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Re: Visual Basic (for Applications) - VB/VBA

Messagede Edonist le 12 Déc 2013 21:57

Hello, j'arrive seulement maintenant de mon cours de Manipulation et Pouvoir, donc je découvre vos messages.

Alors déjà, merci pour votre aide.
Je vais regarder cela plus profondément demain. En effet, c'est pas du VBA, mais je comprends à peu près quand même. Je pense que :
1) Pion_Count ++ équivaut en VBA à : Pion_Count = Pion_Count + 1 (une incrémentation quoi)
2) ET = And ;)
3) != équivaut à <> (différent de)

Par contre, un petit doute sur : == ? Ca veut juste dire "=" ça, non ?

Et dans cette expression : Function (entier couleur, entier abs, entier ord, grille)
En fait, je ne comprends pas là. La couleur normalement, c'est un booléen, non ? Je veux dire, du type : "rouge" ou "pas rouge". Pourquoi c'est écrit "entier" ?
Et puis "abs" et "ord", ça veut dire quoi ? C'est "absent" et "ordinateur" (ou "ordre") ?
D'autant qu'après, c'est écrit "Entier pion_count ;"
Mais c'est pas le même "Entier" que celui de "entier couleur" ou "entier abs" par exemple, car il y a une majuscule...

Bon je verrais ça demain!
Merci en tous cas. :oui:
In Edo We Trust!
Avatar de l’utilisateur
Edonist
Chocobo à la patte cassée
Chocobo à la patte cassée
 
Messages: 4700
Inscription: 18 Déc 2008 22:46
Localisation: Vitry-Sur-Orne
Le jeu qui vous a fait connaître le site: Star Ocean till the end of time
Jeu(x) du moment: Bloodborne

Re: Visual Basic (for Applications) - VB/VBA

Messagede Deacon le 12 Déc 2013 23:08

En fait Ark je pensais pas vraiment à ça, peut-être mal exprimé, donc oui dans ce cas là c'est minime comme gain.

Edo: Abs c'est pour abscisse, et ord pour ordonnée :roll:
Edit : ok connerie spotted je supprime.
Dernière édition par Deacon le 12 Déc 2013 23:44, édité 1 fois.
N’importe qui peut haïr l’humanité après une agression. Seuls les grands esprits la haïssent… avant.
_House
Avatar de l’utilisateur
Deacon
Drakcobo écrivain
Drakcobo écrivain
 
Messages: 20895
Inscription: 09 Mai 2005 10:17

Re: Visual Basic (for Applications) - VB/VBA

Messagede Major Seed le 12 Déc 2013 23:42

Pour l'utilisation du signe égal, ce n'est pas tout à fait ça :

-Le simple égal, comme dans A = B + C, c'est une affectation. Tu affectes la somme des valeurs B et C dans la variable A.
-Le double égal, comme dans A == B, c'est en effet un test. Tu vérifies si la valeur de la variable A est identique à la valeur de la variable B.

Pour les questions d'Edo plus haut :

Pour la couleur, ça peut être un booléen comme un entier. Un booléen, c'est juste un entier qui ne peut prendre que deux valeurs (vrai ou faux). Avec un entier, tu es plus large, et si ton code évolue tu n'auras pas à changer le type à chaque endroit où tu t'en sers. Si on te disait de faire le jeu du puissance 4 pour 3 joueurs, le booléen ne tient plus la route. En général, on réserve le booléen aux choses qui sont vraiment par nature "vraie" ou "fausse", et pour lesquelles ça ne risque pas de changer.

Après, comme j'en ai parlé avec Deacon (ailleurs), le modèle de données le plus "évident" est de représenter ça avec un tableau à dimensions, parce que visuellement le puissance 4 est jouable sous la forme d'un tableau. Mais dans le cas du tableau à 2D, la majeure partie du temps tu vas stocker une "non-information" : ce que tu veux savoir, c'est où se trouvent les pions, ce sont eux qui permettent le calcul de la victoire et de la pose des pions suivants. Mémoriser qu'une case est vide n'apporte rien en soi. Personnellement, j'aurais opté pour un modèle de listes d'objets : la liste des pions rouges, la liste des pions jaunes, un pion étant un objet composé de deux attributs entier qui sont les coordonnées des abscisse et ordonnée. Et à chaque tour, tu parcours la liste des pions du joueur qui vient de jouer pour déterminer s'il a gagné ou non à partir des coordonnées des pions, et si non la liste des coups possibles pour son adversaire.

Pour finir, commencer un jeu par son interface, c'est pas du tout une bonne idée. Normalement, tu conçois le modèle de jeu en premier, qui doit être fonctionnel avec une interface minimaliste (mode console, ou affichage façon morpion en mode texte), et tu raccordes ensuite ton interface dessus. Et d'une manière générale, à part les applis web où ça peut se justifier, tu ne commences par par l'interface. C'est l'assurance d'avoir un moteur qui part dans tous les sens, et si ça rentre en ligne de compte, pas du tout optimisé.
Le meilleur moyen d'obtenir une réponse, c'est de poser la question.
Avatar de l’utilisateur
Major Seed
Dracobo
Dracobo
 
Messages: 7101
Inscription: 20 Avr 2006 10:46
Localisation: Balamb GARDEN University

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 13 Déc 2013 00:05

alors ça ne peut pas être un boolean parce que j'ai 3 valeurs
0,1,2
0 pas de jeton
1 jaune
2 rouge

Le but est tout simple, une case doit comporter 2 infos : il y a un pion ou pas et quelle est sa couleur. alors tu peux t'amuser à le stocker sur 2 variables via un type composé ou alors considérer qu'un case à 3 état : jaune, rouge ou vide. Utiliser un code numérique pour symboliser un état est un grand classique.

Je l'ai dit 2 fois déjà, je peux pas te dire ça mieux.

Fais pas attention aux majuscules. J'ai fais ça sous outlook pour camoufler au taff. Ca met une majuscule à chaque début de ligne tout seul...

Alors ok Major, tu stock pas les cases vides (il y a 42 pauvres entiers à stocker) mais c'est une horreur à manipuler ton truc ne serait ce que pour savoir s'il y a des pions alignés. Ce que tu gagnes en place, tu vas le perdre à t'amuser à parcourir ta liste chainée 42 fois pour savoir si tu as gagné ou pas (comme tes données sont stockées de manière chainée, t'es obligé de tester des cases qui sont impertinentes même si elles sont trop loin du pion joué et en plus tu dois les tester plusieurs fois de suite parce que je crois pas que t'arrives à me faire ça en parcourant la liste qu'une fois).
En plus, si tu commences à stocker la prochaine case à occuper pour chaque colonne, c'est d'autant plus ironique car tu te retrouves à créer des structures supplémentaire alors que ton but est de stocker moins d'infos.
Pour finir, j'ajoute qu'en fin de partie, une fois le tableau rempli, tu te retrouves à stocker 2 fois plus de données que moi car tu as 2 entiers par cases alors que moi je ne stocke pas les coordonnées mais seulement l'état de la case.
M'enfin vas y, fais voir.
Mais bon, déjà qu'il a l'air de galérer avec un structure statique alors que ce sont les structures les plus simples...

Ben si spo à ça que tu pensais Deacon, fais voir aussi.
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Re: Visual Basic (for Applications) - VB/VBA

Messagede 6trouille le 13 Déc 2013 08:53

thyre a écrit:
Fais pas attention aux majuscules. J'ai fais ça sous outlook pour camoufler au taff. Ca met une majuscule à chaque début de ligne tout seul...



Quand j'disais que Thyre avait des gros trous dans son planning prof :D :rire: ;)

En tout cas ça met un peu d'animation sur le forum même si je capte que dalle ou presque :oui: :pouce:
La vitesse de la lumière étant supérieure à la vitesse du son, il est normal que certains paraissent brillants avant d'ouvrir la bouche ;)
Avatar de l’utilisateur
6trouille
Gourou Star Ocean
Gourou Star Ocean
 
Messages: 23713
Inscription: 07 Mar 2005 21:47
Localisation: Somewhere
Le jeu qui vous a fait connaître le site: Star Ocean 'till the End of Time

Re: Visual Basic (for Applications) - VB/VBA

Messagede Edonist le 13 Déc 2013 10:32

En tous cas, Thyre a raison : moi aussi j'ai Outlook 2010 au taf, et ça met des majuscules tout seul.
Enfin, tu peux les enlever en allant dans les options, mais on s'en fout un peu. C'est pas mal finalement les majuscules automatiques (enfin... sauf pour les codes informatiques bien sûr).
En tous cas, tout s'explique maintenant.

Je vais essayer.
Sur une copie de ce que j'ai déjà fait bien sûr, et dont je modifierai le code. histoire d'avoir un "back up" au cas où...
In Edo We Trust!
Avatar de l’utilisateur
Edonist
Chocobo à la patte cassée
Chocobo à la patte cassée
 
Messages: 4700
Inscription: 18 Déc 2008 22:46
Localisation: Vitry-Sur-Orne
Le jeu qui vous a fait connaître le site: Star Ocean till the end of time
Jeu(x) du moment: Bloodborne

Re: Visual Basic (for Applications) - VB/VBA

Messagede thyre le 13 Déc 2013 10:38

spo dur trouille. Faut juste réfléchir à un process qui permette de faire marcher un puissance4.
Tu dois décomposer en instructions simples ce qu'il faut faire en excluant toute prise d'initiative.
Par exemple placer un pion dans le jeu. Le pion tombe le plus bas possible, on est d'accord?
Ben l'algo est comme suit
Déjà, est ce que je peux placer un pion sur cette colonne? Comment savoir? Ben s'il y a un pion sur la case la plus haute, c'est que la colonne est complete. C'est quelque chose que tu fais sans y penser. Disons que toi tu vois la colonne complete mais un pc ne voit rien. En revanche un pc peut vérifier des choses si tu lui dis précisément ou regarder et quoi regarder.
Donc tu sais que tu peux glisser un pion là. Mais où dans la colonne va t il atterrir? Ben juste au dessus du pion le plus haut. Ok, mais il est où le pion le plus haut? Ben je prend la case la plus haute, je regarde si elle est vide. Si elle l'est, je regarde la case en dessous et je vérifie qu'elle est vide et je passe à la suivante. Je continue jusqu'à trouver un pion ou bien jusqu'à me retrouver tout en bas de la colonne (oui, c'est con un PC, faut penser à tous les cas de figure sinon il est perdu).
Maintenant je sais où est le pion le plus haut. Ben je dois placer mon pion juste au dessus.

en terme d'algo, ça se formalise comme ça
Faut juste savoir que le pc voit la grille comme un tableau à 2 dimensions d'entier. 0 pas de jeton, 1 c'est un jeton rouge, 2 c'est un jeton jaune.

Soit col, la colonne choisie par le joueur et couleur la couleur du joueur

si (grille[col][6] == 0)
// je vérifie le haut de la grille donc la case aux coordonnées (col;6), 6 étant le haut de la grille. Si c'est égal à 0 alors c'est vide et donc la colonne n'est pas complete
alors
{ // ça signifie que toute les instructions ci dessous sont compris dans la condition. Si la condition n'est pas remplie, on ne fera pas tout ce qu'il y a ci dessous.
j = 6; // C'est un compteur pour savoir sur quelle ligne nous nous trouvons. Ben ouais, il faut que le pc compte dans sa tête parce qu'il ne sait accéder à une case que via ses coordonnées contrairement à un humain qui peut comprendre la notion de case du dessous.
tant que (j>0 ET grille[col][j] == 0) faire j--; //attention, c'est le moment tendu :D. Il y a une action répétitive à effectuer. Tant que j>0 autrement dit qu'on n'a pas atteint le bas de la grille et que la case qu'on est en train de regarder est vide, on regarde la case d'en dessous en décrémentant j qui représente le numéro de la ligne courante. Le pc va donc faire ceci: est ce que je ne suis pas encore arrivé ligne 0? Est ce que la case (col;j) est vide? si oui alors je recommence avec la case du dessous sinon je m'arrête et j est donc égal soit à 0 soit à la ligne du pion le plus haut.
grille[col][j+1]=couleur; //je sais que la case(col;j) est occupé par un pion ou bien que c'est le bas de la grille donc j'informe la machine que sur la case du dessus (col,j+1), je met un pion de la couleur du joueur.
exit(ok);
}// fin du bloc d'instruction conditionnel
sinon // si la case la plus haute de la grille est occupée par un pion, la colonne est déjà complété, on ne peut pas jouer ici
exit(choisi une autre colonne);


Et donc je m’aperçois que sur l'algo donné plus tot, j'avais inversé pratiquement tous les contrôles :D.
Avatar de l’utilisateur
thyre
Chocobo des rivières
Chocobo des rivières
 
Messages: 1205
Inscription: 03 Jan 2013 18:48

Suivante

Retourner vers Informatique

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 7 invités

cron