Synthèse : Puissance 4 (en VBA) Corrigé

Documents pareils
Algorithmique et programmation : les bases (VBA) Corrigé

Application 1- VBA : Test de comportements d'investissements

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Corrigé des TD 1 à 5

TD3: tableaux avancées, première classe et chaînes

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Organigramme / Algorigramme Dossier élève 1 SI

Examen Médian - 1 heure 30

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet


Recherche dans un tableau

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours Informatique Master STEP

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Introduction à MATLAB R

Programmation Visual Basic. Visite guidée d'un programme Visual Basic 6.0

FORMATION au VBA Pour EXCEL. Version 2007 & +

Chapitre 2 Devine mon nombre!

Consigne : je remplis le tableau en tenant compte des informations de la ligne supérieure et de la colonne de gauche (droite pour les gauchers)

Exercices de dénombrement

Algorithmique et Programmation, IMA

Résolution de systèmes linéaires par des méthodes directes

III- Raisonnement par récurrence

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Utilitaires méconnus de StrataFrame

Génie Logiciel avec Ada. 4 février 2013

Programmer en JAVA. par Tama

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Visual Basic for Applications

Cours d algorithmique pour la classe de 2nde

Module 16 : Les fonctions de recherche et de référence

Simulation de variables aléatoires

Utilisation d objets : String et ArrayList

Programmation C++ (débutant)/instructions for, while et do...while

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

1 Recherche en table par balayage

Plus petit, plus grand, ranger et comparer

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Plan du cours Cours théoriques. 29 septembre 2014

Représentation d un entier en base b

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Cours de Systèmes d Exploitation

Convers3 Documentation version Par Eric DAVID : vtopo@free.fr

1. Structure d'un programme FORTRAN 95

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Salle de technologie

Création du projet : 1 sur 13

Formation VBA 3 Interagir

Gestion mémoire et Représentation intermédiaire

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Paginer les données côté serveur, mettre en cache côté client

Algorithmique & programmation

LES TYPES DE DONNÉES DU LANGAGE PASCAL

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Arbres binaires de recherche

Architecture des Systèmes d Information Architecture des Systèmes d Information

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

STAGE IREM 0- Premiers pas en Python

Débuter avec Excel. Excel

TRIGONOMETRIE Algorithme : mesure principale

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

.NET - Classe de Log

RACCOURCIS CLAVIERS. DEFINITION : Une «combinaison de touches» est un appui simultané sur plusieurs touches.

Solutions du chapitre 4

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

NOEUD HERRINGBONE-PINEAPPLE STANDARD TYPE and PASS

Championnat de France de Grilles Logiques Finale 7 juin Livret d'instructions

Rapport de Mini-Projet en ArcGIS Engine

Jeux mathématiques en maternelle. Activités clés. Jeu des maisons et des jardins (Yvette Denny PEMF)

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Manuel de formation Spaceman 1 ère journée

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

ACTIVITÉ DE PROGRAMMATION

Fonctions de plusieurs variables

Baccalauréat L spécialité, Métropole et Réunion, 19 juin 2009 Corrigé.

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

POKER ET PROBABILITÉ

Créer votre propre modèle

Notice d utilisation

Initiation à LabView : Les exemples d applications :

Premiers Pas en Programmation Objet : les Classes et les Objets

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

Table des matières A. Introduction... 4 B. Principes généraux... 5 C. Exemple de formule (à réaliser) :... 7 D. Exercice pour réaliser une facture

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Enseignement secondaire technique

A.-M. Cubat PMB - Import de lecteurs - Généralités Page 1 Source :

Propagation sur réseau statique et dynamique

Exe Livret Animateur_Exe Livret Animateur 01/02/11 11:10 Page1

COURS BARDON - EXCEL 2010

Algorithmes récursifs

TP : Gestion d une image au format PGM

Applications des mathématiques pdf. Introduction à la Programmation en Visual Basic 6

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Transcription:

PAD INPT ALGORITHMIQUE ET PROGRAMMATION 1 Exercices corrigés en VBA, Semaine 4 avril mai 2013 Corrigé 1 puissance4 Le jeu «Puissance 4» est proposé par MB Jeux. Sur la boîte, on peut lire les indications suivantes. Puissance 4 est un jeu de stratégie verticale passionnant et plein d astuce. C est un jeu facile à apprendre et amusant à jouer. Ses règles sont simples. Chaque joueur essaie de faire une rangée de quatre pions dans le cadre horizontalement, verticalement ou diagonalement tout en essayant d empêcher son adversaire de faire de même. Croyez-moi ce n est pas aussi facile que cela en a l air! La position verticale du jeu demande au joueur beaucoup de concentration et de réflexion. Montage : 1. Suivez les instructions illustrées pour l assemblage des parties en plastiques (non reproduites ici). 2. Placez le jeu entre les joueurs. 3. Chaque joueur choisit une couleur de pions. But du jeu : Être le premier joueur à placer quatre de ses pions sur une ligne horizontale, verticale ou diagonale continue. Règles du jeu : 1. Choisissez le premier joueur. Le joueur qui commence la première partie sera le deuxième joueur au cours de la deuxième partie. 2. À tour de rôle, chaque joueur fait tomber un de ses pions dans une des fentes au sommet de la grille. 3. Le jeu continue jusqu à ce qu un des joueurs ait un alignement continue de quatre pions de sa couleur. L alignement peut être vertical, horizontal ou en diagonale. 4. Pour vider la grille, poussez la barre de retenue qui se trouve au vase de celle-ci et les pions tomberont. Vous pouvez maintenant commencer la partie suivante. Exercices corrigés en VBA, Semaine 4 c INPT PAD 1/11

Conseil : Lire attentivement les questions suivantes et ébaucher une solution au brouillon avant de commencer la rédaction. Exercice 1 : Préparation du jeu Le jeu «puissance 4» se joue sur une grille verticale de six lignes et sept colonnes avec 21 pions rouges et 21 pions jaunes. Pour faciliter les calculs ultérieurs, nous allons ajouter une bordure à cette grille. Ses dimensions sont donc de huit lignes et neuf colonnes. Bien entendu, ces cases supplémentaires ne peuvent pas contenir de pions (qu ils soient jaunes ou rouges). Elles sont donc toujours vides. Définir les types nécessaires pour représenter la grille de jeu. 1 Const TITRE = "PUISSANCE 4" 2 Const NB_LIGNES As Integer = 6 nb de lignes de l aire de jeu 3 Const NB_COLONNES As Integer = 7 nb de colonnes de l aire de jeu 4 Const NB_ALIGNES_GAGNANT As Integer = 4 nb de pions alignés pour gagner 5 Const NB_JOUEURS As Integer = 2 Nombre de joueurs dans une partie 6 7 Définir le type pour une case de la grille 8 Const VIDE = 0, ROUGE = 1, JAUNE = 2 9 10 Définition d un joueur 11 Type typ_joueur 12 couleur As Integer En fait, soit ROUGE, soit JAUNE 13 nom As String Le nom du joueur 14 ordinateur As Boolean Est-ce l ordinateur? 15 nb_victoires As Integer Nombre de victoires 16 End Type 17 18 Définition des composants du jeu 19 20 Type typ_jeu grille(0 To NB_LIGNES + 1, 0 To NB_COLONNES + 1) As Integer 21 la grille de jeu avec une bordure supplémentaire 22 joueurs(1 To NB_JOUEURS) As typ_joueur les 2 joueurs 23 End Type Le jeu est représenté sous forme d un enregistrement typ_jeu contenant la grille de jeu (champ grille de type tableau bidimensionnel d entiers) et les 2 joueurs (champ joueurs de type tableau monodimensionnel d éléments de type typ_joueur). Exercice 2 : Vider la grille Pour commencer chaque partie, il faut commencer par vider la grille des jetons qu elle contient. Écrire un sous-programme qui réalise cette opération. Solution : Ce sous-programme a un seul paramètre, la grille, en out. Il s agit donc d une initialisation. Nous en faisons donc une procédure. 1 Procédure vider(grille: out Grille) Est 2 -- vider la grille. Ce sous-programme consiste à mettre toutes les cases de la grille à VIDE, y compris les cases de la bordure. On le fait donc naturellement avec deux boucles imbriquées, l une qui balaie les lignes, l autre les colonnes. Exercices corrigés en VBA, Semaine 4 c INPT PAD 2/11

