Bouton "réinitialiser" sur un jeu

34blue-snake-game.zip (359.75 Ko)

Bonjour à tous,

Pour un projet scolaire, j'ai du réaliser un jeu sur VBA Excel, le jeu du serpent. Mais après avoir terminé, je n'arrive pas faire fonctionner le bouton "réinitialiser" pour pour pouvoir recommencer le jeu à 0. Pourtant j'ai affecté une macro à une forme avec le code [plateau].ClearContents comme on avait vu en cours. Mais ça ne marche pas....Quelqu'un aurait une idée s'il vous plait..?

Merci beaucoup d'avance

Bonjour,

ClearContents sert juste à supprimer le contenu de la cellule, pas le format, donc la couleur bleu restera.

Pour réinitialiser la position du serpent en W11 par exemple, voici comment procéder:

Sub effacer()
For a = 3 To 20
     For b = 3 To 49
         If Cells(a, b).Interior.ColorIndex = 8 Then
            Cells(a, b) = ""
            Cells(a, b).Interior.ColorIndex = 2
         End If
     Next b
Next a

Range("W11") = "P"
Range("W11").Interior.ColorIndex = 8
Range("T30") = 0
End Sub

Je parcours toute la grille, et pour chaque case avec un fond bleu: je supprime le contenu et réinitialise la couleur de fond à blanc.

Rebonsoir,

Alors tout d'abord milles merci, ça me sauve vraiment :)

J'ai une dernière question et je ne vous embête plus, mais je ne sais pas pourquoi 2 choses bug sur mon projet:

- La génération de pièces, normalement est censé être automatique en même temps que je joue mais la ça ne marche plus je ne sais pas pourquoi. Ça marchait très bien la première fois que je l'ai fait.

- Le msgbox que j'ai mis pour dire que le jeu est perdu, lorsque le serpent se prend la queue ne marche pas non plus je ne sais pas pourquoi...

En tout cas, encore merci pour votre aide et votre temps et je vous souhaite une très bonne journée/soirée.

Bonjour,

De ce que je vois...

Pour le fait de perdre, à mon avis le souci vient de la condition:

If Cells(V + 1, H).Interior.ColorIndex = 4 Then

Ici on teste si le ColorIndex est 4, mais à aucun moment je ne vois une cellule prendre cette couleur, il n'y a aucune case en verte dans le jeu, je pense qu'il faut mettre 8 et non 4.

Pour la génération de pièces, le souci vient d'ici:

If p > 60 Then

p est toujours vide, à aucun moment du code je ne vois cette valeur être modifiée ou initialisée, je pense que c'est censé être le nombre de pièces.

Il y a un z généré dans le code mais je ne vois pas à quoi il sert non plus. Peut-être que c'est censé être le p?

Je vois aussi dans le code que si par malheur la pièce est générée sur une case type "mur", elle n'est pas générée et on passe à la suite, comme le serpent bouge beaucoup j'imagine que ce n'est pas hyper problématique mais je pense que ça peut le devenir plus loin dans la partie quand les cases éligibles à l'apparition d'une pièce se font rares.

J'ai aussi la ligne qui s'étire à l'infini de mon côté.

Aussi je vois que pas mal de code a été dupliqué, je pense qu'il est possible de faire plus compact.

Rebonjour,

Effectivement je me suis emmêlée les pinceaux car je comptais faire un serpent vert de base et j'ai oublié d'update les codes couleurs. Pour la genération de pièces également puisque j'ai confondu les lettres z et p.

Je vous remercie beaucoup pour votre aide qui m'a permis de finir mon projet à temps!

Passez une très belle journée!

Rebonjour,

Content d'avoir pu aider.

Petit conseil pour éviter que ce genre de soucis ne se reproduisent, on peut déclarer couleurSerpent, couleurPiece, couleurMur et faire appel à ces variables dans le code, on aurait plus qu'à modifier leur déclaration si par exemple on veut de nouveau un serpent vert.

Bonne journée également!

Bonjour Ausecour,

je reviens vers vous pour déjà vous remercier de m'avoir aidé à terminé ce projet, j'ai présenté le jeu à mon professeur et il souhaiterais que le jeu soit plus complet en ajoutant:

- Mettre un emoji à la place de la tête du serpent, pour l'instant la tête de mon serpent se distingue par un "P" mais je ne vois pas comment remplacer le p par l''emoji dans le code

