Urgent ! SVP ! Débutant(e)s avec un projet pas facile !!! :)

lorisboogie Messages postés 9 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 19 novembre 2010 - 6 oct. 2010 à 16:18
lorisboogie Messages postés 9 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 19 novembre 2010 - 14 oct. 2010 à 17:58
Salut à tous !

Cela fait maintenant plusieurs heures que mon binome et moi même sommes totalement perdu sur VB2005!

Nous devons rendre un programme dans 15jours, mais nous butons sur plusieurs problèmes!

les problème sont:
créer une grille 6*6 ==> le plus gros problème à ce jour, nous ne trouvons pas comment créer une grille pour que chaque case ait 2coordonnées (x,y)
On a vu des codes comme viewlist ? MSflex ? tablelayout? c'est quoi tout ca ?? :)))

On a codé trois points A, B et C de coordonnées différentes X et Y de manière aléatoire. On voudrait qu'a c'est trois points apparaissent une image sur la grille dans chacune des cases qui correspondent aux coordonnées précédentes.

Enfin (pour le moment) on souhaiterai mettre des images tout autour de cette grille mais qui apparaissent que lorsque on pointe le curseur de la souris et qui disparaissent ensuite !

Merci de votre aide , en espérant avoir une réponse rapide !!

Merci!

Loris et Monica

11 réponses

CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
6 oct. 2010 à 18:07
Salut Loris,
Un DataGridView devrait t'aider a faire ce que tu veux, je pense que vb2005 doit l'avoir en objet.
Par contre ton histoire d'image autour te demandera un peu de travail avec les evenements de la souris.
On peut afficher des images dans chaque case
du datagridview (lien)

http://msdn.microsoft.com/fr-fr/library/2ab8kd75(VS.85).aspx

VbFrance ou Google t'aiderons ensuite ...

Sinon
Bonne Prog CGSI3
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
8 oct. 2010 à 13:04
Pas clair ton message.
- Tu veux une grille de 6x6 cases.
- Au passage de la souris sur une de ces cases s'affiche à la périphérie de la grille une image.
- Quant à l'histoire des 3 points, j'ai strictement RIEN compris.

Néammoins, à mon avis, pour toi le plus simple est de créer un tableau de pictureBoxes organisés en grille.
Ils réagiront aux évènements MouseEnter et MouseLeave.

Voilà.
Sois plus clair si tu réclames plus d'aide.
0
lorisboogie Messages postés 9 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 19 novembre 2010
8 oct. 2010 à 16:31
Merci à tous les deux !

Et désolé de ne pas être assez clair mais ca l'est dejà peu pour moi! Alors l'expliquer aux autres !! ^^
On a essayer la datagridview, mais on comprend pas son systeme, notamment comment rajouter des ligne, on a que des colonnes!
On a également essayer de faire un assemblage de pictures box sous forme de grille que l'on a casé dans une layoutable de 6*6 !
On est vraiment bloqué et pas de nouvelles de notre prof!

On s'est pas comment faire !

Bizx
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
9 oct. 2010 à 18:34
Salut Loris,
Je ne sais pas ce que tu fera mais au cas ou tu utilise un datagridview je te laisse 2 Sub perso que je viens juste de mettre au point
Tu y trouvera comment travailler avec le nombre de colonnes, de lignes et comment remplir les cases (ici avec des singles mais ca peut se modifier ...)
Epluche ça, tu en comprendra surement le sens

Sub Export_GridView(ByVal Grille As DataGridView, ByRef Matrice As Single(,))
'Auteur: CGSI3 But: Initialise un Datagridview depuis un tableau 2 Dimensions de single (chiffre réel)
Dim Max1 As Integer, Max2 As Integer
Max1 Matrice.GetUpperBound(0) : Max2 Matrice.GetUpperBound(1)
If Grille.DataSource = Nothing Then
Grille.ColumnCount = Max1 + 1
Grille.RowCount = Max2 + 1
End If
For cp1 As Integer = 0 To Max1
For cp2 As Integer = 0 To Max2
Grille.Item(cp1, cp2).Value = Matrice(cp1, cp2)
Next cp2
Next cp1
End Sub