1 Sub vider_grille(grille() As Integer) 2 ROLE : vide la grille du jeu. Ceci correspond à actionner la barre 3 situee sous la grille du jeu réel. 4 SORTIE Jeu 5 Dim i As Integer, j As Integer 6 7 For i = 0 To NB_LIGNES + 1 For j = 0 To NB_COLONNES + 1 8 grille(i, j) = VIDE 9 Next j 10 Next i 11 End Sub Exercice 3 : Afficher la grille Écrire un sous-programme qui affiche le contenu de la grille. Par convention, les jetons de couleur rouge seront représentés par un astérisque (*) et les jetons jaunes par la lettre o minuscule. Pour faciliter, la localisation d une case de la grille, les numéros de lignes et de colonnes seront affichés comme sur la figure 1. 1 2 3 4 5 6 7 6 * 6 5 o 5 4 o o * 4 3 * o o o 3 2 * o * o * 2 1 * o * * o o * 1 1 2 3 4 5 6 7 FIGURE 1 Affichage de la grille Afin de pouvoir effectuer un affichage séquentiel de chaque pion d une même ligne sans passer à la ligne (ce que fait implicitement la procédure Afficher), on pourra utiliser les 2 procédures suivantes (mises à disposition) : 1 Procédure AfficherCellule(Info : in ToutType) Est 2 -- afficher une information unique de tout type dans la cellule 3 -- courante et positionne la cellule courante sur la colonne 4 -- suivante sans passer à la ligne 5 6 Procédure AllerALaLigne Est 7 -- Positionner la cellule active sur la 1ère colonne de la 8 -- ligne suivante On pourra facultativement remplacer l affichage d un symbole pour chaque pion par la coloration de la cellule Excel correspondante avec la couleur du pion. À cet effet, la procédure suivante est mise à disposition : 1 Procédure ColorerCellule(couleur : in Entier) Est 2 -- Colorer le fond de la cellule active avec la couleur spécifiée 3 -- ENTRÉE Couleur : constante de couleur (vbwhite,vbyellow,...etc.) 4 -- ou valeur issue de la fonction RGB (Red,Green,Blue) Exercices corrigés en VBA, Semaine 4 c INPT PAD 3/11

Solution : Ce sous-programme prend un seul paramètre, la grille. C est un paramètre en entrée. De plus ce sous-programme fait de l affichage. Nous en faisons donc une procédure. 1 Procédure afficher(grille: in Grille) Est 2 -- Afficher la grille. L implémentation de ce sous-programme n est pas très facile à structurer, en particulier si on veut essayer de limiter les redondances qui rendent plus difficiles les évolutions ultérieures. Comme on ne sait pas se positionner sur l écran, il faut donc afficher ligne par ligne. On se rend compte rapidement qu il nous faudra donc faire deux boucles imbriquées : l une pour les lignes, l autre pour les colonnes. On peut réaliser une boucle qui s appuie sur l affichage à l écran et qui inclut donc la bordure correspondant aux numéros. Il suffit alors de tester les valeurs des indices de boucle des lignes et colonnes pour savoir si : on n affiche rien (les quatre coins) ; on affiche un numéro de ligne ou de colonne (les bordures) ; on afficher le contenu d une case (les autres cases). Une autre solution, celle retenue ici, consiste à séparer la première et la dernière ligne qui consiste à afficher les numéros de colonne. Notons que pour afficher les lignes, on commence par celle de numéro NB_LIGNES car les indices de notre tableau correspondent aux numéros de ligne du puissance 4 (on aurait pu prendre la convention inverse). 1 R1 : Raffinage De «afficher» 2 Afficher les numéros de colonnes 3 Pour i <- NB_LIGNES Décrémenter JusquÀ i = 1_LIGNES Faire 4 Afficher la ligne i 5 FinPour 6 Afficher les numéros de colonnes 7 8 R2 : Raffinage De «Afficher la ligne i» 9 Afficher le numéro de ligne 10 Pour j <- 1 JusquÀ j = NB_COLONNES Faire 11 afficher_case(grille[i][j]) 12 FinPour 13 Afficher le numéro de ligne Comme l affichage des numéros de colonne est à faire en début et fin, nous en faisons un sous-programme pour factoriser le code. 1 Afficher les numéros de colonnes 2 Sub afficher_numeros_colonnes() 3 Dim j As Integer index pour parcourir les colonnes de la grille 4 AfficherCellule "" sauter la 1ere colonne 5 For j = 1 To NB_COLONNES 6 AfficherCellule j 7 Next j 8 AllerALaLigne 9 End Sub 10 11 Sub afficher_grille(grille() As Integer) 12 ROLE : affiche la grille du jeu et son contenu 13 ENTREE grille Exercices corrigés en VBA, Semaine 4 c INPT PAD 4/11

