Visual Basic (for Applications) - VB/VBA

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

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

Messagede 6trouille le 13 Déc 2013 13:52

Oui, sur la logique du truc j'ai aucun soucis pour comprendre (les conditions et autres je fais au final la même chose sur mes nombreux tableaux excel donc je maîtrise plus que bien) mais c'est plutôt les "sigles" utilisés que je ne captais pas (double égal, double tiret, accolades, crochets, ...) même si pour certains j'imaginais bien à quoi cela devait correspondre :oui:
Donc merci pour les précisions :pouce: ... et donc d'avoir pris sur ton temps de taf pour cela :D
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 17:10

Hello, bon, j'ai bien dû passer 4 heures dessus aujourd'hui, et je n'avance pas. :cry:

Bref, j'ai essayé de traduire le code de Thyre en VBA, mais c'est assez problématique.
Je n'arrive pas à voir ce que sont les fonctions et les "actions".
Exemple : quand je clique sur le bouton 1, que se passe-t-il ?

De plus, je ne vois pas où est-ce qu'on détermine si c'est le rouge ou le jaune qui gagne.

Dans une partie comme celle_là :
while (j>0 ET grille[col][j] != 0) {j--;}
grille[col][j-1]=couleur;
exit(ok);
----> dans la ligne avec le While, je n'arrive pas à comprendre comment insérer là dedans le j=j-1 (dans l'accolade)

Et dans une ligne comme celle_ci :
While (j > 1 ET i> 1 grille[i-1][j-1].couleur == couleur ET pion_count <4)
----> ne manque-t-il pas un "ET" entre le "1" et le "Grille" ?

Bref, comme 6trouille, j'ai bien compris le raisonnement, je l'ai traduit aussi bien que j'ai pu en VBA, mais ça doit pas être ça encore malheureusement...


Alors petite question bêbête!
J'ai fait une copie pour essayer de repartir sur des bases... un peu mieux on va dire.
Connaissez-vous un code tout con, avec une boucle, pour que lorsque je clique sur un bouton en bas de la colonne, le pion descende jusqu'à la première case vide ?
Un truc genre :
For i = 0 to 5 in Colonne0
if Case_Vide = false then
Nom = "IMG" & Ligne + 1 & Colonne
End if
Next i

Ca irait vous pensez ?
Comment faire le "in Colonne" ? Vous voyez, je veux que quand je clique le bouton BT0, il ne considère que la colonne 0...
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 22:57

je te schématise la structure du jeu parce que ça a pas l'air pour toi vu que tu me demande qui a gagné et qu'est ce qu'il se passe quand on clic sur le bouton 1 (edo... comment tu veux que je sache ce qu'est le bouton1?)

il y a un bouton new game qqpart qui déclenche les actions suivantes.
Tu initialise le jeu.
tu créé une grille d'entiers de 6 sur 7. Évidemment grille est une variable globale sinon c'est chiant.
Tu l'a rempli de 0.
Tu nettoie l'affichage pour présenter un grille de jeu vide.
Tu détermine qui commence et tu l'invite à jouer.

