Démineur 5*5

Résolu
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006 - 4 juin 2006 à 15:30
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006 - 18 juin 2006 à 16:56
Bonjour à tous,

   Je suis débutant en programmation vb6. J'aimerais faire un démineur 5*5 cases, avec 5 mines au total. 
   Mon 1er pb : je ne sais pas comment choisir 5 cases aléatoirement (en utilisant randomize)sans tomber 2 fois sur la même.
J'ai testé :
Dim NombreMines As Integer, CasesMines As Integer


NombreMines = 5
CasesMines = 25


 Dim n As Integer, i As Integer, j As Integer
For n = 0 To NombreMines - 1
  Randomize
i = Int((CasesMines - n) * Rnd)
 cmdMines(CasesMines - n - 1) = cmdMines(i)
     
        cmdMines(i).Caption = " MINE "

Au final, j'aimerais avoir 5 "cmdMines(i).Caption = " MINE "" choisis au hasard.

Merci pour votre aide!


    
A voir également:

11 réponses

AnteManoclis Messages postés 154 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 6 septembre 2007
4 juin 2006 à 21:04
Salut,

Essais de le faire recommencer l'affectation de i si le test suivant est positif:

For n = 0 To NombreMines - 1
Etiquette:
  Randomize
i = Int((CasesMines - n) * Rnd)
If cmdMines(i).Caption = "MINE" Then Goto Etiquette

Tchô AnteManoclis
3
AnteManoclis Messages postés 154 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 6 septembre 2007
11 juin 2006 à 18:48
Salut, a mon avis, tu devrais essayer un truc comme ça

If cmdMines(Index).Caption = "MINE" Then
lblResultat.Visible = True
lblResultat.Caption = " Vous avez perdu "
Else
lblResultat.Caption = " Vous avez gagné "
End If
End Sub

Tchô AnteManoclis
3
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006
5 juin 2006 à 17:47
Salut,
Je vais essayer.
Merci !
0
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006
10 juin 2006 à 19:10
Salut,


   J'ai finalement réussi à initialiser mon aire de jeu - merci. Quand on clique sur une "Mine" je voudrai afficher le lbl " Vous avez perdu ". Mais, quand on clique sur n'importe quelle case, le lbl s'affiche quand même. Sinon, j'essaie de coder le décompte des mines...

J'ai essayé :
Option Explicit
Dim NombreMines As Integer, CasesMines As Integer
Dim i As Integer


Private Sub cmdMines_Click(Index As Integer)


If cmdMines(i).Caption = "MINE" Then
lblResultat.Visible = True
lblResultat.Caption = " Vous avez perdu "


End Sub


Private Sub Form_Load()
alea
End Sub

Sub alea()


Dim n As Integer


NombreMines = 5
CasesMines = 25


For n = 0 To NombreMines - 1
Etiquette:
Randomize
i = Int(25 * Rnd)
If cmdMines(i).Caption = "MINE" Then GoTo Etiquette
cmdMines(i).Caption = "MINE"
Me.Visible = True
Debug.Print i, n
Next
End Sub

Merci de votre aide.
A +
0

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

Posez votre question
AnteManoclis Messages postés 154 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 6 septembre 2007
11 juin 2006 à 12:14
Salut,

Dans ton code:
Private Sub cmdMines_Click(Index As Integer)

If cmdMines(i).Caption = "MINE" Then
lblResultat.Visible = True
lblResultat.Caption = " Vous avez perdu "

End Sub

as-tu un End If quelque part ? Je suis surpris que ça puisse marcher comme ça, mais si c'est le cas, c'est peut-être ce qu'il manque...

Tchô AnteManoclis
0
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006
11 juin 2006 à 16:19
Re - AnteManoclis!

Effecivement, il y avait un End If que j'ai maladroitement supprimé quand j'ai fait copier -coller... Pas de changement, le lbl  " Vous avez perdu " s'affiche toujours.

Option Explicit
Dim NombreMines As Integer, CasesMines As Integer
Dim i As Integer


Private Sub cmdMines_Click(Index As Integer)


If cmdMines(i).Caption = "MINE" Then
lblResultat.Visible = True
lblResultat.Caption = " Vous avez perdu "
Else
lblResultat.Caption = " Vous avez gagné "
End If
End Sub


Private Sub Form_Load()
alea
End Sub
Sub alea()


Dim n As Integer


NombreMines = 5
CasesMines = 25


For n = 0 To NombreMines - 1
Etiquette:
Randomize
i = Int(25 * Rnd)
If cmdMines(i).Caption = "MINE" Then GoTo Etiquette
cmdMines(i).Caption = "MINE"
Me.Visible = True
Debug.Print i, n
Next
End Sub

A +  !
0
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006
11 juin 2006 à 19:05
Merci AnteManoclis
Ca marche maintenant :

Private Sub cmdMines_Click(Index As Integer)


If cmdMines(Index).Caption = "MINE" Then
lblResultat.Visible = True
lblResultat.Caption = " Vous avez perdu "
Else
lblResultat.Visible = True
lblResultat.Caption = " Pas de Mine "
End If
End Sub