- Un système de classement pour montrer les 3 meilleures score

- Faire disparaitre certaines pièces après 20 pas du serpent

Pour ces deux la, j'ai déjà essayé quelques manipulations mais rien ne marche donc j'ai abandonné, saurais tu comment procéder?

Je te souhaite une très bonne journée si vous voyez ce message!

15blue-snake-game.zip (361.87 Ko)

Bonjour,

Pour mettre un emoji à la place du serpent on peut utiliser des polices telles que Wingdings qui permet d'avoir un personnage qui sourit avec la lettre "J", ça veut dire qu'il faut gérer le fait de réinitialiser la police d'écriture pour les cases où le serpent est passé.

image

Le classement ça ne devrait pas être trop compliqué, il faut garder le score quelque part avec le nom du joueur et comparer le score qui a été fait avec les autres, s'il est au moins supérieur au troisième score alors il faut demander le nom du joueur et le placer à la bonne position.


Faire disparaître les pièces c'est faisable si on utilise la même logique que celle pour la queue du serpent, quand on ajoute une pièce on met 20 dans la valeur de la cellule, et à chaque déplacement on diminue cette valeur de 1 jusqu'à atteindre 0, moment où la pièce disparait.


Est-ce qu'il a regardé le code? ça m'étonne qu'il n'ait pas eu d'améliorations à demander dessus...

Je pense qu'il serait intéressant d'éclater le code en petites procédures qui peuvent être appelées, le mouvement du serpent exécute le même code pour tous les mouvements, c'est juste la direction dans laquelle bouge le serpent qui change, donc le décalage de ligne et de colonne:

image image

Ça rendrait selon moi le code plus simple à lire et plus simple à maintenir.

On pourrait avoir une procédure qui ressemblerait à:

Sub bouger(lig as Integer, col as Integer)
' le code
End Sub

Rebonjour,

j'ai enfin pu me libérer de mes autres examens et je vais pouvoir consacrer 2j pour boucler le projet. je vais essayer de faire étape par étape mais pour la tête en emoji, comment on peut faire un sorte de réinitialiser la police d'écriture pour les cases ou le serpent est passé?

Je suis désolé si mes questions paraissent idiotes mais je suis vraiment débutante, il faut savoir que le début du projet je l'ai fait en classe à l'aide du prof mais là ce n'est que moi et j'avoue que je rame...

Bonjour,

Pas de soucis,

Réinitialiser la police revient à remettre celle par défaut, ce doit être le Calibri pour votre classeur.

J'ai regardé le code que me générait l'enregistreur de macro pour changer la police, j'ai enlevé ce qui ne servait à rien (définition de la couleur, taille etc...) pour ne garder que le changement de police:

Sub changePolice()
Range("A1").Font.Name = "Wingdings"
Range("A1").Font.Name = "Calibri"
End Sub

Il faut en fait changer le nom de la police, on peut mettre Wingdings pour l'emoji, Calibri pour la police par défaut.

Encore une fois on peut les enregistrer dans des variables pour les appeler, ça rendra le code plus lisible:

Sub changePolice()
Dim policeEmoji As String, policeDefaut As String

policeEmoji = "Wingdings"
policeDefaut = "Calibri"

Range("A1").Font.Name = policeEmoji
Range("A1").Font.Name = policeDefaut
End Sub

On voit ainsi clairement quand est-ce que l'on met l'emoji et quand est-ce qu'on réinitialise la police.

Ensuite il est question de trouver la case vers laquelle était la tête et ça on l'a déjà dans le code, puisqu'on va inscrire une valeur dedans pour générer la queue.

Je n'y arrive pas, est ce que vous voyez ou je me suis trompé?

11blue-snake-game.zip (364.46 Ko)

Bonjour,

Je ne vois pas d'endroit où vous avez essayé de changer la police, je pense que vous vous êtes trompée sur ça.

Je me suis permis de modifier le code pour aller à gauche avec ce que je pense être adapté:

Sub gauche()
Dim a, b, V, H, z As Long
Dim bleu As Integer, vert As Integer, jaune As Integer, rouge As Integer, blanc As Integer, noir As Integer
Dim policeEmoji As String, policeDefaut As String

'couleurs
noir = 1
blanc = 2
bleu = 8
rouge = 3
jaune = 6

'polices
policeEmoji = "Wingdings"
policeDefaut = "Calibri"

