Scratch für den Advanced

Scratch ist eine visuell orientierte Programmiersprache für Kinder. Es gibt eine Meinung, dass dies eine Kindersprache ist, um nur „Programmieren“ zu spielen, und nichts Gutes daraus gemacht werden kann. Als ich anfing, Klassen für Kinder auf Scratch zu unterrichten, schien es mir eine Person mit zwei höheren technischen Ausbildungen zu sein. Nach einer Weile musste ich jedoch meine Meinung ändern. Es stellte sich heraus, dass es selbst in dieser Kinderprogrammiersprache versteckte Chips gibt, die auch beim Erlernen professioneller Programmierung ernsthaft verwendet werden können. Ich möchte meine Entdeckungen mit Ihnen teilen.

Klonen und Variablen in Scratch


Mein Jünger wie das Spiel - „Zombies vs. Plant“ . Und er war daran interessiert, es selbst zu programmieren. Erinnern wir uns, wie dieses Spiel funktioniert? Auf der rechten Seite haben wir eine Reihe von Pflanzen, die auf sich nähernde Zombies schießen.

Es gibt viele Lösungen für dieses Problem, aber meiner Meinung nach besteht eine elegantere Lösung darin, die minimal mögliche Anzahl von Sprites zu verwenden, d. H. Verwenden Sie das Klonen.

Wie kann jeder einzelne Klon seinen eigenen Lebensstandard haben? Was sind Variablen oder Listen auszuwählen? Sie versuchten, Listen zu verwenden, stellten jedoch nach einer detaillierteren Untersuchung fest, dass diese Datenstruktur nicht zur Lösung des Problems beiträgt. Variablen und Listen in Scratch haben zwei Arten der Sichtbarkeit für jeden Datentyp - dies ist "für alle Sprites".oder "nur für dieses Sprite . " Ich musste den Umfang überprüfen. Wir haben mit den Variablen begonnen.

Erreichen der Arbeitsversion der Variablen mit dem Gültigkeitsbereich "nur für dieses Sprite" . In klassischen Programmiersprachen wird diese Art der Sichtbarkeit je nach Kontext als lokal oder privat bezeichnet.

Das variabelste Leben in Kratzern


Wenn diese Variable mit diesem Bereich im Klon verwendet wird, wird im Klon eine Instanz der Variablen erstellt, die zum jeweiligen Klon gehört und für die internen Berechnungen / Operationen des Klons verwendet wird. In unserem Fall hat jeder Klon sein eigenes „Leben“. Wenn es interessant wurde, empfehle ich Ihnen, das Verzeichnis zu konsultieren . Und hier ist ein Bild, das zeigt, wie Sprites oder Klone mit Variablen unterschiedlicher Sichtbarkeit arbeiten.

Bereiche von Variablen und Listen in Scratch.  Und ihre Grenzen
Die Variable mit dem Gültigkeitsbereich für alle Sprites (das Bild links) ist eine für alle. Übrigens können Sie hier die Arbeit mit kritischen Abschnitten mit Kindern beobachten und sehen, was ein Wettlauf um eine Ressource ist. Und wenn der Gültigkeitsbereich der Variablen "nur für dieses Sprite" istDann haben das Sprite und seine Klone eine eigene Variable mit demselben Namen, mit dem sie arbeiten (Abbildung von rechts). Und die Klone haben keinen Zugriff auf die ursprüngliche Variable und die Variable eines anderen Klons.
Dies war eine unerwartete und angenehme Entdeckung der Eigenschaften von Scratch zum Erstellen solcher Algorithmen.

WICHTIG: Eine Variable ist ein sehr leistungsfähiges Werkzeug eines echten Programmierers, daher bringe ich Kindern sofort den richtigen Namen von Variablen bei, da diese Fähigkeit ihnen bei Projekten unterschiedlicher Komplexität hilft.

Namen von Objekten als Bezeichner


WICHTIG: Alle Variablen mit einer Sichtbarkeitszone "nur für dieses Sprite".