A +
0
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006
11 juin 2006 à 22:22
Salut !

      Pour le décompte des mines, ç'est bien plus délicat... En exécutant le code suivant, je n'arrive pas à détecter les captions "MINE" à gauche de la case "non minée" sélectionnez.
J'ai tenté : 
'déclarations
Dim Area(4, 4) As Integer
Dim X As Integer, Y As Integer
Dim C As Integer
Dim Index As Integer
............................................................................
Private Sub cmdMines_Click(Index As Integer)


If cmdMines(Index).Caption = "MINE" Then
lblResultat.Visible = True
lblResultat.Caption = " Vous avez perdu "
Else
lblResultat.Visible = True
'Il n'y a pas de mine
C = CompteMines(X, Y) 'appelle la fonction CompteMines
End If
End Sub
.............................................................................
Private Function CompteMines(X As Integer, Y As Integer) As Integer
'compte le nombre de mines à gauche
CompteMines = 0
If Mine(X - 1, Y - 1) Then
CompteMines = CompteMines + 1
'Debug.Print CompteMines
End If
If Mine(X - 1, Y) Then
CompteMines = CompteMines + 1
'Debug.Print CompteMines
End If
If Mine(X + 1, Y) Then
CompteMines = CompteMines + 1
Debug.Print CompteMines
End If
End Function
...............................................................................
Function Mine(X As Integer, Y As Integer) As Boolean
'Fonction qui indique s'il y a une mine sur la case (X,Y)


If cmdMines(Index).Caption = "MINE" Then
 Mine = True
End If


End Function
..................................................................................

Toute suggestion est bienvenue
Merci d'avance


A bientôt,
0
AnteManoclis Messages postés 154 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 6 septembre 2007
13 juin 2006 à 19:02
Salut,

Private Function CompteMines(X As Integer, Y As Integer) As Integer
'compte le nombre de mines à gauche
CompteMines = 0
If Mine(X - 1, Y - 1) Then
CompteMines = CompteMines + 1
'Debug.Print CompteMines
End If
If Mine(X - 1, Y) Then
CompteMines = CompteMines + 1
'Debug.Print CompteMines
End If
If Mine(X-
1, Y + 1 ) Then
CompteMines = CompteMines + 1
Debug.Print CompteMines
End If
End Function

Ca serait pas mieux ?

Tchô AnteManoclis
0
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006
13 juin 2006 à 20:44
Salut,

   J'ai corrigé l'erreur. Je crois avoir identifié le problème : il n'y a pas de lien entre les coordonnées (X,Y) de la fonction "Mine" et le bouton cmdMines_Click(Index As Integer) sur lequel on clique... Il faudrait réussir à faire le lien entre les deux - les variables X et Y valant 0 par défaut, dans mon code.

'déclarations
Dim Area(4, 4) As Integer
Dim X As Integer, Y As Integer
Dim C As Integer
Dim Index As Integer
.....................................................
Private Sub Form_Load()
alea


End Sub
......................................................
Private Sub cmdMines_Click(Index As Integer)


If cmdMines(Index).Caption = "MINE" Then
lblResultat.Visible = True
lblResultat.Caption = " Vous avez perdu "
Else
lblResultat.Visible = True
'Il n'y a pas de mine
C = CompteMines(X, Y) 'appelle la fonction CompteMines
End If
End Sub
.........................................................................
Sub alea()


Dim n As Integer


NombreMines = 5
CasesMines = 25


For n = 0 To NombreMines - 1
Etiquette:
Randomize
i = Int(25 * Rnd)
If cmdMines(i).Caption = "MINE" Then GoTo Etiquette
cmdMines(i).Caption = "MINE"
Me.Visible = True
Next
End Sub
.....................................................................


Private Function CompteMines(X As Integer, Y As Integer) As Integer
'compte le nombre de mines à gauche
CompteMines = 0
If Mine(X - 1, Y - 1) Then
CompteMines = CompteMines + 1
End If
If Mine(X - 1, Y) Then
CompteMines = CompteMines + 1
End If
If Mine (X - 1, Y + 1) Then
CompteMines = CompteMines + 1
Debug.Print CompteMines
End If
End Function
........................................................................
Function Mine(X As Integer, Y As Integer) As Boolean
'Fonction qui indique s'il y a une mine sur la case (X,Y)
If cmdMines(Index).Caption = "MINE" Then
 Mine = True
End If
End Function

A bientôt ,
0
cs_wilmore Messages postés 8 Date d'inscription dimanche 4 juin 2006 Statut Membre Dernière intervention 18 juin 2006
18 juin 2006 à 16:56
      Je crois que je n'ai pas été assez clair dans mon précédent post. Je voulais savoir si on peut faire un tableau de boutons de commande en les désignant chacuns par leurs coordonnées (i,j). Je ne vois que cette possibilité pour compter les mines autour.

Peut-être faut-il  procéder autrement ?

Merci d'avance pour votre aide  !
0
Rejoignez-nous