'recherche de la tête
For a = 3 To 20
    For b = 3 To 49
        If Cells(a, b) = "J" Then
            V = a
            H = b
        End If
    Next b
Next a

'le personnage contre le mur rouge
'donc : la cellule a gauche du serpent est rouge

If Cells(V, H - 1).Interior.ColorIndex = rouge Then
    Exit Sub
End If

'si le personnage se mord la queue
'donc la cellule est bleue
If Cells(V, H - 1).Interior.ColorIndex = bleu Then
    MsgBox ("PERDU ! Retente ta chance une prochaine fois !")
End If

'le personnage se deplace sur le chemin blanc
'donc : la cellule a gauche du serpent est blanche

If Cells(V, H - 1).Interior.ColorIndex = blanc Then

    'le personnage n'a pas encore mange de pieces

    If Cells(30, 20) = 0 Then
        Cells(V, H - 1).Interior.ColorIndex = bleu
        Cells(V, H - 1) = "J"
        Cells(V, H - 1).Font.Name = policeEmoji
        Cells(V, H - 1).Font.ColorIndex = noir
        Cells(V, H).Interior.ColorIndex = blanc
        Cells(V, H).ClearContents
        Cells(V, H).Font.Name = policeDefaut
    End If

    'le personnage a mange des pieces

    If Cells(30, 20) > 0 Then

        'la tete du personnage se deplace vers la gauche

        Cells(V, H - 1).Interior.ColorIndex = bleu
        Cells(V, H - 1) = "J"
        Cells(V, H - 1).Font.Name = policeEmoji
        Cells(V, H - 1).Font.ColorIndex = noir

        'on soustrait a tous les chiffres 1
           'si on obtient 0 : on supprime

        For a = 3 To 20
            For b = 3 To 49
                If Cells(a, b) <> "J" And Cells(a, b) <> "" Then
                    Cells(a, b) = Cells(a, b) - 1
                    If Cells(a, b) = 0 Then
                        Cells(a, b).Interior.ColorIndex = blanc
                        Cells(a, b).ClearContents
                    End If
                End If
            Next b
        Next a

        'l'ancienne tete prend la valeur du score
        Cells(V, H) = Cells(30, 20)
        Cells(V, H).Font.Name = policeDefaut
    End If
End If
'Fin le personnage se place sur le chemin blanc

'si la cellule est jaune , donc le personnage mange une piece
If Cells(V, H - 1).Interior.ColorIndex = jaune Then
    Cells(V, H - 1).Interior.ColorIndex = bleu
    Cells(V, H - 1) = "J"
    Cells(V, H - 1).Font.Name = policeEmoji
    Cells(V, H - 1).Font.ColorIndex = noir
    Cells(30, 20) = Cells(30, 20) + 1
    Cells(V, H) = Cells(30, 20)
    Cells(V, H).Font.Name = policeDefaut
End If

'pieces
a = Int(Rnd * 20) + 1
b = Int(Rnd * 49) + 1
z = Int(Rnd * 99) + 1

If z > 60 Then
    If Cells(a, b).Interior.ColorIndex = blanc Then
        Cells(a, b).Interior.ColorIndex = jaune
    End If
End If
End Sub

J'ai déclaré les valeurs d'index pour les couleurs utilisées, ainsi dans le code on voit tout de suite si on teste que ce soit rouge, jaune, blanc etc.

J'ai déclaré les noms des polices utilisées, une police pour les emojis (Wingdings), une police par défaut (Calibri).

J'ai mis des indentations là où c'était nécéssaire, entrée de condition If, boucle For Next.

Pour changer la police j'ai utilisé

Cells(V, H - 1).Font.Name = policeEmoji

et pour réinitialiser la police:

Cells(V, H).Font.Name = policeDefaut

J'ai aussi changé cette ligne:

If Cells(a, b) <> "J" And Cells(a, b) <> "" Then

Puisqu'on utilise "J" à présent.

Mais aussi:

Cells(V, H) = Cells(30, 20)

Car ça pointait vers la mauvaise cellule pour inscrire le nombre de pièces.

J'ai aussi rajouté

Cells(V, H).Font.Name = policeDefaut

Dans le cas où il a déjà mangé une pièce et quand il mange une pièce.

Je n'ai pas apporté d'autres changements mais j'espère que vous serez en mesure de comprendre ceux là et de les adapter aux autres procédures de déplacement, je recommande à nouveau de faire une seule procédure pour tous les mouvements et je peux proposer un code si besoin.