Dieses Tool war für mich völlig unerwartet. Beginnen wir mit einer Geschichte darüber, wie ein Schüler und ich auf diese Funktion der Sprache gestoßen sind. Mein Schüler hat beschlossen, ein Spiel mit „künstlicher Intelligenz“ zu entwickeln. Das Spiel repräsentiert Star Wars auf Raumschiffen und der Spieler hat die Fähigkeit, ein Schiff zu kontrollieren, während Gegner dich und einander jagen. Damit sie dich oder einander verfolgen können, müssen sie sich irgendwie entscheiden, wen sie verfolgen wollen. Dieses Problem kann in der Stirn gelöst werden und die Reihenfolge der Verfolgung von Schiffen festlegen, aber das Spiel verliert seine Intelligenz und wird schnell langweilig. Daher beschloss der Student, den Intellekt so anzupassen, dass Schiffe mit Intelligenz den nächsten Feind jagten. Mal sehen, wie er anfing, dieses Problem zu lösen.

Wackellösung zum Umschalten zwischen Sprites im Mindestabstand

Meiner Meinung nach eine gute Lösung für die Erstellung eines schnellen Prototyps. Aber was sind die Einschränkungen? Erstens die Komplexität des Codes beim Hinzufügen neuer Schiffe. Daher nimmt die Komplexität des Codes zu und Mutationen des Codes aufgrund der Komplexität werden nicht ausgeschlossen. Die Zeit für die Suche nach Fehlern und das Debuggen des Algorithmus wird länger. Und natürlich hat niemand eine so coole Metrik wie die Code-Alterung (SW-Entwicklung auf fortgeschrittenem Niveau) abgebrochen. Was tun? Und Sie müssen Folgendes tun: Sie müssen einen verallgemeinerten Algorithmus erstellen, der sich dynamisch anpasst, um die Anzahl der Schiffe zu erhöhen oder zu verringern.

Für diesen Algorithmus benötigen wir eine Spracheigenschaft - einen Namen als Bezeichner für ein Objekt. Es ist Zeit für große Veränderungen, und hier können Sie als Lehrer über so etwas wie Refactoring sprechen. Dies ist eine sequentielle Änderung des Codes, die dessen Struktur und Optimierung verbessert. Und vor allem, damit bei jeder Änderung das Programm nicht unterbrochen wird und der Änderungsbetrag ebenfalls sehr sorgfältig ausgewählt werden sollte. Zu viele Änderungen sind schlecht, zu wenige sind lang. Formierte Refactoring-Fähigkeiten geben dem Programmierer einen Vorteil und Effizienz. Aber für die Bildung der Fähigkeit müssen Sie mit Ihrem Kopf arbeiten und nicht nur herumstochern. Ich habe 4 Änderungen am ursprünglichen Programm vorgenommen und das Ergebnis hat sich nicht geändert.

Wir versuchen, die Lösung zu ändern und die Drehung in Richtung des Objekts nach Namen zu verwenden

Beachten Sie, dass ich Blöcke noch nicht gelöscht, aber verlassen habe. Warum? Denn wenn etwas schief geht, können wir die vorherige Option zurückgeben und von vorne beginnen. Sobald ich jedoch die korrekte Ausführung des aktualisierten Skripts überprüfe, werde ich sie sofort entfernen, um in Zukunft nicht von ihnen abgelenkt zu werden.

Hast du es bemerkt? Jetzt gibt es im Block "Turn to ..." eine Variable und dieses Ding funktioniert. Das heißt, Wir haben mit minimalem Aufwand überprüft, ob dieser Ansatz funktioniert. Das ist einfach großartig. Jetzt können wir Algorithmen schreiben, mit denen wir das Ziel der Verfolgung des nächsten Schiffes bestimmen können.

Was ist für uns nützlich? Dies ist aus Datenstrukturen - dies sind Variablen und Listen. Von den Algorithmen findet dies die minimale Anzahl (Entfernung) in der Liste. Wir brauchen auch einen Algorithmus, der den Namen des Objekts bestimmt, das in der Mindestentfernung verfolgt werden soll.

Es wird jetzt viel Code geschrieben. Aber um später nicht zu ertrinken und im Haufen der Skripte verwirrt zu werden, müssen wir eine andere coole Funktion verwenden, nämlich das Erstellen eigener Blöcke. Diese Funktion ist sehr leistungsfähig, wird jedoch nur selten von Schulkindern und einigen Programmierern verwendet und ermöglicht es Ihnen dennoch, einen Programmalgorithmus zu erstellen, der von der ersten Lesung an verständlich ist. Über die Techniken zum Erstellen von verständlichem Code können Sie übrigens in Martin Fowlers Buch „Refactoring. Bestehenden Code verbessern »