Sub Colonne_Ajuste(ByVal Grille As DataGridView, Optional ByRef Largeur As Integer = 0)
'Auteur: CGSI3 But: Ajuste les colonnes d'un DataGridView selon sa fenetre de conception et son nombre de colonnes
If Largeur 0 Then Largeur (Grille.Width - 45) / Grille.ColumnCount
For cp2 As Integer = 0 To Grille.ColumnCount - 1
Grille.Columns.Item(cp2).Width = Largeur
Next cp2
End Sub

Bonne Prog CGSI3
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lorisboogie Messages postés 9 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 19 novembre 2010
12 oct. 2010 à 22:57
Merci CGSI3 !!!

En fait, mon binôme et moi avons réussi à nous débloquer enfin à ce niveau là ! Mais a peine débloquer un autre survient !!! lol

Alors je vais essayer de m'expliquer plus clairement cette fois ci!

Nous avons crée sur une Form1 un ensemble de picturebox cote à côte de tel sorte à former un grand carré de 8x8
Suite à ca nous avons créé une matrice 8x8 ou nous avons fait correspondre à chaque picture une coordonée (x;y).

Par exemple:
picturebox1 = Montableau(0;0)
picturebox2 = Montableau(0;1)
et ainsi de suite pour toute les 64 picturebox... (c'était long et fastidieux, je pense qu'il y avait plus simple mais bon...!)

Sur ce tableau sera positionner trois points A(x1;Y1) B(x2,Y2) et C(X3,Y3)
Qui correspond donc à 3 "bombes"

Le but du jeu est le suivant :
On envoie un "détecteur" qui en fonction des bombes qu'il rencontre change sa trajectoire, ainsi :

S'il arrive de face à une bombe, le détecteur fera illico demi tour et sortira par les même coordonnées par lequel il a été envoyé
S'il passe à côté d'une bombe, il tourne à 90°, à l'opposé de la case contenant donc la bombe.

Le jeu est de déterminer la position des 3 bombes en fonction des coordonnées d'entrée et de sortie des détecteurs lancés, avec le moins de détecteurs possibles.

Ce que nous cherchons :
Comment lorsqu'on clique sur une picture box , récupéré ses coordonnées X et Y ?
0
lorisboogie Messages postés 9 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 19 novembre 2010
12 oct. 2010 à 23:05
Nous avons établi toutes les trajectoires possibles
Mais comment traduire sous VB :

Si le détecteur envoyé en (0,Y1) et que la ligne Y est vide alors il sort en (7,Y1)
Si le détecteur envoyé en (O;Y1) et qu'il rencontre une bombe en (x2; Y1) donc il prend la trajectoire donnée (<-- on a déjà toutes les trajectoires possible)

Si quelqu'un à une idée à nous soumettre ca serait avec grand plaisir !!

On a pensé à utiliser les tags, et attribué un 1 pour les bombes et 0 pour les cases vide et faire la somme ensuite de la ligne ou de la colonne en question.
Problème: ca nous indique en effet si il y a aucune, une, ou plusieurs bombes mais pas les/la position(s) des bombes.....

Merci de votre aide !

Loris
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
13 oct. 2010 à 14:54
Salut loris,
J'essaierais de t'aider ce soir
Mon boulot me prend trop de temps l'AM
CGSI3
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
13 oct. 2010 à 20:44
Bonsoir,
Voici une ébauche de solution à ta réalisation.
Il ne manque que l'analyse des bombes sur le côté (je la ferai demain durant un break).
Toute l'interface est dans le source. En fait on part d'une classe "clsCase" qui contient des propriétés et des fonctions spécifiques au programme.
Ces cases sont distinctes : cases du plateau simplement encadrées et cases de la périphéries servant au tir.
A chaque MouseDown sur la Form, on vérifie quel type de case a été cliqué et on agit en conséquence.
Le programme possède un graphisme basique composé de rectangles pleins ou simplement encadré et de caractères. Mais ça permet de l'échanger via ce forum.
Pour le tester crééer simplement une Form nommée frmBombe et y coller l'ensemble du code figurant ci-dessous.
Bon test...
Si tu as des questions sur la procédure, je suis à ta disposition.


Public Class frmBombe