Super merci ça facilite complètement la mise en page! donc en gros dans le classeur je le met en mode défaut calibri, je change la tete en J puis le changement de l'emoji en wingdings se fait dans le code? Je n'ai pas a changer la font en wingdings sur le classeur excel, ca se fait par le biais du classeur, c'est ca?

J'ai remplacer les codes par ce que vous m'avez proposer mais il y a un bogue à un moment

19blue-snake-game.zip (353.07 Ko)

Oui le classeur en défaut calibri, le texte J, et le reste se gère dans le code.

Il y a un bug à un moment? où ça?

Aussi que pensez-vous de ma proposition d'obtenir un code beaucoup plus court? (ça rendra aussi le débogage et les améliorations plus simples)

Rebonsoir,

J'ai deja remplacé par votre code plus court! Cette ligne là ca me dit quil ya un bug: "If Cells(V - 1, H).Interior.ColorIndex = rouge Then"

Je ne sais pas si vous voyez sur le doc excel, en faite je ne comprend pas parfois l'emoji s'affiche et parfois non, peut etre que ca vient du bug du code justement

Bonjour,

Désolé je n'étais pas clair sur "code plus court", peut-être que ceci vous parlera plus:

25blue-snake-game.zip (335.38 Ko)

L'idée ici c'est que j'ai pris le code que j'ai fait pour le déplacement à gauche, et je l'ai modifié pour qu'il marche pour chaque déplacement, j'ai changé V et H par lig et col car ça me parle plus: ligne et colonne.

C'est une procédure à laquelle on peut donner le déplacement qu'on souhaite effectuer sur la ligne et sur la colonne, imaginons que l'on veuille aller à gauche, on va se déplacer de 0 ligne, et on va reculer d'une colonne, donc -1. on fait ça pour tous les mouvements, et on peut ainsi avoir la même procédure pour tous les déplacements, la seule chose qui change c'est l'endroit où la tête va finir.

J'en ai aussi profité pour revoir la logique du code et l'ordre dans lequel les choses s'exécutent.

On a la partie initialisation des variables avec le texte pour la tête du serpent, les couleurs, les polices.

On a ensuite la recherche de la tête dans la plage de cellules "grilleJeu", au lieu de faire une boucle sur toutes les cellules j'utilise Range().Find qui permet de trouver une valeur dans une plage de cellules, ça renvoie une cellule d'où on peut prendre le numéro de ligne et de colonne.

Ensuite on teste la position de la tête pour savoir où elle arrive, 4 possibilités:

  • rouge: un mur, on sort de la procédure
  • bleu: la queue du serpent, déclenche la défaite
  • jaune: une pièce, augmente le nombre de pièces collectées
  • blanc: une case vide, on ne fait rien donc je ne l'ai même pas mis dans les tests

Ici j'ai réduit ces tests et ce qu'ils font à leur plus simple expression, ils n'ont pas à gérer le déplacement de la tête, le compte à rebours de la queue ou autre, ça c'est la suite du code qui s'en occupe.

On enregistre ensuite deux cellules importantes dans des variables objets (qui servent par exemple ici à stocker des cellules):

  • la tête du serpent
  • l'ancienne tête du serpent

Ces deux cellules sont utilisées par la suite, je pourrai directement les appeler à partir des noms de variable plutôt que d'avoir à nouveau à leur dire "c'est la cellule à la ligne 25, colonne 10".

Ensuite on déplace la tête en lui appliquant sa mise en forme et son texte.

On vérifie ensuite si le serpent a déjà mangé une pièce ou non:

  • non: on réinitialise juste la mise en forme de l'ancienne cellule qui contient sa tête, donc on utilise la variable enregistrée avant
  • oui: on fait le compte à rebours pour les queues, ici j'ai fait une boucle un peu spéciale qui n'est pas comme For i = 1 to 10 ... Next i, une boucle For Each qui permet de parcourir un ensemble d'objets, ici des cellules qui sont dans une plage. Pour chaque cellule de "grilleJeu" je vais vérifier que ce n'est pas la tête et que la cellule n'est pas vide, puis on décrémente de 1, si on obtient 0, on vide la cellule de son contenu et on la remet en blanc. Puis l'ancienne tête prend le nombre de pièces. A noter que pour le nombre de pièce j'ai nommé la cellule afin de pouvoir l'appeler plus facilement dans le code.

