IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Faire un Memory Game en VB (problème)


Sujet :

Windows Forms

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Faire un Memory Game en VB (problème)
    Bonjour !

    Je suis nouvelle et j'apprends depuis peu le VB. Dans le cadre d'un projet, je dois créer un Memory Game, un jeu où il faut trouver 4 cartes identiques (mon jeu comporte 20 cartes, avec 5 cartes différentes). Une fois que l'utilisateur a trouvé 4 cartes identiques, elles "disparaissent". Pour les images, j'ai utilisé des labels et je me pose des questions sur comment je vais faire pour retourner les cartes lorsque l'utilisateur va cliquer sur le dos des cartes.

    J'ai pensé "empiler" les cartes (son dos et le devant) et ensuite faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
        Label21.Show()
        Label1.Hide()
    End Sub
    'Les labels de 1 à 20 représentent le dos(donc identiques) et de 20 à 40 sont le devant(=différentes)
    Mais voilà... cette technique risque d'être un peu longue .. et puis, avec les contrôles sur les images identiques, je ne pense vraiment pas qu'il s'agit d'une bonne méthode ! Surtout que le code risque d'être un peu répétitif si je fais Label2.Click, Label3.Click ... 20 fois ! Il y a également le problème lié à l'image : je ne peux pas comparer deux images (ex: label1.image <> label2.image).

    Je ne sais donc pas comment m'y prendre, ni par où commencer..

    Merci d'avance !

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tu peux commencer par lire ce cours : http://plasserre.developpez.com/cours/vb-net/
    ca prend quelques dizaines d'heures mais après on est un peu plus paré

    vb.net est un langage orienté objet, il faut donc coder en suivant ce concept
    il te faut donc des classes
    par exemple une classe carte avec l'affichage de chaque face par exemple, et le contenu de la carte
    comme ca au démarrage du défini le nombre de cartes, éventuellement le nombre de cartes identiques par série
    et l'interface peut alors être construite avec une boucle (plutot que de poser les controles à la main)
    et une classe série (= un essai) avec une collection de carte cliquée
    quand la série est remplie, alors tu vérifies que les cartes ont toute le même contenu

    ainsi tu n'as pas de code style label1, tu as du code générique qui s'applique peu importe les cartes
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord merci pour votre réponse !
    J'ai également une autre question : pour les cartes j'ai utilisé des labels. Serait-il préférable d'utiliser une pictureBox ou bien cela n'a pas grande importance ? Surtout parce qu'il faut après comparer deux images..

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Si tu codes en poo tu pourras remplacer les labels par des picturebox très facilement. Donc autant partir sur des labels simples avec du texte et quand ca marche tu regardes pour améliorer l'interface.
    Et ca ne sera pas l'image elle même que tu vas comparer mais un identifiant d'image
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Cela fait plusieurs jours maintenant que je travaille sur ce projet et j'ai encore des difficultés ...
    En premier : je ne vois pas comment retourner les cartes. Je tiens à préciser que comme je viens de débuter, je ne pense pas qu'il nous ait demandé de faire des classes etc.. mais seulement des formules et module.
    Je ne vois également pas comment ajouter des images aux labels : je les ai rajouté "manuellement" par le biais de la fenêtre de propriétés mais je ne suis pas sure s'il s'agit de la bonne façon de faire.. (j'ai entendu dire qu'il fallait mettre un chemin relatif de l'image...)
    Une dernière chose : dans le module, j'ai fait une structure Joueur, caractérisée par entre autre son nom, son meilleur temps etc.. et par la suite j'ai fait un tableau de Joueur pour stocker les joueurs pour, par la suite, mettre les noms dans une combobox au niveau de l'accueil du jeu (l'utilisateur pourra taper un nouveau nom ou selectionner un nom déjà rentré). Je voudrais savoir s'il est préférable de faire un tableau de Joueurs ou un tableau de String ?
    En faisant ça, ma combobox ne fonctionne pas ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cbox_NomJoueur.DataSource = JeuM.tableauJ
    Merci de votre aide !

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par Obalie Voir le message
    Je tiens à préciser que comme je viens de débuter, je ne pense pas qu'il nous ait demandé de faire des classes etc.. mais seulement des formules et module.
    si le but c'est de faire un truc tout nul, tout moche et que ne suit pas les normes du langage autant que tu te débrouilles
    (ce n'est qu'à moitié une blaque, si le but c'est de coder sans connaissance c'est étrange, et si le but c'est de coder comme sur un langage des années 90 autant rester sur un langage des années 90 plutôt qu'un langage orienté objet)

    concernant le combobox, lui donner une liste de chose c'est bien, mais il faut lui préciser ce qu'il doit afficher pour ces choses
    cmbbox.displaymember = "le nom de la propriété de ta sructure que tu veux afficher"
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Obalie Voir le message
    En premier : je ne vois pas comment retourner les cartes.
    Comme @Pol63 l'a indiqué, tu peux faire une classe carte, qui comprend une face cachée et une face visible et qui gère l'affichage de celle-ci. (un contrôle utilisateur serait parfait). Et dans les faits, tu ne vas pas "retourner" la carte, mais changer son image.

    Un conseil, avant de t'embêter avec la gestion des images, essaye de faire la même chose avec un simple texte (genre des numéros de 1 à 5). Ca va simplifier les choses dans un premier temps. Une fois ton jeu fonctionnel tu pourras t'occuper de la partie design de ton app

    Citation Envoyé par Obalie Voir le message
    Je tiens à préciser que comme je viens de débuter, je ne pense pas qu'il nous ait demandé de faire des classes etc.. mais seulement des formules et module.
    Il y a deux écoles pour ça : faire le minimum syndicale ou essayer de faire au mieux. Si tu essayes dès à présent de manipuler les concepts POO, je peux t'assurer que tu vas gagner du temps par la suite (tu comprendras mieux les cours, tu prendras de l'avance sur le long chemin de l'apprentissage du métier, etc...

  8. #8
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Voici un memory Game avec des Controls Label (ou un PicBox si tu veux)...

    Comme dit par Pol63,il faut des notions de POO et donc un class ....
    Mais un Control Label est un Class (armé de pied en cap )...
    La 1ere difficulté dans ce jeu, comme souligné par Pol63, est de manipuler non pas les Controls Labels et les Images mais les identifiants d'image (index d'images dans l'exemple ci-après) ...
    La 2eme difficulté c'est de battre les "index des images" mémorisés dans la prop "tag" des Labels et de réassigner un nouveau index "aléatoirement" dans ce "tag" ...
    Les Controls de l'exemple :
    1/Control ImageList pour storer nos images de cartes :
    - 5 images différentes (index de 0 à 4)
    - 1 image de "dos" à bricoler (index 5)
    2/ Un List(of Label) Cartes qui mémorise les Labels à afficher
    3/ Un List(of Label) Choix qui mémorise les Labels choisis "cliqués"
    4/ 2 boutons (2 matches et 3 matches)

    NotaBene1:Le List(Of Integer) IndexConcordants memorise les "index" qui coïncident..
    NotaBene2: un clic sur le bouton btnTwoMatches ou btnThreeMatches relance le jeu

    code exemple .vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     
    Public Class Form2
        Private Cartes As New List(Of Label)
        Private ListeChoix As New List(Of Label)
        Private IndexConcordants As New List(Of Integer) 'store les "index" qui coincident
        Private nombreDeCopie As Integer ' nombre de copies
        Private Sub btnTwoMatches_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTwoMatches.Click
            SetupCartes(5, 2)
        End Sub
     
        Private Sub btnThreeMatches_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThreeMatches.Click
            SetupCartes(5, 3)
        End Sub
        Private Sub SetupCartes(ByVal nbSerie As Integer, ByVal nbCopie As Integer)
            ' Start by calculating the number of cards that will be displayed. This is number of card variations times copies per card.
            ' Resize our cards array to fit all these cards.
     
            nombreDeCopie = nbCopie
     
            ' Clear  game data
            ClearGame()
     
            ' compteur dans ImageList
            Dim imageListIndex As Integer = 0
            Dim length As Integer = nbCopie * nbSerie
     
            ' step nbCopie.
            For i As Integer = 0 To length - 1 Step nbCopie
     
                ' Makes copies of each card and tag each card with the index from the image list
                For j As Integer = 1 To nbCopie
                    Dim lblCard As Label = New Label()
                    'assigne l'image de "dos"
                    lblCard.Image = ImageList1.Images(ImageList1.Images.Count - 1)
     
                    'memorise dans le champ tag l'image à afficher
                    lblCard.Tag = imageListIndex
                    AddHandler lblCard.Click, AddressOf Me.CarteFlip_Click
     
                    Cartes.Add(lblCard)
                Next
     
                imageListIndex += 1
            Next
            ' Battre les index cartes(champ tag)
            Shuffle(Cartes)
     
            ' Affiche 5 cartes / ligne
            AfficheCarte(5)
     
        End Sub
        'initialise le jeu
        Private Sub ClearGame()
            If Cartes.Count > 0 Then
                For i As Integer = 0 To Cartes.Count - 1
                    Me.Controls.Remove(Cartes(i))
                Next
            End If
     
            ' Clear la liste de Cartes et la liste Choix .
            Cartes.Clear()
            ListeChoix.Clear()
     
        End Sub
        ' Bat la liste des controls Labels aleatoirement avec le Fisher-Yates algorithm
        Private Sub Shuffle(ByRef LesCartes As List(Of Label))
            Dim r As Random = New Random()
            For i = 0 To LesCartes.Count - 1
                Dim index As Integer = r.Next(i, LesCartes.Count)
     
                ' simple permutation
                If i <> index Then
                    Dim temp As Label = LesCartes(i)
                    LesCartes(i) = LesCartes(index)
                    LesCartes(index) = temp
                End If
            Next
        End Sub
     
        Private Sub AfficheCarte(ByVal cartesParLigne As Integer)
            Dim startX As Integer = 50
            Dim startY As Integer = 100
            Dim sizeCarte As New Size(100, 100)
            Dim separator As Integer = 20
            For i As Integer = 0 To Cartes.Count - 1
                Cartes(i).Top = startY
                Cartes(i).Left = startX
                Cartes(i).Size = sizeCarte
                Me.Controls.Add(Cartes(i))
     
                Cartes(i).Visible = True
     
                startX += sizeCarte.Width + separator
     
                If (i + 1) Mod cartesParLigne = 0 Then
                    startX = 50
                    startY = startY + 166
                End If
            Next
        End Sub
     
        Private Sub CarteFlip_Click(ByVal sender As Object, ByVal e As EventArgs)
            Dim picture As Label = CType(sender, Label)
            Dim idTag As Integer = CType(picture.Tag, Integer)
     
            If Not ListeChoix.Contains(picture) And Not IndexConcordants.Contains(idTag) Then
                ListeChoix.Add(picture)
                MontreCarte(picture)
     
                If ListeChoix.Count = nombreDeCopie Then
                    If ConcordanceChoix() Then
     
                        IndexConcordants.Add(idTag)
                    Else
                        Threading.Thread.Sleep(1000)
     
                        ' Cache les choix faits
                        For i As Integer = 0 To ListeChoix.Count - 1
                            CacheCarte(ListeChoix(i))
                        Next
                    End If
     
                    ' Efface tous les choix
                    ListeChoix.Clear()
                End If
            End If
        End Sub
        'on affiche l'image correpondant au  "tag"
        Private Sub MontreCarte(ByVal carte As Label)
            carte.Image = ImageList1.Images(Convert.ToInt32(carte.Tag))
            Me.Refresh()
        End Sub
        'on affiche l'image du  "dos" simplement
        Private Sub CacheCarte(ByVal carte As Label)
            carte.Image = ImageList1.Images(ImageList1.Images.Count - 1)
        End Sub
        ' Verifie à chaque clic que les cartes choisies coincident(compare précédent et suivant) 
        ' renvoi True ou  False
        Private Function ConcordanceChoix() As Boolean
            For i As Integer = 1 To ListeChoix.Count - 1
                Dim c1 As Integer = CType(ListeChoix(i - 1).Tag, Integer)
                Dim c2 As Integer = CType(ListeChoix(i).Tag, Integer)
     
                If c1 <> c2 Then
                    Return False
                End If
            Next
     
            Return True
        End Function
     
     
     
     
     
    End Class

Discussions similaires

  1. Un petit Memory game dynamique!
    Par Ivady dans le forum Projets
    Réponses: 22
    Dernier message: 18/07/2009, 17h13
  2. Faire un BMP avec plusieurs PNG, problème de couleur ?
    Par [ZiP] dans le forum Composants VCL
    Réponses: 6
    Dernier message: 09/09/2008, 16h41
  3. Problème unit CRT pour Faire du Pascal avec Delphi
    Par alexmorel dans le forum Débuter
    Réponses: 4
    Dernier message: 01/06/2004, 17h13
  4. Réponses: 7
    Dernier message: 26/02/2004, 09h32
  5. Problème avec memory mapping
    Par gemai dans le forum C
    Réponses: 13
    Dernier message: 04/07/2003, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo