Scratch pour les avancés
Scratch est un langage de programmation orienté visuel pour les enfants. Il y a une opinion que c'est un langage pour les enfants afin de simplement jouer de la «programmation» et rien de bon ne peut en être fait. Quand j'ai commencé à donner des cours aux enfants sur Scratch, cela me semblait être une personne possédant deux formations techniques supérieures. Cependant, après un certain temps, j'ai dû changer d'avis. Il s'est avéré que même dans ce langage de programmation pour enfants, il existe des puces cachées qui peuvent être sérieusement utilisées même lors de l'apprentissage de la programmation professionnelle. Je veux partager avec vous mes découvertes.Clonage et variables dans Scratch
Mon élève a aimé le jeu - "Zombies contre les plantes" . Et il était intéressé à le programmer lui-même. Rappelons-nous comment ce jeu fonctionne? Sur le côté droit, nous avons une ligne de plantes qui tire à l'approche des zombies.Il existe de nombreuses solutions à ce problème, mais à mon avis, une solution plus élégante consiste à utiliser le nombre minimum possible de sprites, c'est-à-dire utiliser le clonage.Comment faire en sorte que chaque clone individuel ait son propre niveau de vie? Que sélectionner des variables ou des listes? Ils ont tenté d'utiliser des listes, mais après une étude plus détaillée, ils ont réalisé que cette structure de données n'aide pas à résoudre le problème. Les variables et les listes dans Scratch ont 2 types de visibilité pour chaque type de données - c'est "pour tous les sprites"ou "juste pour ce sprite" . J'ai dû vérifier la portée. Nous avons commencé avec les variables.Avoir atteint la version de travail de la variable avec la portée «uniquement pour ce sprite» . Dans les langages de programmation classiques, ce type de visibilité est appelé local ou privé, selon le contexte.Il s'avère que si cette variable avec une portée donnée est utilisée dans le clone, alors une instance de la variable est créée dans le clone qui appartient au clone particulier et qui est utilisée pour les calculs / opérations internes du clone. Dans notre cas, chaque clone a sa propre «vie». Si cela devenait intéressant, je vous conseille de consulter l' annuaire . Et voici une image qui montre comment les sprites ou les clones fonctionnent avec des variables de différents types de visibilité.
La variable avec la portée de tous les sprites (l'image de gauche) est une pour tous. Au fait, ici, vous pouvez regarder travailler avec des sections critiques avec des enfants et ce qu'est une course pour une ressource. Et si la portée de la variable est "uniquement pour ce sprite", puis le sprite et ses clones ont leur propre variable avec le même nom avec lequel ils travaillent (figure de droite). Et les clones n'ont pas accès à la variable d'origine et à la variable d'un autre clone.Ce fut une découverte inattendue et agréable des propriétés de Scratch pour créer de tels algorithmes.IMPORTANT: Une variable est un outil très puissant d'un vrai programmeur, donc j'enseigne immédiatement aux enfants le nom correct des variables, car cette compétence les aidera dans des projets de complexité variable.Noms d'objets comme identificateurs
IMPORTANT: toutes les variables avec une zone de visibilité «pour ce sprite uniquement».Cet outil était complètement inattendu pour moi. Commençons par une histoire sur la façon dont un élève et moi sommes tombés sur cette caractéristique de la langue. Mon élève a décidé de créer un jeu avec «intelligence artificielle». Le jeu représente les guerres des étoiles sur des vaisseaux spatiaux et le joueur a la capacité de contrôler un navire, tandis que les adversaires vous poursuivent et se poursuivent. Pour qu'ils puissent vous poursuivre ou vous poursuivre, ils doivent en quelque sorte décider qui poursuivre. Ce problème peut être résolu dans le front et définir l'ordre de poursuite des navires, mais le jeu perdra son intelligence et s'ennuiera rapidement. Par conséquent, l'étudiant a décidé d'ajuster l'intellect afin que les navires intelligents chassent l'ennemi le plus proche. Voyons comment il a commencé à résoudre ce problème.
À mon avis, une bonne solution pour créer un prototype rapide. Mais quelles sont les limites? Tout d'abord, la complexité du code lorsque vous ajoutez de nouveaux navires. Par conséquent, la complexité du code augmente et les mutations du code dues à la complexité ne sont pas exclues. Le temps de recherche d'erreurs et de débogage de l'algorithme augmentera. Et bien sûr, personne n'a annulé une métrique aussi cool que le vieillissement du code (niveau avancé de développement SW). Que faire? Et vous devez faire ce qui suit, vous devez créer un algorithme généralisé qui s'adaptera dynamiquement pour augmenter ou diminuer le nombre de navires.Pour cet algorithme, nous avons besoin d'une propriété de langage - un nom comme identifiant pour un objet. Le temps est venu de grands changements et ici, en tant qu'enseignant, vous pouvez parler de refactorisation. Il s'agit d'un changement séquentiel du code, améliorant sa structure et son optimisation. Et surtout, afin que chaque changement ne rompt pas le programme, et le montant du changement doit également être soigneusement sélectionné. Trop de changements sont mauvais, trop peu sont longs. Une compétence de refactoring formée donnera un avantage et une efficacité au programmeur. Mais pour la formation de l'habileté dont vous avez besoin pour travailler avec votre tête, et pas seulement fouiner. J'ai réussi à faire 4 changements dans le programme d'origine et le résultat n'a pas changé.
Notez que je n'ai pas encore supprimé les blocs, mais les ai laissés. Pourquoi? Parce que si quelque chose ne va pas, nous pouvons retourner l'option précédente, recommencer à zéro. Mais dès que je vérifierai la bonne exécution du script mis à jour, je les supprimerai immédiatement afin de ne pas être distrait par eux à l'avenir.L'avez-vous remarqué? Maintenant, dans le bloc «tourner vers ...» , il y a une variable et cette chose fonctionne. C'est-à-dire nous avons vérifié avec un minimum d'effort que cette approche fonctionne. C'est tout simplement génial. Nous pouvons maintenant commencer à écrire des algorithmes qui nous permettront de déterminer l'objet de la poursuite du navire le plus proche.Qu'est-ce qui nous est utile? Cela provient des structures de données - ce sont des variables et des listes. Parmi les algorithmes, il s'agit de trouver le nombre minimum (distance) dans la liste. Nous avons également besoin d'un algorithme qui détermine le nom de l'objet à poursuivre à la distance minimale.Beaucoup de code sera écrit maintenant. Mais pour ne pas se noyer et se perdre dans le tas de scripts plus tard, nous devons utiliser une autre fonction intéressante, à savoir la création de nos propres blocs. Cette fonction est très puissante, mais elle est rarement utilisée par les écoliers et certains programmeurs, et pourtant elle vous permet de créer un algorithme de programme compréhensible dès la première lecture. Soit dit en passant, vous pouvez découvrir les techniques de création de code compréhensible dans le livre de Martin Fowler «Refactoring. Amélioration du code existant »Comme pour toute construction à grande échelle, nous devons tout planifier. Planifions dans quel ordre nous développerons les blocs:- Une liste des noms de tous les navires,
- Calcul de la distance à tous les navires,
- Recherche de distance minimale
- Recherchez le nom du navire pour parcourir la distance minimale trouvée.
La règle principale est que chaque «pièce» créée et la modification doit être vérifiée.Afin de créer un algorithme généralisé, nous devons sacrifier quelque chose, par exemple, les noms originaux des sprites, nous devrons les normaliser et obtenir la disposition suivante.Et maintenant, nous sommes prêts à décrire 1 partie du programme. Nous écrivons tout pour le 1er navire. Exécutez ce script séparément et voyez le résultat. C'est parti!
Si nous ajoutons un nouveau navire, nous devons changer un seul chiffre dans cet algorithme. Cool Cool!Nous avons continué. Et apprenons-lui 2 algorithme. Nous regardons ce qui s'est passé. C'est immédiatement le résultat final avec les fonctions auxiliaires.
Hourra! Ça marche. Vous pouvez vérifier ceci comme suit, doit être 0 une des valeurs dans la liste des distances. Si ce n'est pas le cas, recherchez une erreur.On va plus loin! Recherchez la distance minimale. Remarqué que la distance est toujours positive. Et il y aura toujours un nombre minimum - 0. Ay-ya-yay! La conclusion est de rechercher un minimum, mais pas zéro. Vous pouvez essayer vous-même et optimiser le code vous-même, afin de ne pas calculer la distance du navire 1 au navire 1 (ce n'est pas une faute de frappe).
Nous formons le sprite de la nouvelle fonction et l'obtenons.
N'oubliez pas de vérifier! Pour ce faire, vous pouvez même arrêter le jeu et exécuter un script distinct.Nous avons écrit tout ce qui est nécessaire, maintenant l'essentiel est d'utiliser correctement ces fonctions.
Si tout fonctionne correctement pour vous, vous devriez voir ce qui suit:Remarqué que le vaisseau à «intelligence artificielle» est déchiré entre différents adversaires. Vous pouvez améliorer le programme et compliquer la prise de décision. Par exemple, s'il reste peu de vie au vaisseau poursuivi, alors il le termine, et s'il le trouve plus près et avec encore moins de santé, finissez d'abord le plus faible.Au fait, dans ce programme, vous pouvez réduire le nombre d'actions et améliorer les algorithmes. Tentez votre chance. Vous pouvez obtenir ce programme ici .Pour résumer
Ici, dans de tels cas, j'ai appris comment Scratch permet aux étudiants d'apprendre rapidement de nombreuses techniques de programmation réelles. Vous pouvez y parler du travail des sections critiques, des algorithmes généralisés, des variables et de leur portée, de la création de vos propres blocs et de la structuration de votre code. Et aussi dans cette langue, vous pouvez parler de compétences professionnelles, par exemple, la refactorisation.Ce n'est qu'une petite partie de la boîte à outils du programmeur, mais c'est très important. Et dans Scratch, cela devient un peu plus facile à expliquer. Source: https://habr.com/ru/post/fr399495/
All Articles