14 Dim i As Integer, j As Integer index pour parcourir les cases de la grille 15 EffacerEcran TITRE 16 17 afficher_numeros_colonnes For i = NB_LIGNES To 1 Step -1 on affiche d abord la ligne supérieure 18 afficher le numéro de ligne à gauche 19 AfficherCellule i 20 afficher la ligne i 21 For j = 1 To NB_COLONNES 22 ColorerCellule couleur_case(grille(i, j)) 23 AfficherCellule "" symbole_case(grille(i, j)) pour avoir o ou * 24 Next j 25 afficher le numéro de ligne à droite et passer à la ligne 26 AfficherCellule i 27 AllerALaLigne 28 Next i 29 afficher_numeros_colonnes 30 End Sub Exercice 4 : Décider si un coup est possible Écrire un sous-programme qui indique s il est possible de jouer dans une colonne donnée. Exemple : Sur l exemple de la figure 1, il est possible de jouer les colonnes 1, 2, 3, 5, 6 ou 7. Il n est pas possible de jouer la colonne 4. Solution : Ce sous-programme prend en paramètre : la grille (in) ; le numéro de colonne envisagé (in) ; l information de si le coup est possible (out). Un seul paramètre en out, d autres paramètres en in. On en fait donc une fonction. 1 Fonction est_coup_possible(grille: in Grille; colonne: in Entier): Booléen Est 2 -- Est-ce qu il est possible de jouer dans la colonne donnée 3 -- de la grille? Pour savoir s il est possible de jouer, il suffit de regarder si la colonne est pleine ou non, c està-dire s il sa dernière case, celle du haut, est vide ou non. Si elle est vide, on peut jouer dans la colonne. Si elle n est pas vide, on ne peut pas y jouer. Notons que si elle est vide, ça ne veut pas dire que le pion restera dans cette case. Il tombera... On en déduit donc naturellement le code. 1 Function est_coup_possible(grille() As Integer, ByVal colonne As Integer) As Boolean 2 ROLE : renvoie vrai si la colonne spécifiée peut être jouée, c est-à-dire si 3 elle n est pas encore pleine 4 ENTREE grille, colonne 5 est_coup_possible = grille(nb_lignes, colonne) = VIDE test dernière ligne 6 End Function Exercice 5 : Lâcher un jeton Lorsqu un joueur joue, il lâche un jeton de sa couleur au dessus d une colonne de la grille. En raison de la force gravitationnelle, le jeton tombe dans la grille jusqu à ce qu il soit arrêté par un autre jeton ou le fond de la grille. Exercices corrigés en VBA, Semaine 4 c INPT PAD 5/11

Écrire un sous-programme qui réalise cette opération : il calcule le nouvel état de la grille lorsqu un jeton est lâché au dessus d une colonne donnée. Exemple : Partant de la figure 1, si les rouges jouent la colonne 5, le nouvel état de la grille est celui donné par la figure 2. 1 2 3 4 5 6 7 6 * 6 5 o 5 4 o o * 4 3 * o o o 3 2 * o * * o * 2 1 * o * * o o * 1 1 2 3 4 5 6 7 FIGURE 2 Les rouges ont joué la colonne 5 Solution : Le sous-programme prend en paramètre : la grille (in out) ; la colonne donnée (in) ; le jeton, ou plutôt sa couleur (in). Comme il y a un paramètre en in out, nous en faisons une procédure. 1 Procédure lâcher(grille: in out Grille; 2 colonne: in Entier; 3 couleur: in Case) Est 4 -- La couleur joue un pion dans la colonne. 5 -- 6 -- Nécessite 7 -- est_coup_possible(grille, colonne) Le principe de l algorithme est alors de regarder jusqu où va tomber le jeton, soit il n y a encore aucun pion et il est donc en fond de grille, soit il est dans la dernière case qui est vide. En fait, le plus simple est de partir du fond de la colonne et de chercher la première case vide en remontant. Comme on sait qu il est possible de jouer dans la colonne (précondition), on n a pas besoin de tester le débordement de la colonne. 1 R1 : Raffinage De «lâcher» 2 Déterminer la ligne de chute 3 Mettre le pion dans cette case 4 5 R2 : Raffinage De «Déterminer la ligne de chute» 6 ligne <- 1 7 TantQue grille[colonne, ligne] <> VIDE Faire 8 ligne <- ligne + 1 9 FinTQ Remarque : On décide de faire un sous-programme, en l occurrence une fonction, de «Déterminer la ligne de chute» car nous aurons par la suite l utilité de trouver cette ligne de chute. Il n est pas évident ici, du premier coup, de voir qu il peut être utile d en faire un sous-programme. Exercices corrigés en VBA, Semaine 4 c INPT PAD 6/11

