Chapitre 2: Programmer Karel


Le style le plus simple du programme Karel utilise du texte pour spécifier une séquence de commandes intégrées à exécuter lorsque le programme est exécuté. run . Considérez le programme Karel simple ci-dessous. Le texte à gauche est le programme. L'état du monde de Karel est indiqué à droite:

Appuyez sur le bouton "Exécuter" pour exécuter le programme. Les programmes sont généralement écrits dans une application spéciale appelée Environnement de développement intégré (IDE) et la plupart des programmes Karel sont écrits dans un IDE appelé PyCharm. Comme un IDE, ce lecteur a la capacité d'exécuter des programmes afin de vous aidervoir comment les choses fonctionnent pendant que vous apprenez.

Le programme est composé de plusieurs parties. La première partie comprend les lignes suivantes:

# Fichier: PremierKarel.py
# -----------------------------
# Le programme PremierKarel définit un " main "
# fonction avec trois commandes. Ces commandes provoquent
# Karel à avancer avant d'un bloc, prenez un jeton
# puis avancer devant le coin suivant.

Ces lignes sont un exemple de commentaire , qui est simplement un texte destiné à expliquer le fonctionnement du programme aux lecteurs humains. Les commentaires dans Karel et Python commencent par les caractères # et incluez le reste de la ligne. Dans un programme simple, des commentaires détaillés peuvent sembler idiots parce que l'effet du programme est évident, mais ils sont extrêmement importants pour documenter la conception de programmes plus grands et plus complexes. La deuxième partie du programme est la ligne:

from karel.stanfordimport *

Cette ligne demande l’inclusion de toutes les définitions de la karel.stanford bibliothèque. Cette bibliothèque contient les définitions de base nécessaires à l'écriture de programmes Karel, telles que les définitions des opérations standard. avancer() et ramasser_jeton() . Parce que vous avez toujours besoin d'accéder à ces opérations, chaque programme Karel que vous écrivez inclura cette commande d'importation avant d'écrire le programme réel.

La dernière partie du programme Karel comprend la définition de fonction suivante:

   def main():
      avancer()
      ramasser_jeton()
      avancer()

Ces lignes représentent la définition d'un nouveau fonction , qui spécifie la séquence d'étapes nécessaires pour répondre à une commande. Comme dans le cas du PremierKarel programme lui-même, la définition de la fonction se compose de deux parties qui peuvent être considérées séparément: La première ligne constitue l'en-tête de la fonction et le code en retrait qui suit est le corps de la fonction. Si vous ignorez le corps pour l'instant, la définition de la fonction ressemble à ceci:

   def main():
corps de la définition de fonction

Le premier mot de l'en-tête de la fonction, def , fait partie de la structure syntaxique de Python. Il dit que vous créez une nouvelle fonction. Le mot suivant sur la ligne d'en-tête spécifie le nom de la nouvelle fonction, qui dans ce cas est main . La définition d'une fonction signifie que Karel peut désormais répondre à une nouvelle commande portant ce nom. le main() La commande joue un rôle spécial dans un programme Karel. Lorsque vous démarrez un programme Karel, il crée une nouvelle instance Karel, ajoute ce Karel à un monde que vous spécifiez, puis émet le main() commander. L'effet de exécuter le programme est défini par le corps du main() fonction, qui est une séquence de commandes que le robot exécutera dans l'ordre. Par exemple, le corps du main() fonction pour le PremierKarel programme est:

   avancer()
   ramasser_jeton()
   avancer()

Ainsi, si l'état initial du monde correspond à l'exemple donné au chapitre 1, Karel avancer abord avancer dans le coin contenant le jeton , prend ce jeton , et enfin avancer avance vers le coin juste avant le mur, comme indiqué dans le diagramme avant-après suivant:

Avant:
Après:

Résoudre un problème plus intéressant

le PremierKarel programme défini ci-dessus ne fait pas grand-chose pour le moment. Essayons de le rendre un peu plus intéressant. Supposons que l'objectif ne soit pas simplement d'amener Karel à prendre le jeton mais à avancer le jeton de sa position initiale sur la 2ème colonne et la 1ère rangée au centre d'un rebord. Ainsi, votre prochaine mission est de définir un nouveau programme Karel qui accomplit la tâche illustrée dans ce diagramme:

Avant:
Après:

Les trois premières commandes du nouveau programme - celles qui avancer avancent, prennent le jeton , puis avancer jusqu'au rebord - sont les mêmes que précédemment:

   avancer()
   ramasser_jeton()
   avancer()

De là, la prochaine étape est de tourner gauche pour commencer à grimper le rebord. Cette opération est facile, car Karel a un tourner_gauche() commande dans son répertoire standard. Exécuter un tourner_gauche() commande à la fin de la séquence de commandes précédente laisse Karel face au nord au coin de la 1ère ligne et de la 3ème colonne. Si Karel exécute alors un avancer() commande, il sera avancer nord pour atteindre la position suivante:

De là, la prochaine chose que vous devez faire est d'amener Karel au tourner droite afin qu'il soit à nouveau face à l'est. Bien que cette opération soit conceptuellement aussi simple que d'amener Karel à tourner gauche , il y a un léger problème: le langage de Karel comprend un tourner_gauche() commande, mais non tourner_droite() commander. C’est comme si vous avez acheté le modèle économique et que vous venez de découvrir qu’il manque certaines fonctionnalités importantes.

À ce stade, vous avez votre première occasion de commencer à penser comme un programmeur. Vous avez un ensemble de commandes, mais pas exactement l'ensemble dont vous avez besoin. Que pouvez-vous faire? Pouvez-vous accomplir l'effet d'un tourner_droite() commande en utilisant uniquement les capacités dont vous disposez? La réponse est, bien évidemment, oui. Vous pouvez accomplir l'effet de tourner à droite en tournant à gauche trois fois. Après trois virages à gauche, Karel fera face dans la direction souhaitée. De là, tout ce que vous avez à faire est de programmer Karel à avancer au centre de la corniche, de déposer le jeton puis avancer vers la position finale. Voici une implémentation complète d'un programme qui accomplit toute la tâche:


Chapitre suivant