#Region "Classe clsCase"

    Private Class clsCase

        Private pPosition As Point
        Private pTaille As Size
        Private pEntourage As Boolean = False
        Private pFond As Boolean = False
        Private pClicAutorise As Boolean = True
        Private pContientUneBombe As Boolean = False
        Private pTexte As String = ""

        Public Sub New()
        End Sub

        Public Property Position() As Point
            Get
                Return pPosition
            End Get
            Set(ByVal value As Point)
                pPosition = value
            End Set
        End Property

        Public Property Taille() As Size
            Get
                Return pTaille
            End Get
            Set(ByVal value As Size)
                pTaille = value
            End Set
        End Property

        Public Property Entourage() As Boolean
            Get
                Return pEntourage
            End Get
            Set(ByVal value As Boolean)
                pEntourage = value
            End Set
        End Property

        Public Property Fond() As Boolean
            Get
                Return pFond
            End Get
            Set(ByVal value As Boolean)
                pFond = value
            End Set
        End Property

        Public Property ClicAutorise() As Boolean
            Get
                Return pClicAutorise
            End Get
            Set(ByVal value As Boolean)
                pClicAutorise = value
            End Set
        End Property

        Public Property ContientUneBombe() As Boolean
            Get
                Return pContientUneBombe
            End Get
            Set(ByVal value As Boolean)
                pContientUneBombe = value
            End Set
        End Property

        Public Property Texte() As String
            Get
                Return pTexte
            End Get
            Set(ByVal value As String)
                pTexte = value
            End Set
        End Property

        Public Function ClicDedans(ByVal pt As Point) As Boolean
            Dim rect As New Rectangle(Position, Taille)
            If rect.Contains(pt) True And ClicAutorise True Then Return True
        End Function

        Public Sub Dessiner(ByVal grf As Graphics)
            If Fond = True Then
                Dim rect As Rectangle = New Rectangle(Position, Taille)
                rect.Inflate(-2, -2)
                grf.FillRectangle(Brushes.Turquoise, rect)
            End If
            If Entourage = True Then
                grf.DrawRectangle(Pens.Black, New Rectangle(Position, Taille))
            End If
            If Texte <> "" Then
                Dim strFormat As New StringFormat()
                strFormat.Alignment = StringAlignment.Center
                strFormat.LineAlignment = StringAlignment.Center
                Dim police As New Font("Microsoft Sans Serif", 12, FontStyle.Bold, GraphicsUnit.Point, CType(0, Byte))
                grf.DrawString(Texte, police, Brushes.Black, New Rectangle(Position, Taille), strFormat)
            End If
        End Sub

    End Class