Le joueur doit choisir une colonne. De préférence, tu ne l'autorise pas à jouer dans des colonnes où il ne peut pas jouer. J'imagine qu'il y a un bouton par colonne ou un champ où le joueur indique le numéro de la colonne où il veut jouer.
le joueur clic sur une colonne. Tu sais donc quelle colonne il a choisi.
Tu vérifie que la colonne n'est pas remplie, tu détermine ou doit atterrir le jeton dans la colonne et tu obtiens donc ces coordonnées completes.
Tu met à jour ta grille d'entiers et ton affichage. Éventuellement si le joueur vient de remplir une colonne, tu désactive le bouton qui permettait de mettre un pion dans cette colonne.
Tu cherches à savoir si le dernier coup à permis au joueur de l'emporter (le joueur jaune ne peut pas gagner quand il ne joue pas, c'est pour ça ça que ta question de savoir qui gagne n'a pas de sens).
Du coup, tu cherches à savoir si le dernier pion joué permet de construire une ligne de 4 au bénéfice du joueur qui vient de jouer (j'insiste parceque ça parait pas clair pour toi) via l'algo que j'e t'ai fourni. Stou con tu regarde à gauche, tu comptes le nbre de pions de la même couleur à la suite puis tu regardes à droite et tu fais pareil et si ça fait plus de 4 c'est gagné sinon tu tests la verticale de la même manière puis les 2 diagonales. Note bien que tu ne parcours pas la grille en entier, simplement les pions susceptibles de faire une ligne à partir du dernier pion joué. Comme tu fais cette vérif à chaque tour, tu sais déjà qu'aucun autre pion ne forme une ligne de 4 sans l'intervention de ce dernier pion.
Le coup est gagnant? Tu informe le joueur qu'il a gagné.
Le coup n'est pas gagnant, tu annonces à l'autre joueur que c'est son tour (vérifie que le tableau n'est pas complet auquel cas tu annonces une égalité).

Voili voilou

Clair?


while (j>0 ET grille[col][j] == 0) {j--;}

en vba ça donne

while (j>0 and grille(col,j) = 0)
j = j -1
wend

J'ai pas cherché à te piéger tu sais. C'est vraiment une boucle tout ce qu'il y a de plus simple.
J'insiste sur le fait que je me suis planté dans les controles dans mon premier algo, j'ai corrigé dans la version expliquée de 6trouille. C'est pas <>0 mais == 0. Ben oui, tant que la case est vide on continue.


Oui, il y a évidement un ET après le 1


Rien compris à ta boucle for, désolé... Je pense que toi non plus t'as pas bien capté. C'est une connerie de te faire utiliser des boucles for si tu maitrises pas parfaitement les boucles while. Restes en à while pour le moment. T'as pas besoin de for. Rien de pire qu'un truc qui fait des choses tout seuls alors que tu comprends pas bien ce qu'il se passe derrière. La boucle while t'oblige à tout formaliser. Parfait pour toi.
La seule fois de ma vie ou j'ai eu besoin d'une boucle for (et c'était une for each pour être plus précis), c'est parce que je devais parcourir un tableau associatif en php. T'en es pas là.


Je vais finir par le faire à ta place ton projet edo. Je pense que j'en ai pour 2h à tout péter sous excel et j'ai déjà passé plus de temps à t'expliquer.

Attention! J'ai considéré que la première valeur d'un tableau était à 1 autrement dit tab(1) est la première valeur mais ça dépend des langages. C'est peut être tab(0) la première valeur. J'en sais rien. A toi d'adapter. Je crois qu'en VBA il y a une variable d'environnement qui permet de déterminer ça.
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 13 Déc 2013 23:27

Oui, c'est un peu plus clair. Je retente demain!

Alors voilà je te schématise un peu mon truc :
Les cases par des X
et les boutons en dessous

X X X X X X X
X X X X X X X
X X X X X X X
X X X X X X X
X X X X X X X
X X X X X X X
BT0 BT1 BT2 BT3 BT4 BT5 BT6

Quand on clique sur BT1 (par exemple), un jeton doit venir se placer dans la colonne 1 le plus bas possible, où une case est vide.
Je précise que la grille n'est pas sur une feuille Excel, mais c'est une UserForm (au cas où).

Donc moi, comme variable, j'avais déclaré par exemple :
Dim Case_Vide as Boolean
Comme ça je teste si c'est vrai que la case est vide, jusqu'au moment où c'est faux, et à ce moment-là, il faut que le jeton s'arrête juste au dessus.

Le problème, c'est comment faire pour que, lorsque l'on clique sur un bouton, le programme considère uniquement la colonne qui se trouve au dessus de lui. Il faut déclarer une nouvelle grille de 6 sur 1 ou quoi ?
Dim Colonne_Choisie(6, 1) as Integer
c'est ça ?

Alors, petit truc en plus : pendant le cours, on avait fait un OXO (ou jeu du morpion) en VB (et non en VBA). Le prof nous avait dit de nous inspirer de ce corrigé pour faire notre Puissance 4, raison pour laquelle, j'ai utilisé ma stratégie que vous trouvez un peu bizarre...
Bref, voici, ce corrigé (j'ai vérifié : ça fonctionne) :
Public Class OxoForm

Dim Humain As Boolean
Dim NbCoups As Integer
Dim grille(2, 2) As Integer
Const case_humain = 1
Const case_ordi = -1
Const case_vierge = 0



Private Sub BT00_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT00.Click
Call Traiter_Click("BT00")
End Sub

Private Sub BT01_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT01.Click
Call Traiter_Click("BT01")
End Sub

Private Sub BT02_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT02.Click
Call Traiter_Click("BT02")
End Sub

Private Sub BT10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT10.Click
Call Traiter_Click("BT10")
End Sub

Private Sub BT11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT11.Click
Call Traiter_Click("BT11")
End Sub

Private Sub BT12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT12.Click
Call Traiter_Click("BT12")
End Sub

Private Sub BT20_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT20.Click
Call Traiter_Click("BT20")
End Sub

Private Sub BT21_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT21.Click
Call Traiter_Click("BT21")
End Sub

Private Sub BT22_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT22.Click
Call Traiter_Click("BT22")
End Sub

Private Sub Traiter_Click(ByVal Nom As String)

Dim ligne As Integer, colonne As Integer
Dim Choix As Button
ligne = Mid(Nom, 3, 1)
colonne = Mid(Nom, 4, 1)
Choix = Me.Controls(Nom)
If Humain Then
grille(ligne, colonne) = case_humain
Choix.Image = System.Drawing.Image.FromFile("F:\OXO\Oxo\SignX.bmp")
Choix.ImageAlign = ContentAlignment.MiddleCenter
Choix.Enabled = False
Else
grille(ligne, colonne) = case_ordi
Choix.Image = System.Drawing.Image.FromFile("F:\OXO\Oxo\SignO.bmp")
Choix.ImageAlign = ContentAlignment.MiddleCenter
Choix.Enabled = False
End If

Debug.Print("Grille BEGIN")
For i = 0 To 2 Step 1
For j = 0 To 2 Step 1
Debug.Print(grille(i, j))
Next j
Next i
Debug.Print("Grille END")

NbCoups = NbCoups + 1
If NbCoups = 9 Then
Call MsgBox("Jeu Termine, Match nul", vbExclamation)
End
End If
Humain = Not Humain

'verifier si ce coup est gagnant
If Humain Then
If Somme_Ligne(ligne) = 3 Or Somme_Colonne(colonne) = 3 Or Somme_Diago1() = 3 Or Somme_Diago2() = 3 Then
Call MsgBox("Jeu termine, l'humain a gagne", vbExclamation)
End
End If
End If
If Not Humain Then
If Somme_Ligne(ligne) = -3 Or Somme_Colonne(colonne) = -3 Or Somme_Diago1() = -3 Or Somme_Diago2() = -3 Then
Call MsgBox("Jeu termine, l'ordinathan a gagne", vbExclamation)
End
End If
End If
End Sub
Private Function Somme_Ligne(ByVal ligne As Integer) As Integer
Dim i As Integer, somme As Integer
For i = 0 To 2 Step 1
somme = somme + grille(ligne, i)
Next i
Somme_Ligne = somme
End Function
Private Function Somme_Colonne(ByVal colonne As Integer) As Integer
Dim i As Integer, somme As Integer
For i = 0 To 2 Step 1
somme = somme + grille(colonne, i)
Next i
Somme_Colonne = somme
End Function
Private Function Somme_Diago1() As Integer
Somme_Diago1 = grille(2, 0) + grille(1, 1) + grille(0, 2)
End Function
Private Function Somme_Diago2() As Integer
Somme_Diago2 = grille(0, 0) + grille(1, 1) + grille(2, 2)
End Function

End Class


Il y a pas beaucoup de commentaires c'est vrai, mais j'ai recopié le plus vite que j'ai pu.
Le Debug.Print qu'il y a en plein milieu, c'est pour débugger le programme au cas où.
Voilà, si ça peut fournir quelques explications de plus.
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 14 Déc 2013 01:21

c'est ton algo qui détermine ça edo...

la fonction ajout prend en paramètre la colonne. Si tu appuis sur bouton 1, tu passes en paramètres 1
Quand tu vas te déplacer dans ta grille, tu te déplaces sur grille(col,j)
j varie de 6 à 0 tandis que col reste fixe.
L'algo que je t'ai fourni a toujours été pensé pour ne parcourir que la colonne passée en parametre.

C'est tellement con que c'est pas facile à expliquer.

En gros la boucle fait ça si tu apsse 1 en paramètre:
grille(1,6) -> grille(1,5) -> grille (1,4).... grille(1,0) fin
Tu comprends ce que ça fait quand même?

Edo, je commence à me dire que c'est toute la base de l'algo qui n'est pas claire pour toi et que quelque part, on doit laisser tomber ton projet et toute reprendre vachement plus en amont.

je te remet l'algo qui détermine où le pion atterrie.

ajout(couleur, col, grille)

if (grille[col][6] == 0)
then
{
j = 5;
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)

Quand tu appuis sur le bouton 1, tu appelle ajout avec en paramètre la couleur du joueur, 1 (le numéro de la colonne) et grille.

exemple : ajout(1,1,grille)
je précise que le premier 1, c'est 1 qui signifie rouge. Tu te souviens? tableau d'entiers... Ca suppose que tu saches qui joue au moment où on clique. Tu vas devoir te démerder pour garder cette info qqpart...

Et là j'ai très peur parce que je passe grille en paramètre mais je comptais sur toi pour maitriser un peu le langage. Grille est une variable globale qu'il faut garder en mémoire toute la partie. Comme tu vas faire une modif sur grille, ben je l'ai passée en paramètre m'enfin ça dépend de la syntaxe de chaque langage. Parfois, pas besoin de l'avoir en paramètre parce que le langage sait de quoi tu parles, parfois les langages réinitialise les variables après le return comme le C. Disons que grille serait passé parce que c'est un pointeur. Le C va remettre la valeur de départ dans le pointeur mais va laisser les modifs sur les objets pointés... C'est du chinoi ce que je te raconte j'imagine?
Le soucis c'est que moi le VBA j'en ai fait en autoditacte une fois dans ma vie mais je suis pas expert et j'ai oublié. Et là j'ai moyen envie de m'y remettre mais tu me mets tellement au pied du mur avec des questions de base que la seule manière pour moi de répondre c'est de faire le programme de mon côté pour être sur qu'il tourne en VBA.
Ce que je veux dire c'est que je peux t'aider pour l'algo mais pour l'implémentation pure je suis obligé de le coder aussi et de me remettre à niveau en VBA et là ça devient quand même relou pour moi.

Ou alors je laisse la main à quelqu'un de plus à jour que moi en VBA qui pourra vraiment t'accompagner dans l'implémentation.
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 14 Déc 2013 13:55

D'ailleurs un truc n'a pas été précisé dès le départ je crois :
-ton jeu c'est pour un joueur contre un autre joueur humain (donc chacun son tour devant le même PC)
-ou alors c'est un joueur contre le PC (et du coup faudrait aussi gérer l'IA après chaque coup du joueur humain)

:-D (pour info pour le second cas on trouve facilement des exemple tout prêt en téléchargement sur le net si ça peut t'aider : http://codes-sources.commentcamarche.ne ... sous-excel )
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 14 Déc 2013 14:31

Non, c'est humain contre humain.

Je suis dessus comme un fou depuis ce matin.
Pour l'instant, j'ai réussi à faire que les jetons s'empilent.
Et j'ai réussi à déterminer un gagnant, mais c'est bizarre. En fait, des fois, quand 4 pions jaunes sont sur une ligne, même si ils ne sont pas de suite et à condition qu'il n'y pas de rouge entre, hé ben le joueur jaune gagne!

Ex : J J X J J X X (X représentant une case vide et J un pion jaune)
le joueur jaune gagne!

En colonne, les joueurs peuvent gagner uniquement si leur colonne commence en ligne 0 (tout en bas quoi)

Et en diagonale, j'ai l'impression que ça ne marche pas.

Bref, il est capricieux ce code... Mais j'ai l'impression d'être pas loin du but.
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 14 Déc 2013 14:53

Ah ça y est, j'ai compris le problème!
En fait on peut gagner en colonne en partant au dessus de la ligne 0.

Le truc, c'est que mon code fonctionne comme ça :
- un pion jaune = -1
- un pion rouge = 1
évidemment, le but pour le joueur jaune, c'est d'obtenir -4 et pour le joueur rouge, c'est d'obtenir 4.
Or, avec mon code, ça somme tout à chaque fois!

Ce qui fait que dans une config comme celle-ci :
X J J J X J X
Jaune gagne

Mais avec une config comme ça :
X J J J R J X
Jaune ne gagne pas car il y a Rouge au milieu. Normal me direz-vous.

Oui, mais avec cette config là :
R J J J J X X
Jaune ne gagne pas non plus.

Pour qu'il gagne, il faut :
R J J J J J X
Parce que, comme J = -1 et que R = 1, donc : 5*(-1) + 1 = -5 + 1 = -4, et donc victoire.

De plus, autre bizarrerie, mais celle-là, je n'arrive pas à l'expliquer : lorsque j'ai 2 cases vides de suite dans une ligne, ça ne fonctionne pas.
Ex :
J X X J J J X
Là, Jaune ne gagne pas car il y a 2 cases vide de suite...
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 14 Déc 2013 20:50

ta logique n'aurait pas pu conduire à un autre résultat.
T'es pas en train de coder un puissance 4. Encore uen fois tu peux t'amuser à le tourner dans tous les sens, il n'y a pas vraiment d'autre méthode que la mienne.
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 14 Déc 2013 20:51

aaaaaaaaaaaahhhhh!!!!

Je sens que je suis pas loin, ça me saoûûûûûûle!!!!
J'en peux plus!

Comment vous faites pour initialiser toutes les cases à zéro ? Comme ça ? :
For i = 0 To 6 Step 1
For j = 0 To 5 Step 1
Grille(i, j) = 0
Next j
Next i

J'en ai ras le sac! :banghead:
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 14 Déc 2013 21:55

oui c'est c'est ça à priori.

Je déteste toujours les fonction for parce qu'on controle mal l'incrémentation et les conditions d'arrêt et je persiste à croire que c'est mauvais d'utiliser ça pour toi alors que t'es notions sont fragiles mais bon. Je renonce.
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 14 Déc 2013 22:01

Je déteste tout ce qui est boucle parce que j'y comprends pas grand chose, mais je vois pas comment faire autrement... :cry:
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 15 Déc 2013 02:01

j'en doute pas une seconde. Ca se sent dans ta manière d'aborder ton projet.
Pas pour rien que je t'ai dit que je pensais qu'il fallait tout t'expliquer bien plus en amont.

Je te le répète encore, j'ai pas vu les boucles for avant 1an à epita. Arrête de les utiliser, c'est pas assez clair dans ta tête pour que tu le fasses!
Je t'ai pas dit de pas utiliser les boucles. C'est indispensable. Je t'ai dis d'utiliser le formalisme avec le while!!!!! Parceque c'est un formalisme plus explicite et plus carré. Le formalisme for est une version plus compacte et plus implicite, c'est bon pour un mec qui sait ce qu'il fait. Je pense que j'ai un niveau vachement supérieur au tiens et pourtant j'utilise quand même des while alors je te conseille de faire pareil tant que ce sera pas bien clair pour toi.

Une boucle, ça n'a rien de sorcier.
tu as une initialisation, une condition d'arrêt, des actions à répéter et une incrémentation.
L'exemple le plus con de la terre. Tu comptes jusqu'à 3 et tu affiches le nombre dans une msgbox à chaque incrémentation. Je le fais en vba parce que je suis sympa.

i=1
while (i <= 3)
msgbox(i)
i = i + 1
wend
msgbox("fin")

maintenant comment l'ordi lit ça?
i = 1
i <= 10? oui donc j’exécute les instructions
msgbox(i) sachant que i = 1, j'affiche 1 dans une msgbox
i = i + 1 dont i =2
wend (qui signifie while end tout bêtement), je retourne en haut de la boucle (while i <= 3) i <= 3 ? Oui donc j'execute les instructions de la boucle
msgbox(i) sachant que i = 2, j'affiche 2 dans une msgbox
i = i + 1 dont i =3
wend, je retourne en haut de la boucle (while i <= 3) i <= 3 ? Oui donc j'execute les instructions de la boucle
msgbox(i) sachant que i = 3, j'affiche 3 dans une msgbox
i = i + 1 dont i =4
wend je retourne en haut de la boucle (while i <= 3) i <= 3 ? Non! donc je sors de la boucle et je reprend le programme apres le wend.
msgbox("fin")

Focalise toi sur l'initialisation : i = 1
la condition d'arrêt : i <= 3
la règle d'incrémentation : i = i + 1
Ce sont les 3 éléments fondamentaux de la boucle.

Honêtement edo, suis même pas sur que tu ais assimilé le concept d'algo. Je sais que tu lis qu'à moitié mes messages et que tu fonces tête dans le guidon mais je serais toi, je me concentrerai sur les bases parce que ça se voit que t'es totalement paumé et que t'as aucun bon réflexe. Deacon a compris à la seconde ce que je faisais et aurais pu l'intégrer à son projet aussi sec. C'est pas un projet dur, c'est vraiment bateau.

si je te demande de compter 2 par 2, tu sais faire?
Si je te demande de lister les puissances de 2, tu sais faire?
Si je te demande de me donner la liste les nombres premiers de manière décroissante de 1000 à 1, tu sais faire?
Si je te demande de parcourir une liste d'entier pour m'indiquer quel est le plus grand entier de la liste, tu sais faire?
Si je te demande de vérifier qu'aucun entier ne dépasse 5 dans une liste d'entier tu sais faire?
Est ce qu'au moins on t'a fait faire ces exo? A mon avis non et c'est pas étonnant que tu nages. Pourtant ce sont vraiment des exemples archi simplistes. Tu devrais pouvoir faire ça sans réfléchir.
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 15 Déc 2013 19:47

Hello Thyre!
Excuse moi de ne pas avoir répondu plus tôt, mais cet après-midi, c'était la chasse aux cadeaux. Je n'avais donc que ce matin, que j'ai utilisé pour travailler sur ce satané Puissance 4, plutôt que de répondre à tes provocations! :goutter:

Alors, de 1, non seulement j'ai tout lu ce que tu as écrit (et pas en vrac!), mais plus encore : j'ai tout recopié tes codes sur des feuilles, avec un stylo (oui oui!) et en traduisant le tout en VBA (ou en essayant du moins).
J'ai supposé que tout ce qui calcule les lignes, les verticales et les diagonales étaient une Private Sub et que le "ajout" était une Private Function.
J'ai donc ajouté tout cela à mon code qui me permettait d'ajouter les jetons dans ma grille.
J'ai eu quelques erreurs à débugger pas trop dures, du genre, l'ordi ne connaissait pas i ; bon ben : Dim i as Integer, et pareil pour j tant qu'on y est.

Mais après j'ai eu des trucs un peu plus hard, du genre, dans l'expression :
While (i > 0 And Grille(i - 1, j).Couleur = Couleur And Pion_Count < 4)
---> il me surligne "Grille" en me disant : "Erreur de compilation, Qualificateur incorrect"
Alors là, je ne sais pas du tout quoi faire...

Bref, j'ai une 3è copie, très inspirée de ton code, et je crois que je suis vraiment pas loin :

Morceau de code pour compter les jetons jaunes en colonne :
Private Function Somme_Jaune(ByVal Colonne As Integer) As Integer

Dim i As Integer
Dim Somme As Integer

i = 0
While (i <= 5)
If Not Rouge Then
If Ligne = 0 Then
Somme = -1
ElseIf Grille(Ligne - 1, Colonne) > 0 Then
Somme = -1
Else
Somme = Somme + Grille(i, Colonne)
End If
End If
i = i + 1
Wend

Somme_Jaune = Somme
End Function


Le souci, c'est dans le "Else" je pense. En fait, ça ne devrait pas être (i, colonne) en entier, mais seulement i à partir du moment où il est égal à la (Ligne - 1).
Mais je ne comprends pas, ça ne fonctionne pas...
Dernière édition par Edonist le 24 Déc 2013 09:44, édité 1 fois.
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 15 Déc 2013 21:23

oui, la faute à ta formation qui doit pas être terrible et je dis ça parce que j'en ai fait aussi dans le même style.

if not Rouge then. C'est quoi rouge? Ce n'est pas initialisé dans la fonction.
if Ligne = 0. C'est quoi ligne? Ca n'a jamais été initialisé.

Tu as choisi quoi comme structure pour grille? Qu'est ce qu'on trouve dedans?
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 15 Déc 2013 23:03

Ah oui!

Dim Rouge as Boolean
Dim Grille(6, 7) as Integer
Dim Ligne as Integer

à savoir aussi :
Const Pion_Rouge = 1
Const Pion_Jaune = -1
Const Case_Vide = 0

Au moment où on entre dans ma fonction, la Ligne et la Colonne sont déjà trouvées.
Exemple : si le jeton tombe dans la case à ligne 2, colonne 3, alors quand on entre dans fonction : Ligne = 2 et Colonne = 3
A savoir que Ligne et Colonne commencent à 0 (et non à 1).

J'ai aussi des doutes sur le "Rouge as Boolean".
Je me dis que ça peut fonctionner pour les colonnes, mais pour les lignes, c'est plus délicat.
Je m'explique :
- dans une colonne, quand on met un jeton, il y en a forcément 1 en dessous, qu'il soit jaune ou rouge. Donc si Rouge = true, Rouge = Rouge. Et si Rouge = False, Rouge = Jaune.
- dans une ligne, c'est plus délicat, car la case à gauche d'un jeton placé peut être Rouge, Jaune, mais également Vide! Donc là, c'est plus vraiment Boolean.

Autre indication sur mon code :
Je mets :
If Ligne = 0 Then
Somme = -1
parce que en dessous, il y a :
ElseIf Grille(Ligne - 1, Colonne) > 0 Then
Somme = -1
et si je ne le mets pas, alors quand le code passe dans Grille(Ligne - 1, Colonne), il me balance une erreur, car (Ligne - 1) n'est pas dans la zone définie. En effet, i est initialisé à 0. Or, le premier jeton placé tombe en Ligne = 0. Donc (Ligne - 1) = -1, ce qui est "en dehors des clous", puisqu'on reste entre 0 et 5.

De plus, dans :
ElseIf Grille(Ligne - 1, Colonne) > 0 Then
Somme = -1
le "> 0" est là pour identifier le Rouge, car d'après les définitions de Constantes (voir plus haut), Pion_Rouge = 1 et Pion_Jaune = -1.
S'il y a un pion rouge en dessous, c'est donc forcément positif.
Si c'est un jaune, c'est forcément négatif.
---> avant de passer dans la fonction, le code passe dans une Private Sub dans laquelle il y a cette ligne :
Grille(Ligne, Colonne) = Pion_Jaune
ou
Grille(Ligne, Colonne) = Pion_Rouge

Par exemple, si un pion rouge est placé en Ligne 2, Colonne 3, on sait déjà avant d'entrer dans la fonction que Grille(2, 3) = 1

Voilà, je crois que j'ai rien oublié...
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 16 Déc 2013 10:04

Avec ce code là :
Private Function Somme_Jaune(ByVal Colonne As Integer) As Integer

Dim i As Integer
Dim j As Integer
Dim Somme As Integer

i = 0
While (i <= 5)
If Not Rouge Then
If Ligne = 0 Then
Somme = -1
Somme_Jaune = Somme
Exit Function
ElseIf Grille(Ligne - 1, Colonne) > 0 Then
Somme = -1
Somme_Jaune = Somme
Exit Function
ElseIf Grille(i, Colonne) < 0 Then
Somme = Somme + Grille(i, Colonne)
End If
End If
i = i + 1
Wend

Somme_Jaune = Somme
End Function


Donc ajout de "End Function", mais surtout ajout de : ElseIf Grille(i, Colonne) < 0 Then

J'arrive à faire qu'il ne considère que les jaunes, et quand il y en a 4, c'est gagné!
Problème : il s'en fout qu'ils soient ou non les uns à la suite des autres.

Exemple :
X
J
J
J
J
R
Jaune Gagne! :pouce:

Mais :
J
J
R
R
J
J
Jaune Gagne aussi! :blaze:
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 16 Déc 2013 10:24

je vais regarder plus tard.
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 16 Déc 2013 18:11

Non, en fait, même ça, ça ne marche pas car :
J
R
R
J
J
J
Jaune ne gagne pas!

En fait, il ne gagne que si il y en a 4 dans la colonne ET à condition qu'il y ait un pion jaune juste sous le dernier pion jaune inséré dans la colonne...
C'est à devenir fou ce truc!
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 16 Déc 2013 20:04

Putain, ça y est, je crois que les colonnes, ça marche!!!! :fete:

Private Function Somme_Jaune(ByVal Colonne As Integer) As Integer

Dim i As Integer
Dim j As Integer
Dim Somme As Integer



i = 0 'on initialise i à 0
While (i <= 5) 'tant que i est inférieur ou égal à 5
If Not Rouge Then 'si c'est au tour du joueur jaune, alors
If Ligne = 0 Then 'si la variable Ligne = 0, alors
Somme = -1 'la variable Somme = -1
Somme_Jaune = Somme 'et la fonction Somme_Jaune retourne la valeur -1
Exit Function 'on sort de la fonction
ElseIf Ligne = 1 Then
Somme = -1
Somme_Jaune = -1
Exit Function
ElseIf Ligne = 2 Then
Somme = -1
Somme_Jaune = -1
Exit Function
ElseIf Grille(Ligne - 1, Colonne) > 0 Then 'sinon, si la case en dessous de laquelle on a joué est occupée par un pion rouge
Somme = -1 'la variable Somme = -1
Somme_Jaune = Somme 'et la fonction Somme_Jaune retourne la valeur -1
Exit Function 'on sort de la fonction
Else

If Grille(Ligne, Colonne) + Grille(Ligne - 1, Colonne) + Grille(Ligne - 2, Colonne) + Grille(Ligne - 3, Colonne) = -4 Then 'sinon, si la case en question est occupée par un pion jaune, alors

Call MsgBox("Jaune Wins!", vbExclamation)

End If
Exit Function

End If
End If
i = i + 1
Wend

Somme_Jaune = Somme
End Function


Bon, on peut peut-être optimisé un peu en rendant ça plus clair, mais voilà : c'est déjà un grand pas pur l'humanité...
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

PrécédentSuivante

Retourner vers Informatique

Qui est en ligne

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

cron