Enfin, quoi qu'il arrive, on réinitialise la police de l'ancienne tête car le serpent s'est déplacé.

Pour finir, on tente de générer une pièce.


On peut avoir l'impression que j'ai énormément changé le code, mais en réalité j'ai principalement bougé les lignes de code pour faire un nouvel ordre:

  • chercher la position de l'ancienne tête
  • tester la position de la nouvelle tête
  • déplacement de la tête
  • gestion de la queue et de l'ancienne tête
  • génération de pièce

Cet ordre est pour moi plus logique que l'ancien, qui pouvait poser des problèmes.

Pour le reste c'est plus l'intégration de variables pour rendre le code plus lisible, changer le type de boucle, retirer les lignes qui n'ont rien à faire à certains endroits en se demandant la fonction de chaque morceau de code et en leur en attribuant des rôles comme montré dans la liste plus haut.

Et bien entendu, créer une procédure qui peut faire les 4 déplacements.

Les déplacements ont été remplacé par ces petits bouts de code:

Sub gauche()
deplacer 0, -1
End Sub

Sub droite()
deplacer 0, 1
End Sub

Sub bas()
deplacer 1, 0
End Sub

Sub haut()
deplacer -1, 0
End Sub

On donne juste à la procédure modifiée les déplacements à effectuer sur la ligne et la colonne, et elle gère le reste, plutôt pratique non?

Je n'étais pas sûr de proposer cette idée car c'est quand même beaucoup de concepts à apprendre d'un coup, mais je pense que ça rend le code beaucoup plus lisible, compréhensible, simple à modifier et débuguer, déjà parce qu'on a plus qu'une procédure au lieu de 4 à modifier et checker à chaque fois.

Je vous laisse tenter de comprendre ce que j'ai fais, et si vous avez des questions vous pouvez bien entendu en poser, bonne lecture!

Rebonjour,

Je viens de tout lire et effectivement je n'aurais jamais réussi à comprendre toute seule
vos explications sont super claires et ça m'aide vraiment pour la suite! C'est vrai que mon code initial était très brouillon, j'étais plus concentrée sur le fait de faire mon code sans bug et que le jeu marche que d'avoir quelque chose de claire.

Merci beaucoup de votre aide AuSecour

Bonjour,

C'est normal on commence tous par ça

Maintenant je suis capable de structurer du code comme ça et d'avoir de bons réflexes, mais mieux vaut ne pas regarder ce que je faisais quand j'ai débuté sur VBA

Pour la suite je vous encourage à tenter de bien structurer les choses:

  • se demander à quelle étape du code on intègre l'ajout
  • quel est le rôle de l'ajout
  • comment va fonctionner l'ajout
  • enfin tenter de voir comment traduire ça en lignes de code

J'espère que vous avez toujours le temps pour la suite de ce que vous voulez faire, si vous avez des questions vous pouvez toujours repasser par ici

Oui, c'est vrai c'est comme tout! Plus on s'entraine, plus vite on atteindra un bon niveau

De plus, je suis en L3 et j'ai vu que dans le programme du master que je souhaite faire l'année prochaine, il y aura une matière VBA, donc je ferais mieux de m'entrainer cette été

En tout cas, ça fait plaisir de voir que vous êtes passionné et que vous prenez plaisir a aidez les gens mème si vous ne gagnez rien en retour. Merci pour votre temps

Les merci ça fait toujours plaisir, il y a des sujets où on s'investit parfois moins parce qu'on sent que la personne en face ne s'intéresse pas beaucoup, mais il y a des sujets comme ça qui donnent envie de pousser les choses

Si vous voulez vous mettre au VBA, le site propose un cours VBA qui est bien: https://www.excel-pratique.com/fr/vba

Il traite de pas mal de points importants de la programmation mais je n'ai pas en mémoire de guide pour comment construire son code.

Je dirais que ce qui permet de faire un bon code c'est de faire simple, éviter les procédures trop longues et plutôt multiplier les procédures simples si possible, et éviter d'avoir des doublons dans le code

Si vous continuez à faire du VBA on se recroisera peut-être sur d'autres sujets, ou alors vous aurez l'occasion de croiser d'autres membre comme JFL par exemple

Rechercher des sujets similaires à "bouton reinitialiser jeu"