Mémoire des tentatives précédentes VBA - bataille navale

Fermé
lo - 1 mai 2022 à 11:54
 Lo - 9 mai 2022 à 22:40
Bonjour à tous !

J'essaye actuellement de coder un jeu de bataille navale sur VBA (j'apprends le code tout seul donc je suis assez mauvais).

Je demande 2 fois un nombre aléatoire entre 2 et 11 (car ma grille de jeu est entre B2 et K11) et j'aimerai que les nombres choisis reste aléatoire mais évite de reprendre des nombres déjà testés ! Par exemple: si la case E7 tombe (donc les nombres 5 et 7), j'aimerai qu'elle ne retombe pas).
J'aimerai que chaque tentative soit mise de côté pour qu'ensuite avant de lancer les nombres aléatoires, on puisse connaître les combinaisons à essayer !

Merci à vous

Ci-dessous le code:
Dim ligne As Integer, colonne As Integer
ligne = Int(10 * Rnd()) + 2
colonne = Int(10 * Rnd()) + 2
If Feuil1.Cells(ligne, colonne) = 1 Then
MsgBox ("la flotte ennemie à touché un de vos bateaux")
Feuil1.Cells(ligne, colonne).Value = 0
Feuil1.Cells(ligne, colonne).Color = 3



Configuration: Windows / Chrome 100.0.4896.127

2 réponses

via55 Messages postés 14502 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 9 décembre 2024 2 736
2 mai 2022 à 14:33
Bonjour Io

Il faut avoir une variable tableau à double entrée (ligne, colonne) , au départ toutes les 100 valeurs du tableau sont à 0
Chaque fois qu'un tirage est effectué la valeur (ligne,colonne) prend la valeur 1
Après chaque tirage si la valeur du couple tiré dans le tableau est = 1 on refait le tirage

Il faut aussi comptabiliser le nombre de tirs effectuée pour ne pas dépasser 100 auquel cas le tirage tomberait dans une boucle infinie. Pour cela il faut ,avant de pouvoir incrémenter la valeur à chaque tour, en début de module déclarer la variable nbtir comme Public pour que cette valeur soit conservée

Exemple de macro :
Dim ligne As Integer, colonne As Integer
Dim tablo(2 To 11, 2 To 11) As Integer
Public nbtir As Integer

Sub tir_ordi()
tirage:
If nbtir = 100 Then Exit Sub
ligne = Int(10 * Rnd()) + 2
colonne = Int(10 * Rnd()) + 2
If tablo(ligne, colonne) = 1 Then GoTo tirage

tablo(ligne, colonne) = 1
nbtir = nbtir + 1

If Feuil1.Cells(ligne, colonne) = 1 Then
MsgBox ("la flotte ennemie a touché un de vos bateaux")
Feuil1.Cells(ligne, colonne).Interior.Color = RGB(255, 0, 0)
Else
MsgBox ("Tir dans l'eau !")
Feuil1.Cells(ligne, colonne).Interior.Color = RGB(102, 255, 255)
End If

End Sub


Mais ce n'est que le début car je pense que tes navires doivent avoir plusieurs cases (de 1 à 4 ?) et que lorsqu'un est touché mais non coulé le tir suivant de l'ordi devra se faire dans une cellule contigüe à celle du tir précédent, donc il faudra aussi comme variables Public les coordonnées ligne et colonne du tir réussi effectué

Bon courage et bonne programmation

Cdlmnt
Via
0
Bonjour Via
Désolé pour cette réponse tardive pour utiliser un euphémisme ! Je vais essayer d'implémenter tout ça et je fermerai le salon !
Merci en tout cas car ça a l'air carré !

Cordialement
Lo
0