VB. NET TP 1 - Corrigé Objet du TP : Créer l application «Morpion ISE FSA ci-dessus : Celle-ci doit : - Demander et afficher le nom des joueurs - Permettre de les modifier - Créer la grille de jeu (9 cases) - Créer la logique du jeu(victoire/defaite/ nouvelle partie ) - Sélectionner le joueur qui débute la partie - Créer un journal de jeu - Sauvegarder ce journal dans un fichier Pour réussir, ce TP il est recommandé de suivre les différentes étapes décrites ci-après dans l ordre 1
1. Créer une application Winform avec une Form comme ci-dessous : Propriétés imposées : Texte de la fenêtre = «Morpion Ise Fsa -2011» Nom de la form = «FormJeuMorpion» 2. Ajouter un bouton «Quitter» sur la Form comme ci-dessous Propriétés imposées : Texte du bouton = «Quitter» Nom du bouton = «btnquitter» Evénement sur le clic du bouton : Fermer l application ' Code exécuté lors du clic sur le bouton Quitter -> Ferme l'application Private Sub btnquitter_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnquitter.click End 2
3. Ajouter les contrôles sur la form pour obtenir la form ci-dessous Propriétés imposées : 1. Contrôle - GroupBox Nom = «gbinformationsjoueurs» Texte = «Informations des joueurs» 2. Contrôle Label Nom = «lbllibjoueur1» Texte = «Nom du joueur n 1» 3. Contrôle Label Nom = «lbllibjoueur2» Texte = «Nom du joueur n 2» 4. Contrôle Label Nom = «lblnomjoueur1» Texte = «Nom du joueur 1 non renseigné» 5. Contrôle Label Nom = «lblnomjoueur2» Texte = «Nom du joueur 2 non renseigné» 3
6. Contrôle PictureBox Nom = «pbcouleurjoueur1» Couleur d arrière plan = Bleu 7. Contrôle PictureBox Nom = «pbcouleurjoueur2» Couleur d arrière plan = Rouge 4. Gestion des joueurs 4. a. Créer une procédure appelée«reinitialiserjoueurs()» qui : Demande au joueur 1 de saisir son nom Met à jour le texte de lblnomjoueur2 avec le texte saisi par le joueur 1 Demande au joueur 2 de saisir son nom Met à jour le texte de lblnomjoueur2 avec le texte saisi par le joueur 2 ' Procédure qui demande le noms des joueurs et qui met à jour les labels destinés à les afficher dans la form Private Sub ReInitialiserJoueurs() Dim nomjoueur1 As String = InputBox("Donnez le nom du joueur 1", "Joueur 1") lblnomjoueur1.text = nomjoueur1 2") Dim nomjoueur2 As String = InputBox("Donnez le nom du joueur 2", "Joueur LblNomJoueur2.Text = nomjoueur2 4. b Ajouter le bouton sur la form pour obtenir la form ci-dessous Propriété imposée : Nom = «btnchangementjoueur» Text =Changer les joueurs 4
Evénement sur le clic du bouton : appel à «ReInitialiserJoueurs()» ' Evenement exécuté lors du clic sur le bouton de changement de joueur Private Sub btnchangementjoueur_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnchangementjoueur.click ReInitialiserJoueurs() 5. Ajouter les contrôles sur la form pour obtenir la form ci-dessous : Propriétés imposées : 1. Contrôle - GroupBox Nom = «gbecranpartie» Texte =«Ecran de la partie» 2. Contrôles PictureBox Noms comme ci dessous : pba1 pba2 pba3 pbb1 pbb2 pbb3 pbc1 pbc2 pbc3 Couleur d arrière plan = «Blanc» 6. Ajout de la logique du jeu Etape 1 : Créer une variable appelée «NumeroJoueurCourant» destinée à contenir le numéro du joueur dont c est le tour. Public NumeroJoueurCourant As Integer = 1 'Numéro du joueur dont c'est le tour Etape 2 : Créer une procédure appelée ReinitialiserPartie() qui : - Initialise le numéro du joueur courant à 1 - Remet à blanc la couleur d arrière plan de pba1, pba2,. pbc3 à Blanc - 5
'Procedure qui reinitialise la partie modifiee pour radio button --- Etape 2 Private Sub ReinitialiserPartie() NumeroJoueurCourant = 1 pba1.backcolor = Color.White pba2.backcolor = Color.White pba3.backcolor = Color.White pbb1.backcolor = Color.White pbb2.backcolor = Color.White pbb3.backcolor = Color.White pbc1.backcolor = Color.White pbc2.backcolor = Color.White pbc3.backcolor = Color.White Etape 3 : Créer une fonction appelée CalculerNombreCaseNonJouees qui renvoie le nombre de cases qui sont encore blanches. 'Fonction qui calcule le nb de cases non jouees Private Function CalculerNombreCaseNonJouees() As Integer Dim resultat As Integer = 9 If pba1.backcolor <> Color.White Then If pba2.backcolor <> Color.White Then If pba3.backcolor <> Color.White Then If pbb1.backcolor <> Color.White Then If pbb2.backcolor <> Color.White Then If pbb3.backcolor <> Color.White Then If pbc1.backcolor <> Color.White Then If pbc2.backcolor <> Color.White Then If pbc3.backcolor <> Color.White Then CalculerNombreCaseNonJouees = resultat End Function Etape 4 : Créer une fonction qui appelée NumeroDuVainqueur() qui : o renvoie 1 si 3 cases bleues sont alignées o renvoie 2 si 3 cases rouges sont alignées o renvoie -1 sinon ' Fonction qui donne le numéro du vainqueur s'il y en a un ; renvoie -1 sinon Private Function NumeroDuVainqueur() As Integer Dim numerovainqueur As Integer = -1 'Test sur les lignes 6
If pba1.backcolor = pba2.backcolor And pba2.backcolor = pba3.backcolor Then If pba1.backcolor = Color.Blue Then numerovainqueur = 2 ElseIf pba1.backcolor = Color.Red Then numerovainqueur = 1 If pbb1.backcolor = pbb2.backcolor And pbb2.backcolor = pbb3.backcolor Then If pbb1.backcolor = Color.Blue Then numerovainqueur = 2 ElseIf pbb1.backcolor = Color.Red Then numerovainqueur = 1 If pbc1.backcolor = pbc2.backcolor And pbc2.backcolor = pbc3.backcolor Then If pbc1.backcolor = Color.Blue Then numerovainqueur = 2 ElseIf pbc1.backcolor = Color.Red Then numerovainqueur = 1 'Test sur les colonnes If pba1.backcolor = pbb1.backcolor And pbb1.backcolor = pbc1.backcolor Then If pba1.backcolor = Color.Blue Then numerovainqueur = 2 ElseIf pba1.backcolor = Color.Red Then numerovainqueur = 1 If pba2.backcolor = pbb2.backcolor And pbb2.backcolor = pbc2.backcolor Then If pbb2.backcolor = Color.Blue Then numerovainqueur = 2 ElseIf pbb2.backcolor = Color.Red Then numerovainqueur = 1 If pba3.backcolor = pbb3.backcolor And pbb3.backcolor = pbc3.backcolor Then If pba3.backcolor = Color.Blue Then numerovainqueur = 2 ElseIf pba3.backcolor = Color.Red Then numerovainqueur = 1 NumeroDuVainqueur = numerovainqueur End Function Etape 5 : Créer une procédure appelée CocherLaCaseEnfonctionDuJoueur(ByRef caseacocher As PictureBox) qui : - Teste si la case est blanche : o Si elle est blanche et que c est le joueur 1 qui joue alors la case se colore en bleu o Si elle est blanche et que c est le joueur 2 qui joue alors la case cochée se colore en rouge 7
o Sinon (case rouge ou bleu) alors on affiche dans une MsgBox un message indiquant que la case est déjà cochée. - Teste s il y a un vainqueur : o Si il y a un vainqueur et que c est le joueur 1, on affiche dans MsgBox «Félicitations au joueur 1» et on reinitialise la partie o Idem dans le cas du joueur 2 - Teste s il reste des cases non jouées. Si ca n est pas le cas, alors on affiche le message «Match nul... Nouvelle partie» et on reinitialise la partie - On modifie «NumeroJoueurCourant» pour donner celui du suivant. 'Procédure qui coche la case en fonction du joueur Private Sub CocherLaCaseEnfonctionDuJoueur(ByRef caseacocher As PictureBox) ' Colore la case si possible If caseacocher.backcolor = Color.White Then If NumeroJoueurCourant = 2 Then caseacocher.backcolor = Color.Blue Else caseacocher.backcolor = Color.Red Else MsgBox("Cette case a déjà été sélectionnée... Veuillez en sélectionner une autre", MsgBoxStyle.Exclamation) ' Y a t'il un vainqueur If NumeroDuVainqueur() = 1 Then listboxjournal.items.add("joueur 1 gagne " & DateTime.Now) MsgBox("Félicitations au joueur n 1") ReinitialiserPartie() ElseIf NumeroDuVainqueur() = 2 Then MsgBox("Félicitations au joueur n 2") listboxjournal.items.add("joueur 2 gagne " & DateTime.Now) ReinitialiserPartie() ' Est-ce fini? If CalculerNombreCaseNonJouees() = 0 Then MsgBox("Match nul... Nouvelle partie") listboxjournal.items.add("nul " & DateTime.Now) ReinitialiserPartie() ' Faire passer le tour au joueur suivant If NumeroJoueurCourant = 1 Then NumeroJoueurCourant = 2 Else NumeroJoueurCourant = 1 Etape 6 : appeler la procédure CocherLaCaseEnfonctionDuJoueur pour chaque clic sur une des 9 cases. 8
' Action sur le clic de la picturebox pba1 => Appel de la procedure de coche de cases avec la case en paramètre Private Sub pba1_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pba1.click CocherLaCaseEnfonctionDuJoueur(pbA1) ' Action sur le clic de la picturebox pba2 => Appel de la procedure de coche de cases avec la case en paramètre Private Sub pba2_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pba2.click CocherLaCaseEnfonctionDuJoueur(pbA2) ' Action sur le clic de la picturebox pba3 => Appel de la procedure de coche de cases avec la case en paramètre Private Sub pba3_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pba3.click CocherLaCaseEnfonctionDuJoueur(pbA3) Private Sub pbb1_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pbb1.click CocherLaCaseEnfonctionDuJoueur(pbB1) Private Sub pbb2_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pbb2.click CocherLaCaseEnfonctionDuJoueur(pbB2) Private Sub pbb3_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pbb3.click CocherLaCaseEnfonctionDuJoueur(pbB3) Private Sub pbc1_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pbc1.click CocherLaCaseEnfonctionDuJoueur(pbC1) Private Sub pbc2_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pbc2.click CocherLaCaseEnfonctionDuJoueur(pbC2) Private Sub pbc3_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles pbc3.click CocherLaCaseEnfonctionDuJoueur(pbC3) 6. Demander le nom des joueurs au chargement de la form au démarrage de l application Private Sub FormJeuMorpion_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ReInitialiserJoueurs() 9
7. Ajouter 2 radio buttons pour indiquer quel joueur débute la partie suivante en modifiant reinitialiserpartie() 'Procedure qui reinitialise la partie modifiee pour radio button --- Etape 2 Private Sub ReinitialiserPartie() NumeroJoueurCourant = 1 If rbcommencej2.checked Then NumeroJoueurCourant = 2 Else NumeroJoueurCourant = 1 pba1.backcolor = Color.White pba2.backcolor = Color.White pba3.backcolor = Color.White pbb1.backcolor = Color.White pbb2.backcolor = Color.White pbb3.backcolor = Color.White pbc1.backcolor = Color.White pbc2.backcolor = Color.White pbc3.backcolor = Color.White 8. Ajouter une liste box gardant le journal des parties et permettant de le sauvegarder dans un fichier (c:/test.txt). Etape 1 : Ajout du composant Etape 2 : Création d une procédure de sauvegarde dans un fichier Private Sub EcritureLigneDansFichier(ByVal fichier As String, ByVal textaecrire As String) Try 'Instanciation du StreamWriter avec passage du nom du fichier Dim monstreamwriter As System.IO.StreamWriter = New System.IO.StreamWriter(fichier, True) 10
'Ecriture du texte dans votre fichier monstreamwriter.writeline(textaecrire) 'Fermeture du StreamWriter (Trés important) monstreamwriter.close() Catch ex As Exception MsgBox("Erreur Ecriture Fichier!", MsgBoxStyle.Exclamation, "Impossible d'écrire la chaine " & textaecrire & " dans le fichier " & fichier & "pour la raison " & ex.message) End Try Etape 3 : Créer un bouton de sauvegarde avec un évènement associé qui appelle la procédure de sauvegarde Private Sub btnsauvegarderjournal_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnsauvegarderjournal.click Dim nomfichier As String = "C:/test.txt" EcritureLigneDansFichier(nomFichier, "Sauvegarde du " & DateTime.Now) For Each item In listboxjournal.items EcritureLigneDansFichier(nomFichier, item) Next 11
9. Ajouter les contrôles permettant de saisir le fichier de sauvegarde en l initialisant à «C:/test» et modifier le code pour obtenir le rendu suivant Etape 1 : Créer les 3 contrôles Etape 2 : Si la case est cochée la zone de saisie est active sinon elle est inactive Etape 3 : Modifier la procédure de sauvegarde créée précédemment afin d utiliser le nom de fichier personnalisé si la case est cochée, le nom par défaut sinon. 'Action sur le clic du bouton de sauvegarde => on appelle la procedure de sauvegarde dans un fichier avec en parametre la chaine qu'on souhaite sauvegarder Private Sub btnsauvegarderjournal_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnsauvegarderjournal.click Dim nomfichier As String = "C:/test.txt" If checkboxfichierpersonnalise.checked Then nomfichier = txtboxnomfichierspecifie.text EcritureLigneDansFichier(nomFichier, "Sauvegarde du " & DateTime.Now) For Each item In listboxjournal.items EcritureLigneDansFichier(nomFichier, item) Next 12
10. Amélioration du programme (image, ajout des diagonales dans l algo ) 13