1 Function ligne_de_chute(grille() As Integer, ByVal colonne As Integer) As Integer 2 ROLE : renvoie la ligne sur laquelle tombe un jeton lâché à la colonne spécifiée 3 HYPOTHESE : on suppose la colonne non pleine 4 ENTREE grille, colonne 5 Dim ligne As Integer index pour parcourir les lignes de la colonne considérée 6 on recherche la 1ere ligne vide. On sait qu il y en a une par hypothèse 7 ligne = 1 8 Do While grille(ligne, colonne) <> VIDE 9 ligne = ligne + 1 10 Loop 11 ligne_de_chute = ligne 12 End Function 13 14 Sub lacher(grille() As Integer, ByVal colonne As Integer, ByVal couleur As Integer) 15 ROLE : lache sur la grille à la colonne précisée un jeton de la couleur donnée. 16 HYPOTHESE : on suppose la colonne non pleine 17 ENTREE colonne, couleur 18 M.A J. grille : elle contient un pion de plus 19 grille(ligne_de_chute(grille, colonne), colonne) = couleur 20 End Sub Exercice 6 : Compter les jetons alignés Écrire un sous-programme qui indique quelle est la longueur de l alignement le plus long qui inclut un jeton donné (repéré par son numéro de colonne et son numéro de ligne). Les alignements doivent être cherchés dans toutes les directions (horizontale, verticale ou en diagonale). Ce sous-programme sera ensuite utilisé pour déterminer la fin d une partie (alignement 4) ou aider l ordinateur à choisir la colonne où jouer (exercice 8). Sur l exemple de la figure 2, la case (1,1) correspond à un alignement de trois jetons en diagonale ; la case (7,1) correspond à un alignement de deux jetons verticalement ; la case (6,2) correspond à trois jetons alignés verticalement ou en diagonale... Indication : Quel est l intérêt d avoir défini une bordure supplémentaire autour de la grille? Solution : Ce sous-programme prend en paramètre une grille (in), une ligne (in) et une colonne (in) et détermine le plus long alignement (out). Un paramètre en sortie. Tous les autres en entrée. Nous pouvons donc en faire une fonction. 1 Fonction nb_pions_alignés(grille: in Grille; 2 ligne: in Entier; 3 colonne: in Entier): Entier 4 -- Plus grand nombre de jetons de la même couleur alignés 5 -- horizontalement, verticalement ou en diagonale et incluant 6 -- le jeton de la position (colonne, ligne). 7 -- 8 -- Nécessite 9 -- grille[colonne, ligne] <> VIDE L algorithme est un peu compliqué, ou tout au moins fastidieux. Il faut regarder dans les quatre directions (horizontalement, verticalement et en diagonale) pour compter l alignement le plus grand. Pour chaque direction, il faut compter la case (colonne, ligne) et les deux sens de la direction. Exercices corrigés en VBA, Semaine 4 c INPT PAD 7/11

