9. Peter dans un labyrinthe <<< Table des matières >>> 11. Des monstres partout
Conservons le programme Way (Chemin) du chapitre précédent . Nous allons l’éditer de façon à contrôler les déplacements de Peter dans le labyrinthe à l’aide de notre clavier . Nous essaierons plusieurs méthodes de contrôle et nous les conserverons toutes dans le programme afin de pouvoir les comparer . Nous conserverons aussi la méthode par laquelle Peter cherche son chemin tout seul .
A partir du groupe program control (contrôle du programme) , faites glisser l’élément group (groupe) dans le cycle principal du programme . A présent déplacez vers ce groupe tous les éléments se trouvant dans le cycle principal (l’élément pour tourner à droite, le cycle pour trouver un carré vide, et la commande de pas en avant) . Réduisez ce groupe (clic sur le signe « – « encadré) et ajoutez-y un commentaire disant Peter Walks Himself (Peter se promène tout seul). Ceci cache la méthode de recherche automatique afin de ne pas la mélanger avec les autres méthodes que nous allons créer . Essayez de lancer le programme pour faire un test . Il doit tourner exactement comme avant la modification .
Cliquez sur l’icône du nouveau groupe pour le sélectionner . Dans la barre d’outils , cliquez sur le bouton Turn Off (Désactiver) . Le groupe et tous ses éléments passent au gris . Cette fonction vous permet de désactiver certaines parties d’un programme quand elles ne vous sont pas nécessaires . Quand vous lancez le programme, vous constatez que Peter reste dans le coin inférieur gauche et que rien ne se produit . Le programme se comporte comme si le groupe et ses commandes n‘en faisaient pas du tout partie .
Nous allons assembler une nouvelle section de notre programme à l’intérieur du cycle principal du programme, immédiatement après le groupe précédent . Nous allons utiliser un nouvel élément, — multibranch control structure (structure de contrôle de branchement multiple) (parfois aussi appelé "rake" (râteau) entre programmeurs). On le trouve dans le groupe program control (contrôle du programme) . Faites-le glisser dans le cycle principal sous le groupe Peter Walks Himself (Peter se promène tout seul).
L’élément de branchement multiple fait se brancher les programmes sur différentes parties de programme , en fonction d’une variable ou de la valeur d’une expression . En général le branchement est basé sur des valeurs numériques , Plus tard nous utiliserons aussi le branchement pour d’autres types de données, comme les textes .
Cet élément contient quatre autres éléments . Le premier élément, for value of expression (pour la valeur de l’expression) , contient une variable ou une expression, qui est la base du branchement . Nous mettrons ici l’élément key input (waits to be pressed) (entrée touche (attend la pression)) . Il va transmettre le code numérique de la touche pressée à la structure de branchement .
Viennent ensuite deux éléments associés — execute commands in case of (exécuter les commandes au cas où) et expression is equal to (l’expression est égale à) . C’est une branche de la construction .Dans expression is equal to (l’expression est égale à), vous placez une valeur pour laquelle les commandes situées dans la branche seront exécutées . Il peut y avoir un nombre quelconque de branches, et également un nombre quelconque de valeurs testées dans une branche . Copiez encore trois fois l’intégralité de la branche execute commands in case of (exécuter les commandes au cas où) .
Nous avons maintenant quatre branches de la construction . Dans la valeur testée dans la première branche, mettez le code touche Up (Haut) depuis le groupe controls (contrôles) , keyboard (clavier), keys (touches) , control keys (touches de contrôle) . Cette branche sera exécutée lorsque vous appuierez sur la touche fléchée « Haut » . Insérez un pas (step) comme commande de branche. Nous allons faire en sorte que Peter ne traverse pas un mur . Il n’est pas nécessaire de contrôler le bord de la feuille . Peter ne peut pas s ‘échapper de la feuille . Au lieu d’un simple pas, nous allons utiliser une commande conditionnelle . Dans le test , nous comparerons des items pour voir s’il y a un mur devant Peter . Si c’est le cas, rien ne se passera . S’il n’y en a pas , Peter fera un pas en avant .
Dans les trois branches suivantes, insérez les touches Left (Gauche) , Right (Droite) , et Down(Bas) comme valeurs testées, et left (gauche) , right (droite) , et turn about (demi-tour) comme commandes .
Le dernier élément dans la construction du branchement est else execute commands (sinon exécuter les commandes). Comme le suggère ce nom, ici les commandes seront exécutées si la valeur testée n’est trouvée dans aucune branche . Dans notre cas, cet élément sera vide .
Démarrez le programme . Peter est dans le coin inférieur gauche . Si vous essayez les touches de curseur (flèches), vous verrez que Peter tourne à gauche, à droite, fait demi-tour, et fait un pas en avant . Vous pouvez promener Peter dans tout le labyrinthe . Lorsque vous arrivez à la porte, Peter se tourne vers vous et le programme se termine au prochain appui sur une touche .
C’est la méthode typique pour les voitures . On l’utilise quand on a besoin de faire tourner un objet exactement dans une direction souhaitée , et lorsque la vitesse du mouvement tout autour de la feuille n’est pas si importante que cela .
Si vous avez besoin d’opérer des déplacements avec rapidité et facilité, vous pouvez utiliser la méthode de contrôle qui suit . Elle ne contrôle pas les tournants du personnage, mais son déplacement dans une direction indiquée par une flèche .
En utilisant le bouton droit de la souris, copiez une fois , dans le bas, la précédente construction avec branchements . Désactivez la construction originelle en utilisant le bouton Turn Off (Désactiver) . Intitulez la nouvelle construction Controlling Peter by Directions (Contrôler Peter selon la direction). Effacez des branches les commandes pour tourner à droite, à gauche, faire demi-tour .
Nous allons éditer la première branche de la construction (pour la flèche vers le haut) pour faire tourner Peter et lui faire faire un pas en avant . Le pas en avant est déjà préparé . Dedans , il y a un test de la présence d’un mur devant Peter . La direction dans laquelle Peter tourne peut être spécifiée par l’élément direction . Il se trouve dans les extensions de Peter . Comme paramètre, ajoutez l’élément up (1/2 pi, that is 90 degrees) (en haut (1/2 pi soit 90 degrés)) depuis le groupe calculations (calculs) , sous-groupe angle, direction .
Créez les commandes réglant la direction dans les autres branches aussi, en changeant les directions selon celles indiquées par les flèches . La commande pour un pas prudent en avant pourrait être copiée depuis la première branche, mais nous utiliserons une fonction à la place .
Qu’est-ce qu’une fonction ? Une fonction est un élément qui contient un morceau de programme . Au lieu de placer plusieurs fois le même morceau de programme en différents endroits de celui-ci, nous utiliserons une fonction pour exécuter plusieurs fois cette partie de programme . Le programme en sera plus facile à lire et à modifier .
Pour créer une nouvelle fonction, faites glisser l’élément function (Fonction) de la fenêtre Library of Variables and Functions (Bibliothèque de Variables et Fonctions) vers la fenêtre Global Variables and Functions (Variables et Fonctions Globales). Etiquetez la fonction Cautious Step Forward (Pas prudent en avant). Lorsque vous faites un double clic sur l’icône de la fonction, une fenêtre d’édition vide apparaît , car la fonction ne contient encore aucune commande .
Nous pourrions créer la commande de pas dans la fonction, mais il existe une méthode plus facile, étant donné que cette commande est déjà toute prête dans le programme . Revenez à la fonction principale du programme (en utilisant le bouton Previous Edit (Edition précédente) ), et trouvez la commande conditionnelle avec le test du mur et le pas en avant (elle est dans la branche pour la flèche vers le haut) . Cliquez sur la commande conditionnelle pour la mettre en surbrillance . Cliquez sur le bouton Copy (Copier) (ou appuyez sur Ctrl+C sur le clavier). La partie en surbrillance sera sauvegardée dans le Presse-papiers pour opérer le transfert de données .
Revenez à la fonction Cautious Step Forward (Pas prudent en avant) (en cliquant sur le bouton Next Edit (Edition suivante) ). Cliquez sur le bouton Paste (Coller) (ou appuyez sur Ctrl+V). La partie transférée du programme apparaît dans la fenêtre .
A présent, nous pouvons effacer la commande conditionnelle de la branche pour la flèche vers le haut et la remplacer par la fonction pour un pas prudent en avant . Nous mettrons également celle-ci dans les autres branches situées après les commandes réglant la direction .
Vous pouvez démarrer et tester la commande . Vous verrez Peter marcher dans la direction de la touche pressée .
Nous allons essayer une méthode supplémentaire de contrôle qui peut s’utiliser pour des jeux plus élaborés et plus complexes . Vous avez peut-être remarqué que, dans la méthode précédente ,si vous maintenez une touche appuyée pendant un moment, Peter continue à avancer même après que vous relâchiez la touche . Ceci se produit parce que les codes des touches pressées sont générés plus vite que Peter n’avance, et donc conservés dans la pile des touches . Ceci peut être résolu par la commande flush out of key buffer (vider le tampon clavier) , qui efface les codes des touches de la pile . Nous utiliserons cette commande au début de chaque action concernant un caractère valide du clavier, avant les pas de Peter .
Une autre chose qui peut poser problème dans les deux précédentes méthodes de contrôle se produit si contrôlez des actions rapides ou si vous avez besoin de contrôler le graphisme avec grande précision . Dans le réglage du sprite de Peter, essayez de changer la valeur de Phases per Step (Phases par pas) en la mettant à 1 après le test, remettez-là à 8). Peter va sauter les carrés avec célérité . Si vous maintenez la touche appuyée sur un chemin dégagé plus long, Peter saute un carré, attend un petit moment, puis saute rapidement vers les autres carrés . Ceci est provoqué par la façon dont le clavier génère des codes --- il y a une pause après le premier code, puis des répétitions rapides . C’est utile quand vous écrivez du texte, mais cela peut être un peu gênant quand vous jouez .
Nous allons donc demander que Peter se déplace quand nous maintenns une touche pressée, sans la pause initiale, et sans inertie après que la touche ait été relâchée . Ceci peut être réalisé avec la fonction there is pressed key (il y a une touche pressée) du groupe keyboard (clavier) . La fonction teste si la touche appropriée est pressée et renvoie un drapeau yes/no (oui/non).
D’abord, cliquez sur le bouton Turn Off (Désactiver) afin de désactiver une fois encore la méthode précédente . En dessous de la méthode, préparez un élément conditional executing of commands (exécution conditionnelle de commandes) ; vous pouvez l’appeler Controlling Peter by Holding Keys (Contrôler Peter par maintien de touches). Dans le test de condition if valid (si valide) , insérez l’élément there is pressed key (il y a une touche pressée) et donnez-lui pour paramètre la touche Up (Haut) . Dans la branche then do(alors faire) , insérez les commandes pour faire un pas vers le haut, comme dans la précédente méthode de contrôle . La construction se lit à présent : "Si la touche Up (Haut) est pressée, alors tournez vers le haut et faites un pas prudent, sinon testez les autres touches ." .
Dans la branche else do (sinon faire) , créez la même construction, cette fois-ci pour aller à gauche . Dans sa branche d’invalidité , créez une construction pour aller à droite, puis, finalement, créez une construction similaire pour aller vers le bas . Dans la branche d’invalidité de la construction pour aller vers le bas, insérez la commande wait (default = 0.05 s) (attendre (par défaut = 0.05 sec.) , du groupe program control(contrôle du programme) . Le petit signe égale devant l’icône signifie qu’il y a un paramètre optionnel à cette commande , c’est-à-dire qu’il n’est pas nécessaire d’en mettre un .
Pourquoi une commande d’attente ? Windows est un système d’exploitation multitâches, ce qui veut dire que plusieurs programmes peuvent tourner en même temps . Chaque programme doit faire en sorte de ne pas utiliser de façon superflue les capacités de l’ordinateur . Un bon programmeur se remarque au comportement respectueux de ses programmes vis-à-vis de l’environnement dans lequel ils se trouvent .Les utilisateurs avancés peuvent démarrer le programme Moniteur Système et observer quelles charges pèsent sur le processeur . Un programme ne tenant pas compte de l’environnement système mobilise presque toutes les capacités de l’ordinateur et le rend difficile à contrôler .
L’image ci-dessous présente l’ensemble de la méthode de contrôle de Peter . Les constructions pour les pas ne sont pas développées , car nous les connaissons déjà de la méthode précédente .
Le désavantage d’une telle longue chaîne de conditions est qu’il peut être difficile de s’y retrouver . Nous allons essayer une autre possibilité d’assemblage d’une construction de ce type .
Cliquez sur Turn Off (Désactiver) pour désactiver la dernière méthode . Copiez la méthode Controlling Peter by Directions (Contrôler Peter selon la direction) et renommez-la Controlling by Holding Keys 2 (Contrôler en maintenant les touches 2). La construction conditionnelle fonctionnait de telle façon que seulement une des branches était exécutée , en fonction de la touche pressée . Effacez la fonction d’entrée clavier (keyboard input ) de l’élément for value of expression (pour la valeur de l’expression) , et remplacez-la par l’élément yes (oui) (de calculations (calculs) , logic operations (opérations logiques) ).
Dans les valeurs testées des branches individuelles, remplacez les codes de touches (key codes) par des combinaisons d’un code de touche et de l’élément there is pressed key(il y a une touche pressée) . Faites ce qui suit : cliquez sur l’icône du code de touche pour sélectionner l’élément code de touche . Cliquez sur le bouton Cut (Couper) (ou pressez Ctrl+X) pour déplacer l’élément code de touche dans le Presse-papiers . Insérez l’élément there is pressed key (il y a une touche pressée) à la place de l’élément code de touche . Cliquez sur le bouton Paste (Coller) (ou pressez Ctrl+V) pour lier le code de touche au test de touche pressée . Finalement, insérez l’élément wait (default = 0.05 s) (attendre (par défaut = 0.05 sec.)) dans la branche else execute commands (sinon exécutez les commandes) , de façon à ce que le programme ne surcharge pas l’ordinateur durant les moments d’inactivité .
La construction que nous obtenons se trouve sur l’image suivante . Comment fonctionne-t-elle ? Au début, le programme détecte qu’il y aura un test d’une valeur logique de validité dans ses branches . Il parcourt les branches individuelles et cherche une valeur qui corresponde, c’est-à-dire une condition valide . Il exécute la commande dans la branche qu’il trouve, et continue après la fin de la structure multibranche (sans se soucier d’autres conditions qui pourraient être valides, ni des autres branches) . En d’autres termes, la première (et unique) branche avec une condition valide (une touche pressée) est exécutée, sinon c’est la toute dernière commande --- attendre --- qui est exécutée .
9. Peter dans un labyrinthe <<< Table des matières >>> 11. Des monstres partout