#End Region

    Private pCase(7, 7) As clsCase
    Private pCaseEntree As String
    Private pcaseSortie As String
    Private pNombreTirs As Integer
    Private pNombreEssais As Integer
    Private pNombreBombesTrouvees As Integer

    Private Sub frmBombe_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Définir la feuille
        Me.Size = New Size(440, 460)
        Me.Text = "Bombe !"
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
        Me.MaximizeBox = False
        Me.MinimizeBox = False
        Me.SetStyle((ControlStyles.DoubleBuffer Or (ControlStyles.AllPaintingInWmPaint Or ControlStyles.ResizeRedraw)), True)
        'Préparer le jeu
        Initialiser()
    End Sub

    Private Sub Initialiser()
        'Définir le quadrillage
        Dim cTaille As New Size(50, 50)
        For i As Integer = 0 To 7
            For j As Integer = 0 To 7
                Dim cCase As New clsCase
                cCase.Taille = cTaille
                cCase.Position = New Point(10 + i * cTaille.Width, 10 + j * cTaille.Height)
                If i > 0 And i < 7 And j > 0 And j < 7 Then
                    cCase.Entourage = True
                ElseIf (i <> 0 Or j <> 0) And (i <> 0 Or j <> 7) And (i <> 7 Or j <> 0) And (i <> 7 Or j <> 7) Then
                    cCase.Fond = True
                Else
                    cCase.ClicAutorise = False
                End If
                pCase(i, j) = cCase
            Next
        Next
        'Choisir les 3 cases qui contiendront une bombe
        Dim pHasard As New Random
        For i As Integer = 1 To 3
            Dim x As Integer
            Dim y As Integer
            Do
                x = pHasard.Next(1, 6)
                y = pHasard.Next(1, 6)
            Loop Until pCase(x, y).ContientUneBombe = False
            pCase(x, y).ContientUneBombe = True
        Next
        'Initialisation des variables
        pNombreEssais = 0
        pNombreTirs = 0
        pNombreBombesTrouvees = 0
    End Sub

    Private Sub frmBombe_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim bmp As New Bitmap(Me.Width, Me.Height)
        Dim grf As Graphics = Graphics.FromImage(bmp)
        'Dessiner les cases
        For i As Integer = 0 To 7
            For j As Integer = 0 To 7
                pCase(i, j).Dessiner(grf)
            Next
        Next
        'Basculer à l'écran et purger
        e.Graphics.DrawImage(bmp, 0, 0)
        grf.Dispose()
        bmp.Dispose()
    End Sub

    Private Sub frmBombe_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        For i As Integer = 0 To 7
            For j As Integer = 0 To 7
                If pCase(i, j).ClicDedans(e.Location) = True Then
                    If pCase(i, j).Fond = True Then
                        'Un tir
                        If pCaseEntree <> "" And pcaseSortie <> "" Then
                            'On efface l'essai précédent
                            pCase(Asc(pCaseEntree.Substring(0, 1)) - 64, Integer.Parse(pCaseEntree.Substring(1, 1))).Texte = ""
                            pCase(Asc(pcaseSortie.Substring(0, 1)) - 64, Integer.Parse(pcaseSortie.Substring(1, 1))).Texte = ""
                        End If
                        'Incrémenter le nombre tirs (on peut penser à afficher cette variable dans un label au bas de l'écran)
                        pNombreTirs += 1
                        'Nouvelle case "IN"
                        pCaseEntree = Chr(64 + i) & Chr(48 + j)
                        pcaseSortie = ""
                        pCase(i, j).Texte = "IN"
                        'Définir un sens de progression pour le tir
                        Dim x As Integer = i
                        Dim y As Integer = j
                        Dim progressionH As Integer = 0
                        Dim progressionV As Integer = 0
                        If i 0 Then progressionH +1
                        If i 7 Then progressionH -1
                        If j 0 Then progressionV +1
                        If j 7 Then progressionV -1
                        Do
                            x += progressionH
                            y += progressionV
                            If pCase(x, y).ContientUneBombe = True Then
                                'La case en face contient une bombe
                                progressionH = progressionH * (-1)
                                progressionV = progressionV * (-1)
                                x += progressionH
                                y += progressionV
                            End If

                            'Dévier la trajectoire si passe à proximité d'une bombe
                            'Pas encore fait

                            If x 0 Or y 0 Or x = 7 Or y = 7 Then
                                'Progression terminée
                                pcaseSortie = Chr(64 + x) & Chr(48 + y)
                                If pCase(x, y).Texte = "" Then
                                    pCase(x, y).Texte = "OUT"
                                Else
                                    pCase(x, y).Texte &= vbCrLf & "OUT"
                                End If
                            End If
                        Loop Until pcaseSortie <> ""

                    ElseIf pCase(i, j).Entourage = True Then
                        'Recherche d'un bombe
                        If pCase(i, j).Texte = "" Then
                            'Incrémenter le nombre d'essais (on peut penser à afficher cette variable dans un label au bas de l'écran)
                            pNombreEssais += 1
                            'Y a-t-il une bombe à cet endroit ?
                            If pCase(i, j).ContientUneBombe = False Then
                                'Un essai pour rien
                                pCase(i, j).Texte = "."
                            Else
                                pCase(i, j).Texte = "X"
                                Beep()
                                pNombreBombesTrouvees += 1
                                If pNombreBombesTrouvees = 3 Then
                                    Me.Refresh()
                                    Dim message As String = "Vous avez gagné en utilisant " & pNombreTirs.ToString & " tir(s) et " & pNombreEssais.ToString & " essai(s)."
                                    If MessageBox.Show(message & vbCrLf & "Voulez-vous rejouer ?", "Gagné", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.Yes Then
                                        Initialiser()
                                    Else
                                        Application.Exit()
                                    End If
                                End If
                            End If
                        End If
                    End If
                    Me.Refresh()
                    Return
                End If
            Next
        Next
    End Sub
End Class
0
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
13 oct. 2010 à 21:20
Salut Loris,
Je vais résumé ce que j'ai compris,
Dans une grille type "démineur", tu as 3 Bombes.
Tu lance dans cette grille des détecteurs qui doivent repérer mais ne jamais déclencher ces bombes.
Ensuite c'est un peu Flou
Quels sont les possibilités de ces détecteurs? Ils détectent 1 case autour d'eux ou par colonne ligne et diagonales ?
Je prend pour idée, que c'est 1 case autour.
Tu connais la position des bombes au démarage,
il suffit de faire un carré autour des détecteurs genre (y-1,X-1)(Y+1,X+1) et ensuite savoir si ces carrés entre en collisions avec la position des bombes (une fonction intersect existe pour cela)

http://msdn.microsoft.com/en-us/library/y10fyck0.aspx

Il faut énumérer toutes les collisions possibles entre tous les objets et faire ce test.
Tu sais alors si il y a collision ou non
Si collision alors tu lui donne une nouvelle direction
(demi tour ou 90°)
sinon le détecteur continu sa course
Il faut a chaque détecteur
un vecteur vitesse ex:(x=+1 Y=O)
J'espere que cela t'aidera.
Si tu n'as pas compris je te l'écrirai plus précisément.
Une manière d'optimiser son comportement est d'éviter que ce détecteur ne retourne vers une case déja testé (un tableau historique des déplacement est nécessaire)
Bonne soirée CGSI3
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
14 oct. 2010 à 10:57
Bon, c'est terminé !
Avec quelques modifs.

Public Class frmBombe

#Region "Classe clsCase"

    Private Class clsCase

        Private pPosition As Point
        Private pTaille As Size
        Private pEntourage As Boolean = False
        Private pFond As Boolean = False
        Private pClicAutorise As Boolean = True
        Private pContientUneBombe As Boolean = False
        Private pTexte As String = ""

        Public Sub New()
        End Sub

        Public Property Position() As Point
            Get
                Return pPosition
            End Get
            Set(ByVal value As Point)
                pPosition = value
            End Set
        End Property

        Public Property Taille() As Size
            Get
                Return pTaille
            End Get
            Set(ByVal value As Size)
                pTaille = value
            End Set
        End Property

        Public Property Entourage() As Boolean
            Get
                Return pEntourage
            End Get
            Set(ByVal value As Boolean)
                pEntourage = value
            End Set
        End Property

        Public Property Fond() As Boolean
            Get
                Return pFond
            End Get
            Set(ByVal value As Boolean)
                pFond = value
            End Set
        End Property

        Public Property ClicAutorise() As Boolean
            Get
                Return pClicAutorise
            End Get
            Set(ByVal value As Boolean)
                pClicAutorise = value
            End Set
        End Property

        Public Property ContientUneBombe() As Boolean
            Get
                Return pContientUneBombe
            End Get
            Set(ByVal value As Boolean)
                pContientUneBombe = value
            End Set
        End Property

        Public Property Texte() As String
            Get
                Return pTexte
            End Get
            Set(ByVal value As String)
                pTexte = value
            End Set
        End Property

        Public Function ClicDedans(ByVal pt As Point) As Boolean
            Dim rect As New Rectangle(Position, Taille)
            If rect.Contains(pt) True And ClicAutorise True Then Return True
        End Function

        Public Sub Dessiner(ByVal grf As Graphics)
            If Fond = True Then
                Dim rect As Rectangle = New Rectangle(Position, Taille)
                rect.Inflate(-2, -2)
                grf.FillRectangle(Brushes.Turquoise, rect)
            End If
            If Entourage = True Then
                grf.DrawRectangle(Pens.Black, New Rectangle(Position, Taille))
            End If
            If Texte <> "" Then
                Dim strFormat As New StringFormat()
                strFormat.Alignment = StringAlignment.Center
                strFormat.LineAlignment = StringAlignment.Center
                Dim police As New Font("Microsoft Sans Serif", 12, FontStyle.Bold, GraphicsUnit.Point, CType(0, Byte))
                grf.DrawString(Texte, police, Brushes.Black, New Rectangle(Position, Taille), strFormat)
            End If
        End Sub

    End Class

#End Region

    Private pCase(7, 7) As clsCase
    Private pCaseEntree As String
    Private pcaseSortie As String
    Private pNombreTirs As Integer
    Private pNombreEssais As Integer
    Private pNombreBombesTrouvees As Integer

    Private Sub frmBombe_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Définir la feuille
        Me.Size = New Size(440, 460)
        Me.Text = "Bombe !"
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
        Me.MaximizeBox = False
        Me.MinimizeBox = False
        Me.SetStyle((ControlStyles.DoubleBuffer Or (ControlStyles.AllPaintingInWmPaint Or ControlStyles.ResizeRedraw)), True)
        'Préparer le jeu
        Initialiser()
    End Sub

    Private Sub Initialiser()
        'Définir le quadrillage
        Dim cTaille As New Size(50, 50)
        For i As Integer = 0 To 7
            For j As Integer = 0 To 7
                Dim cCase As New clsCase
                cCase.Taille = cTaille
                cCase.Position = New Point(10 + i * cTaille.Width, 10 + j * cTaille.Height)
                If i > 0 And i < 7 And j > 0 And j < 7 Then
                    cCase.Entourage = True
                ElseIf (i <> 0 Or j <> 0) And (i <> 0 Or j <> 7) And (i <> 7 Or j <> 0) And (i <> 7 Or j <> 7) Then
                    cCase.Fond = True
                Else
                    cCase.ClicAutorise = False
                End If
                pCase(i, j) = cCase
            Next
        Next
        'Choisir les 3 cases qui contiendront une bombe
        Dim pHasard As New Random
        For i As Integer = 1 To 3
            Dim x As Integer
            Dim y As Integer
            Do
                x = pHasard.Next(1, 6)
                y = pHasard.Next(1, 6)
            Loop Until pCase(x, y).ContientUneBombe = False
            pCase(x, y).ContientUneBombe = True
            'La ligne ci-dessous permet de faire apparaître les bombes. Utile pour les tests
            'pCase(x, y).Texte = "X"
        Next
        'Initialisation des variables
        pNombreEssais = 0
        pNombreTirs = 0
        pNombreBombesTrouvees = 0
    End Sub

    Private Sub frmBombe_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim bmp As New Bitmap(Me.Width, Me.Height)
        Dim grf As Graphics = Graphics.FromImage(bmp)
        'Dessiner les cases
        For i As Integer = 0 To 7
            For j As Integer = 0 To 7
                pCase(i, j).Dessiner(grf)
            Next
        Next
        'Basculer à l'écran et purger
        e.Graphics.DrawImage(bmp, 0, 0)
        grf.Dispose()
        bmp.Dispose()
    End Sub

    Private Sub frmBombe_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        For i As Integer = 0 To 7
            For j As Integer = 0 To 7
                If pCase(i, j).ClicDedans(e.Location) = True Then
                    If pCase(i, j).Fond = True Then
                        'Un tir
                        If pCaseEntree <> "" And pcaseSortie <> "" Then
                            'On efface l'essai précédent
                            pCase(Asc(pCaseEntree.Substring(0, 1)) - 64, Integer.Parse(pCaseEntree.Substring(1, 1))).Texte = ""
                            pCase(Asc(pcaseSortie.Substring(0, 1)) - 64, Integer.Parse(pcaseSortie.Substring(1, 1))).Texte = ""
                        End If
                        'Incrémenter le nombre de tirs (on peut penser à afficher cette variable dans un label au bas de l'écran)
                        pNombreTirs += 1
                        'Nouvelle case "IN"
                        pCaseEntree = Chr(64 + i) & Chr(48 + j)
                        pcaseSortie = ""
                        pCase(i, j).Texte = "IN"
                        'Définir un sens de progression pour le tir
                        Dim orientation As String = ""  'Nord Est Sud Ouest
                        If i 0 Then orientation "E"
                        If i 7 Then orientation "O"
                        If j 0 Then orientation "S"
                        If j 7 Then orientation "N"
                        Dim pt As New Point(i, j)
                        Do
                            pt = Avancer(pt, orientation, 1)
                            If pCase(pt.X, pt.Y).ContientUneBombe = True Then
                                'Tourner de 180° (demi-tour) si le tir rencontre une bombe 
                                orientation = Tourner(orientation, 180)
                                pt = Avancer(pt, orientation, 1)
                            Else
                                'On revient à la case précédente
                                pt = Avancer(pt, orientation, -1)
                                'Tourner de 90° ou de 270° si le tir passe à proximité d'une bombe 
                                Select Case orientation
                                    Case "N"
                                        If pCase(pt.X - 1, pt.Y).ContientUneBombe = True Then
                                            orientation = Tourner(orientation, 90)
                                        ElseIf pCase(pt.X + 1, pt.Y).ContientUneBombe = True Then
                                            orientation = Tourner(orientation, 270)
                                        End If
                                    Case "E"
                                        If pCase(pt.X, pt.Y - 1).ContientUneBombe = True Then
                                            orientation = Tourner(orientation, 90)
                                        ElseIf pCase(pt.X, pt.Y + 1).ContientUneBombe = True Then
                                            orientation = Tourner(orientation, 270)
                                        End If
                                    Case "S"
                                        If pCase(pt.X + 1, pt.Y).ContientUneBombe = True Then
                                            orientation = Tourner(orientation, 90)
                                        ElseIf pCase(pt.X - 1, pt.Y).ContientUneBombe = True Then
                                            orientation = Tourner(orientation, 270)
                                        End If
                                    Case "O"
                                        If pCase(pt.X, pt.Y + 1).ContientUneBombe = True Then
                                            orientation = Tourner(orientation, 90)
                                        ElseIf pCase(pt.X, pt.Y - 1).ContientUneBombe = True Then
                                            orientation = Tourner(orientation, 270)
                                        End If
                                End Select
                                pt = Avancer(pt, orientation, 1)
                            End If
                            If pt.X 0 Or pt.Y 0 Or pt.X = 7 Or pt.Y = 7 Then
                                'Progression terminée, le tir est ressorti
                                pcaseSortie = Chr(64 + pt.X) & Chr(48 + pt.Y)
                                If pCase(pt.X, pt.Y).Texte = "" Then
                                    pCase(pt.X, pt.Y).Texte = "OUT"
                                Else
                                    pCase(pt.X, pt.Y).Texte &= vbCrLf & "OUT"
                                End If
                            End If
                        Loop Until pcaseSortie <> ""
                    ElseIf pCase(i, j).Entourage = True Then
                        'Recherche d'un bombe
                        If pCase(i, j).Texte = "" Then
                            'Incrémenter le nombre d'essais (on peut penser à afficher cette variable dans un label au bas de l'écran)
                            pNombreEssais += 1
                            'Y a-t-il une bombe à cet endroit ?
                            If pCase(i, j).ContientUneBombe = False Then
                                'Un essai pour rien
                                pCase(i, j).Texte = "."
                            Else
                                pCase(i, j).Texte = "X"
                                Beep()
                                pNombreBombesTrouvees += 1
                                If pNombreBombesTrouvees = 3 Then
                                    Me.Refresh()
                                    Dim message As String = "Vous avez gagné en utilisant " & pNombreTirs.ToString & " tir(s) et " & pNombreEssais.ToString & " essai(s)."
                                    If MessageBox.Show(message & vbCrLf & "Voulez-vous rejouer ?", "Gagné", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.Yes Then
                                        Initialiser()
                                    Else
                                        Application.Exit()
                                    End If
                                End If
                            End If
                        End If
                    End If
                    Me.Refresh()
                    Return
                End If
            Next
        Next
    End Sub

    Private Function Avancer(ByVal pt As Point, ByVal orientation As String, ByVal sens As Integer) As Point
        Select Case orientation
            Case "N" : pt.Offset(0, -sens)
            Case "E" : pt.Offset(+sens, 0)
            Case "S" : pt.Offset(0, +sens)
            Case "O" : pt.Offset(-sens, 0)
        End Select
        Return pt
    End Function

    Private Function Tourner(ByVal orientation As String, ByVal valeur As Integer) As String
        Dim pointsCardinaux As String = "NESONESO"
        Dim positionDepart As Integer = pointsCardinaux.IndexOf(orientation)
        positionDepart += valeur / 90
        Return pointsCardinaux.Substring(positionDepart, 1)
    End Function

End Class
0
lorisboogie Messages postés 9 Date d'inscription jeudi 30 septembre 2010 Statut Membre Dernière intervention 19 novembre 2010
14 oct. 2010 à 17:58
Salut mdevaux62 et CGSI3

Tout d'abord un GRAND MERCI à tout les deux avec une mention spéciale pour mdevaux62 qui nous a carrément tapé tout le code ! ;) Je ne sais que dire, sinon un Grand Merci de votre aide !!! Hier on a avancé dans notre projet mais à la fin lorsqu'on croyait avoir fini on s'est aperçu que notre raisonnement ne tenait pas debout !!! Bref un petit tour sur codes sources et que vois je ??? Un projet fini impeccable !!
Nous l'avons tester il est nickel ! Bref merci de nous avoir consacré autant de temps, ca nous a énormément aidé ! Nous allons nous inspiré de ton programme pour affinier le notre car nous souhaitons quand même rendre notre propre travail au professeur (question d'éthique ! ;) )

Bonne continuation à tous les deux et encore merci !

Loris et Monica
0
Rejoignez-nous