Supposons que l on sache calculer un nombre de pions alignés selon une direction. On peut alors en déduire le code de «nb_pions_alignés» 1 R1 : Raffinage De «nb_pions_alignés» 2 Résultat <- max(nb_pions_dir(grille, colonne, ligne, 1, 1), 3 max(nb_pions_dir(grille, colonne, ligne, 1, 0), 4 max(nb_pions_dir(grille, colonne, ligne, 1, -1), 5 nb_pions_dir(grille, colonne, ligne, 0, 1)))) Il ne reste plus qu à écrire nb_pions_dir. C est une fonction. 1 Fonction nb_pions_dir(grille: in Grille; colonne, ligne: in Entier; 2 dir_x, dir_y: in Entier) Est 3 -- Compter le nombre de pions dans la direction (dir_x, dir_y) 4 -- et incluant le pion en (colonne, ligne). 5 -- 6 -- Nécessite 7 -- grille[colonne, ligne] <> VIDE 8 -- (dir_x <> 0) Ou (dir_y <> 0) -- direction valide 9 -- 10 -- Assure 11 -- Résultat >= 1 -- au moins le jeton de (colonne, ligne) Pour son implémentation, il suffit de compter le jeton de (colonne, ligne) puis compter les jetons de même couleur dans la direction (dir_x, dir_y) et ceux dans la direction opposée (-dir_x, -dir_y). 1 R1 : Raffinage De «nb_pions_dir» 2 couleur <- grille[colonne, ligne] 3 Résultat <- 1 4 Comptabiliser les jetons dans la direction (dir_x, dir_y) 5 Comptabiliser les jetons dans la direction (-dir_x, -dir_y) 1 2 Function nb_pions_dir(grille() As Integer, ByVal ligne As Integer, ByVal colonne As Int ByVal dir_x As Integer, ByVal dir_y As Integer) As Integer 3 ROLE : renvoie le plus grand nombre de jetons de la même couleur alignés suivant la 4 direction (dir_x, dir_y) et incluant le jeton de la case (ligne,colonne) 5 HYPOTHESES : la position spécifiée par ligne, colonne contient bien un jeton. 6 l une au moins des 2 directions n est pas nulle. 7 ENTREE grille, ligne, colonne, dir_x, dir_y 8 Dim l As Integer ligne dans la direction +/- dir_y 9 Dim c As Integer colonne dans la direction +/- dir_x 10 Dim couleur As Integer la couleur de l alignement 11 Dim nb_pions As Integer nombre de pions alignés en cours de calcul 12 13 1.initialiser 14 couleur = grille(ligne, colonne) 15 nb_pions = 1 le jeton en (ligne, colonne) 16 17 2.comptabiliser les jetons dans la direction (dir_x, dir_y) 18 l = ligne + dir_y 19 c = colonne + dir_x 20 Do While grille(l, c) = couleur boucle finie car les "bords" de la grille sont vid 21 nb_pions = nb_pions + 1 Exercices corrigés en VBA, Semaine 4 c INPT PAD 8/11