Wie bei jeder Großkonstruktion müssen wir alles planen. Planen wir, in welcher Reihenfolge wir die Blöcke entwickeln werden:

  1. Eine Liste der Namen aller Schiffe,
  2. Berechnung der Entfernung zu allen Schiffen,
  3. Suche nach Mindestentfernung
  4. Suchen Sie nach dem Namen des Schiffes, um die gefundene Mindestentfernung zu verfolgen.

Die Hauptregel ist, dass jedes erstellte „Stück“ und die Änderung überprüft werden müssen.

Um einen verallgemeinerten Algorithmus zu erstellen, müssen wir etwas opfern, zum Beispiel die ursprünglichen Namen der Sprites. Wir müssen sie standardisieren und das folgende Layout erhalten.

Sprite-Namen geändert

Und jetzt sind wir bereit, einen Teil des Programms zu beschreiben. Wir schreiben alles für das 1. Schiff. Führen Sie dieses Skript separat aus und sehen Sie das Ergebnis. Lass uns gehen!

Neuer Block: Füllen Sie die Liste der Schiffsnamen aus

Wenn wir ein neues Schiff hinzufügen, müssen wir in diesem Algorithmus nur eine Ziffer ändern. Cool Cool!

Wir fuhren weiter. Und lassen Sie uns ihm 2 Algorithmus beibringen. Wir schauen, was passiert ist. Dies ist sofort das Endergebnis mit Hilfsfunktionen.

Neuer Block: Füllen Sie die Liste der Entfernungen aus

Hurra! Es funktioniert. Sie können dies wie folgt überprüfen, muss 0 einer der Werte in der Liste der Entfernungen sein. Wenn dies nicht der Fall ist, suchen Sie nach einem Fehler.

Wir gehen weiter! Suche nach Mindestentfernung. Es wurde festgestellt, dass der Abstand immer positiv ist. Und es wird immer eine Mindestanzahl geben - 0. Ay-ya-yay! Die Schlussfolgerung ist, nach einem Minimum zu suchen, aber nicht nach Null. Sie können sich selbst versuchen und den Code optimieren, um die Entfernung von Schiff 1 zu Schiff 1 nicht zu berechnen (dies ist kein Tippfehler).

Finden Sie den Mindestwert, aber nicht Null

Wir trainieren das Sprite der neuen Funktion und bekommen.

Neuer Block: Finden Sie den Schiffsnamen nach Entfernung

Vergessen Sie nicht zu überprüfen! Dazu können Sie das Spiel sogar stoppen und ein separates Skript ausführen.

Wir haben alles Notwendige geschrieben, jetzt geht es hauptsächlich darum, diese Funktionen richtig zu nutzen.

Zusammengesetzter Algorithmus zur Bestimmung des nächsten Schiffes

Wenn alles für Sie richtig funktioniert, sollten Sie Folgendes sehen:



Bemerkt, dass das Schiff mit "künstlicher Intelligenz" zwischen verschiedenen Gegnern zerrissen ist. Sie können das Programm verbessern und die Entscheidungsfindung erschweren. Wenn das verfolgte Schiff zum Beispiel nur noch wenig Leben hat, beendet er es, und wenn er es näher und mit noch weniger Gesundheit gefunden hat, beendet er zuerst das schwächste.

Übrigens können Sie in diesem Programm die Anzahl der Aktionen reduzieren und die Algorithmen verbessern. Versuche deine Hand. Sie können dieses Programm hier erhalten .

Zusammenfassend



In solchen Fällen habe ich gelernt, wie Scratch es den Schülern ermöglicht, schnell viele echte Programmiertechniken zu erlernen. Darauf können Sie über die Arbeit kritischer Abschnitte, über verallgemeinerte Algorithmen, über Variablen und deren Umfang, über das Erstellen eigener Blöcke und das Strukturieren Ihres Codes sprechen. Und auch in dieser Sprache können Sie über berufliche Fähigkeiten sprechen, zum Beispiel Refactoring.

Dies ist nur ein kleiner Teil des Toolkits des Programmierers, aber sehr wichtig. Und in Scratch wird es etwas einfacher zu erklären.

Source: https://habr.com/ru/post/de399495/


All Articles