22 23 l = l + dir_y c = c + dir_x 24 Loop 25 26 3.Comptabiliser les jetons dans la direction (-dir_x, -dir_y) 27 l = ligne - dir_y 28 c = colonne - dir_x 29 Do While grille(l, c) = couleur boucle finie car les "bords" de la grille sont vid 30 nb_pions = nb_pions + 1 31 l = l - dir_y 32 c = c - dir_x 33 Loop 34 4.renvoi du résultat 35 nb_pions_dir = nb_pions 36 End Function 37 38 Function max(byval Entier1 As Integer, ByVal Entier2 As Integer) As Integer 39 ROLE : renvoie la plus grande des 2 valeurs spécifiée 40 If Entier1 > Entier2 Then max = Entier1 Else max = Entier2 41 End Function 42 43 Function nb_pions_alignes(grille() As Integer, ByVal ligne As Integer, ByVal colonne As 44 As Integer 45 ROLE : renvoie le plus grand nombre de jetons de la même couleur alignés horizontaleme 46 verticalement ou en diagonale et incluant le jeton de la position (ligne, colon 47 ENTREE grille, ligne, colonne 48 49 Dim nb_pions As Integer nb_pions = 0 50 If grille(ligne, colonne) <> VIDE Then 51 Déterminer le plus grand alignement 52 nb_pions = max(nb_pions, nb_pions_dir(grille, ligne, colonne, 1, 1)) 53 nb_pions = max(nb_pions, nb_pions_dir(grille, ligne, colonne, 1, 0)) 54 nb_pions = max(nb_pions, nb_pions_dir(grille, ligne, colonne, 1, -1)) 55 nb_pions = max(nb_pions, nb_pions_dir(grille, ligne, colonne, 0, 1)) 56 End If 57 nb_pions_alignes = nb_pions 58 End Function Exercice 7 : Conseiller une colonne où jouer Écrire un sous-programme qui étant donné une grille propose une colonne où jouer. Le numéro de la colonne sera choisi aléatoirement. Solution : Ce sous-programme est une fonction car il a un seul paramètre en sortie (la colonne conseillée) et un paramètre en entrée (la grille de jeu), éventuellement deux si l on considère aussi la couleur de celui que l on doit conseiller (couleur qui n est pas exploité dans cette version très naïve du conseil). 1 Fonction colonne_conseillée_aléatoire(grille: in Grille; couleur: in Case) Est 2 -- colonne conseillée pour jouer Le principe est de tirer une colonne au hasard jusqu à ce qu elle correspondent à une colonne où l on peut jouer. Exercices corrigés en VBA, Semaine 4 c INPT PAD 9/11

1 Sub colonne_conseillee_aleatoire(grille() As Integer, colonne As Integer) 2 ROLE : calcule une colonne conseillée pour jouer le prochain coup 3 PRINCIPE : la colonne conseillée est choisie au hasard entre les colonnes possibles 4 ENTREE grille 5 SORTIE colonne 6 Do 7 colonne = Int(Rnd * NB_COLONNES + 1) 8 Loop Until est_coup_possible(grille, colonne) 9 10 End Sub Exercice 8 : Améliorer le conseil Pour améliorer le conseil, on ajoute une contrainte supplémentaire : conseiller la colonne qui permet l alignement le plus long. Remarque : Cette contrainte implique que si un coup gagnant existe, la colonne conseillée conduira à la victoire. Exemple : Partant de la figure 2, les jaunes joueront en colonne 5. Ceci provoque un alignement de 4 pions et donc la victoire. Solution : Les paramètres sont les mêmes que pour le conseil précédent sauf que la couleur du joueur est ici nécessaire. 1 Fonction colonne_conseillée(grille: in Grille; couleur: in Case) Est 2 -- colonne conseillée pour jouer Le principe du conseil est un peu plus compliqué car il faut proposer le coup correspondant à l alignement le plus grand. On a déjà écrit un sous-programme pour calculer un alignement mais il suppose que l on ait déjà jouer dans la case. Il nous faut donc jouer dans la case. Et si l on joue, il faut également pouvoir annuler le coup pour ne pas fausser la partie. 1 R1 : Raffinage De «colonne_conseillée» 2 max <- 0 -- alignement maximal trouvé 3 Pour c <- 1 JusquÀ c = NB_COLONNES Faire 4 Jouer en c pour couleur 5 Si alignement > max Alors 6 max <- alignement 7 Résultat <- c 8 FinSi 9 Annuler le coup en c 10 FinPour 1 Sub colonne_conseillee(grille() As Integer, ByVal couleur As Integer, colonne As Intege 2 ROLE : calcule une colonne conseillée pour jouer le prochain coup 3 PRINCIPE : la colonne conseillée est celle qui permet : 4 - en priorité d empecher l adversaire de gagner au coup suivant 5 - sinon, d obtenir l alignement le plus long. 6 ENTREE grille, couleur (couleur du joueur qui va jouer) 7 SORTIE colonne 8 Dim c As Integer index de parcours des colonnes 9 Dim nb_pions As Integer Nombre de pions alignés pour c 10 Dim max As Integer le nb max de pions alignés (donc de resultat) 11 Dim ligne As Integer conserver la ligne de chute du pion lâché Exercices corrigés en VBA, Semaine 4 c INPT PAD 10/11

12 Dim couleur_adverse As Integer couleur de l adversaire 13 Dim parer As Boolean mis a vrai si l on doit parer a un coup de l adversaire 14 lui permettant de gagner au coup suivant 15 16 couleur_adverse = NB_JOUEURS - couleur + 1 17 parer = False 18 max = 0 nécessairement un minorant strict 19 c = 1 colonne à tester 20 21 Do While Not parer And c <= NB_COLONNES If est_coup_possible(grille, c) Then 22 déterminer la ligne de chute 23 ligne = ligne_de_chute(grille, c) 24 25 simuler la pose du pion adverse pour voir si ca le fait gagner 26 27 grille(ligne, c) = couleur_adverse If nb_pions_alignes(grille, ligne, c) >= NB_ALIGNES_GAGNANT Then 28 colonne = c coup à parer d urgence! 29 parer = True 30 31 Else 32 simuler la pose de son propre pion 33 grille(ligne, c) = couleur 34 35 évaluer le coup 36 nb_pions = nb_pions_alignes(grille, ligne, c) 37 38 choisir le coup (par rapport au précédent) 39 40 If (nb_pions > max) Or (nb_pions = max And Rnd > 0.5) Then max = nb_pions 41 colonne = c 42 End If 43 End If 44 45 retirer le coup testé 46 grille(ligne, c) = VIDE 47 48 End If 49 50 passer à la colonne suivante 51 c = c + 1 52 Loop 53 End Sub Exercices corrigés en VBA, Semaine 4 c INPT PAD 11/11