diff --git a/beispiel_aufgabensammlung.yaml b/beispiel_aufgabensammlung.yaml new file mode 100644 index 0000000..8da2137 --- /dev/null +++ b/beispiel_aufgabensammlung.yaml @@ -0,0 +1,29 @@ +name: "Beispiel-Aufgabensammlung" +protected: false +duration_minutes: 0 +public_listing: false +secret: "beispiel" +language: "blockly" + + +tasks: + "Einleitung: Bausteine zusammensetzen": + "training/training-intro": {stars: 4} + "Befehlsfolgen": + "training/training-sequence-marble": {stars: 4} + "Wiederholungen": + "Btraining/training-repeat-marble": {stars: 4} + "Muster malen": + "Btraining/training-repeat-paint": {stars: 4} + "Bedingte Anweisung": + "Btraining/training-repeat-if-paint": {stars: 4} + "Labyrinth": + "Btraining/training-repeat-if-obstacles": {stars: 4} + "Mehr Wiederholungen": + "Btraining/training-repeat-nested-marbles": {stars: 4} + "Zick-Zack": + "Btraining/training-repeat-nested-obstacles": {stars: 4} + "Murmeln finden": + "Btraining/training-repeat-nested-if-marbles": {stars: 4} + "Abschluss: Haus malen": + "Btraining/training-repeat-nested-if-paint": {stars: 4} diff --git a/training/training-intro/bedienung.jpg b/training/training-intro/bedienung.jpg new file mode 100644 index 0000000..88457eb Binary files /dev/null and b/training/training-intro/bedienung.jpg differ diff --git a/training/training-intro/ergebnis.jpg b/training/training-intro/ergebnis.jpg new file mode 100644 index 0000000..7a231d3 Binary files /dev/null and b/training/training-intro/ergebnis.jpg differ diff --git a/training/training-intro/geschwindigkeit.jpg b/training/training-intro/geschwindigkeit.jpg new file mode 100644 index 0000000..cf3a1e7 Binary files /dev/null and b/training/training-intro/geschwindigkeit.jpg differ diff --git a/training/training-intro/green.png b/training/training-intro/green.png new file mode 100644 index 0000000..dc5ef2a Binary files /dev/null and b/training/training-intro/green.png differ diff --git a/training/training-intro/green_robot.png b/training/training-intro/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-intro/green_robot.png differ diff --git a/training/training-intro/icon.png b/training/training-intro/icon.png new file mode 100644 index 0000000..271daad Binary files /dev/null and b/training/training-intro/icon.png differ diff --git a/training/training-intro/index.html b/training/training-intro/index.html new file mode 100644 index 0000000..d5012c7 --- /dev/null +++ b/training/training-intro/index.html @@ -0,0 +1,89 @@ + + + + + training-intro + + + + + + + + +
+

Beispielaufgabe

+ + + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll das grüne Feld erreichen, ohne gegen die Hindernisse zu laufen. +

+

+ Benutze dafür die Bausteine und hänge sie an den Startbaustein Roboter-Programm an. +

+

+ Klicke anschließend auf , um das Programm überprüfen zu lassen. +

+
+

Mit diesem Button startest du dein Programm.

+

Mit diesem Button setzt du den Roboter auf die Startposition zurück.

+

Mit diesem Button kannst du dein Programm Schritt für Schritt durchgehen.

+

Mit diesem Button wird direkt das Ergbenis deines Programms angezeigt.

+

Mit dem Schieberegler kannst du die Geschwindigkeit einstellen, mit der der Roboter das Programm ausführt.

+
+
+
+ Um den Roboter zu bewegen verwenden wir Funktionen, die uns zur Verfügung gestellt werden. In der ersten Zeile muss + immer stehen: +
+  from robot import *
+
+ Hier stehen uns die folgenden Funktionen (erkennbar an den runden Klammern) zur Verfügung: +
+  rechts() : bewegt den Roboter einen Schritt nach rechts
+
+
+  oben() : bewegt den Roboter einen Schritt nach oben
+
+
+
+
+
+
+
+ +
+ + diff --git a/training/training-intro/index_new.html b/training/training-intro/index_new.html new file mode 100644 index 0000000..5ce3aff --- /dev/null +++ b/training/training-intro/index_new.html @@ -0,0 +1,90 @@ + + + + + training-intro + + + + + + + + +
+

Einführung

+ + + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll das Feld mit der roten Flagge erreichen, ohne gegen die Hindernisse (Büsche) zu laufen. +

+

+ Benutze dafür die Bausteine und hänge sie an den Startbaustein . +

+

+ Klicke anschließend auf , um das Programm überprüfen zu lassen. +

+
+

Mit diesem Button startest du dein Programm.

+

Mit diesem Button setzt du den Roboter auf die Startposition zurück.

+

Mit diesem Button kannst du dein Programm Schritt für Schritt durchgehen.

+

Mit diesem Button wird direkt das Ergbenis deines Programms angezeigt.

+

Mit dem Schieberegler kannst du die Geschwindigkeit einstellen, mit der der Roboter das Programm ausführt.

+
+
+
+ Um den Roboter zu bewegen verwenden wir Funktionen, die uns zur Verfügung gestellt werden. + Jeder Befehl muss in einer eigenen Zeile stehen. In der ersten Zeile muss + immer stehen: +
+  from robot import *
+
+ Hier stehen uns die folgenden Funktionen (erkennbar an den runden Klammern) zur Verfügung: +
+  rechts() : bewegt den Roboter einen Schritt nach rechts
+
+
+  oben() : bewegt den Roboter einen Schritt nach oben
+
+
+
+
+
+
+
+ +
+ + diff --git a/training/training-intro/neustart.jpg b/training/training-intro/neustart.jpg new file mode 100644 index 0000000..5bf06b3 Binary files /dev/null and b/training/training-intro/neustart.jpg differ diff --git a/training/training-intro/obstacle.png b/training/training-intro/obstacle.png new file mode 100644 index 0000000..6484b46 Binary files /dev/null and b/training/training-intro/obstacle.png differ diff --git a/training/training-intro/play.jpg b/training/training-intro/play.jpg new file mode 100644 index 0000000..5f1f2af Binary files /dev/null and b/training/training-intro/play.jpg differ diff --git a/training/training-intro/schritte.jpg b/training/training-intro/schritte.jpg new file mode 100644 index 0000000..b1c138d Binary files /dev/null and b/training/training-intro/schritte.jpg differ diff --git a/training/training-intro/start.png b/training/training-intro/start.png new file mode 100644 index 0000000..017c431 Binary files /dev/null and b/training/training-intro/start.png differ diff --git a/training/training-intro/task.js b/training/training-intro/task.js new file mode 100644 index 0000000..7b62316 --- /dev/null +++ b/training/training-intro/task.js @@ -0,0 +1,58 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0 }, + obstacle: { num: 2, img: "obstacle.png", side: cellSide, category: "obstacle", isObstacle: true }, + green: { num: 3, img: "green.png", side: cellSide, category: "paint", isObstacle: false, hasColor: true, color: "vert" } + }, + maxInstructions: 6, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "north"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: [] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + groupByCategory: false, + includedAll: false, + includedCategories: [ ], + includedBlocks: [], + checkEndEveryTurn: true, + checkEndCondition: robotEndConditions.checkReachGreenArea, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 1, 1, 1, 2], + [2, 1, 1, 2, 2, 1, 1, 2], + [2, 1, 1, 2, 1, 3, 1, 2], + [2, 1, 1, 1, 1, 2, 1, 2], + [2, 1, 1, 1, 1, 1, 1, 2], + [2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 4, col: 3, dir: 0, type: "green_robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); +} + +initWrapper(initTask, null, null, true); + diff --git a/training/training-intro/task.yaml b/training/training-intro/task.yaml new file mode 100644 index 0000000..3523fdd --- /dev/null +++ b/training/training-intro/task.yaml @@ -0,0 +1,10 @@ +name: "Bausteine zusammensetzen" +standalone: true +public_listing: true + +languages: + - blockly + - python + +tags: + - Einleitung diff --git a/training/training-intro/task_new.js b/training/training-intro/task_new.js new file mode 100644 index 0000000..3974284 --- /dev/null +++ b/training/training-intro/task_new.js @@ -0,0 +1,58 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "course", + actionDelay: 200, + //itemTypes: { + //green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isRobot: true, offsetX: -14, zOrder: 2, team: 0 }, + //obstacle: { num: 2, img: "grey_brick_wall.png", side: cellSide, isObstacle: true }, + //green: { num: 3, img: "green.png", side: cellSide, category: "paint", isObstacle: false, hasColor: true, color: "vert" } + //}, + maxInstructions: 6, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "north"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: [] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + groupByCategory: false, + includedAll: false, + includedCategories: [], + includedBlocks: [], + checkEndEveryTurn: true, + }; + + subTask.data = { + hard: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 1, 1, 1, 2], + [2, 1, 1, 2, 2, 1, 1, 2], + [2, 1, 1, 2, 1, 3, 1, 2], + [2, 1, 1, 1, 1, 2, 1, 2], + [2, 1, 1, 1, 1, 1, 1, 2], + [2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 4, col: 3, type: "robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); +} + +initWrapper(initTask, ["hard"], "hard", true); + diff --git a/training/training-intro/temp2.gif b/training/training-intro/temp2.gif new file mode 100644 index 0000000..40a8347 Binary files /dev/null and b/training/training-intro/temp2.gif differ diff --git a/training/training-repeat-if-obstacles/Hindernis.png b/training/training-repeat-if-obstacles/Hindernis.png new file mode 100644 index 0000000..a233acd Binary files /dev/null and b/training/training-repeat-if-obstacles/Hindernis.png differ diff --git a/training/training-repeat-if-obstacles/example_if.png b/training/training-repeat-if-obstacles/example_if.png new file mode 100644 index 0000000..46fc58e Binary files /dev/null and b/training/training-repeat-if-obstacles/example_if.png differ diff --git a/training/training-repeat-if-obstacles/example_if_else.png b/training/training-repeat-if-obstacles/example_if_else.png new file mode 100644 index 0000000..191423c Binary files /dev/null and b/training/training-repeat-if-obstacles/example_if_else.png differ diff --git a/training/training-repeat-if-obstacles/green.png b/training/training-repeat-if-obstacles/green.png new file mode 100644 index 0000000..dc5ef2a Binary files /dev/null and b/training/training-repeat-if-obstacles/green.png differ diff --git a/training/training-repeat-if-obstacles/green_robot.png b/training/training-repeat-if-obstacles/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-repeat-if-obstacles/green_robot.png differ diff --git a/training/training-repeat-if-obstacles/icon.png b/training/training-repeat-if-obstacles/icon.png new file mode 100644 index 0000000..23c221a Binary files /dev/null and b/training/training-repeat-if-obstacles/icon.png differ diff --git a/training/training-repeat-if-obstacles/index.html b/training/training-repeat-if-obstacles/index.html new file mode 100644 index 0000000..b297155 --- /dev/null +++ b/training/training-repeat-if-obstacles/index.html @@ -0,0 +1,102 @@ + + + + + training-repeat-if-obstacles + + + + + + + + +
+

Hindernisse umgehen

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll das grüne Feld erreichen, ohne gegen die Hindernisse zu laufen. +

+
+
+

+ Um zu testen, ob sich vor dem Roboter ein Hindernis befindet, benutze + den Baustein falls. + die if-Kontrollanweisung. +

+

Um zum Beispiel den Roboter nach unten zu bewegen, falls sich rechts von ihm ein Hindernis befindet, kannst du schreiben:

+

+ +

+

+ +

+
+ if hindernisRechts():
+    unten()
+
+
+
+

+ Um zu testen, ob sich von dem Roboter ein Hindernis befindet, benutze + den Baustein falls - sonst. + die if/else-Kontrollanweisung. +

+

Um zum Beispiel den Roboter nach unten zu bewegen, falls sich rechts von ihm ein Hindenis befindet, und ihn andernfalls nach oben zu bewegen, kannst du schreiben:

+

+ +

+

+ +

+
+ if hindernisRechts():
+    unten()
+ else:
+    oben()
+
+
+
+

Das grüne Feld ist 16 Felder rechts vom Roboter.

+

Das grüne Feld ist 24 Schritte vom Roboter entfernt.

+
+
+
+
+ +
+ + + diff --git a/training/training-repeat-if-obstacles/index_new.html b/training/training-repeat-if-obstacles/index_new.html new file mode 100644 index 0000000..77cd8b8 --- /dev/null +++ b/training/training-repeat-if-obstacles/index_new.html @@ -0,0 +1,133 @@ + + + + + + training-repeat-if-obstacles + + + + + + + + +
+

Hindernisse umgehen

+ + + + + +
+
+
+ Programmiere den Roboter: +

+ Der Roboter soll die Flagge erreichen, ohne gegen die Hindernisse zu laufen. +

+

+ Bitte schau dir vorab die Erläuterungen der Bausteine unter "weitere Hinweise" an. +

+

+ Bitte schau dir vorab die Erläuterungen unter "weitere Hinweise" an. +

+
+

Weitere Hinweise:

+
+
+

+ Um zu testen, ob sich rechts vom Roboter ein Hindernis befindet, benutze den Baustein . +

+

Um zum Beispiel den Roboter nach unten zu bewegen, falls sich rechts von ihm ein Hindernis + befindet, kannst du schreiben:

+

+
+
+

Um zum Beispiel den Roboter nach unten zu bewegen, falls sich rechts von ihm ein Hindenis + befindet, und ihn andernfalls nach oben zu bewegen, kannst du schreiben:

+

+ +

+
+
+
+
+

+ Um zu testen, ob sich vor dem Roboter ein Hindernis befindet, benutze die if-Kontrollanweisung. +

+

Um zum Beispiel den Roboter nach unten zu bewegen, falls sich rechts von ihm ein Hindernis + befindet, kannst du schreiben:

+
+if hindernisRechts():
+    unten()
+        
+
+
+

+ Um zu testen, ob sich vor dem Roboter ein Hindernis befindet, benutze die if/else-Kontrollanweisung. +

+

Um zum Beispiel den Roboter nach unten zu bewegen, falls sich rechts von ihm ein Hindenis + befindet, und ihn andernfalls nach oben zu bewegen, kannst du schreiben:

+
+if hindernisRechts():
+    unten()
+else:
+    oben()
+        
+
+
+

+ Um mehr als eine Bedingung zu prüfen, benutze die if/elif/else-Kontrollanweisung. +

+
+if hindernisRechts():
+    unten()
+elif hindernisOben():
+    rechts()
+else:
+    oben()
+                                
+

+ Wenn ein Hinternis rechts ist, dann geht der Roboter nach unten. Da eine Bedingung "True" war, wird der elif Fall nicht überprüft. Wenn aber kein Hindernis rechts ist, dann wird überprüft, ob ein Hindernis oben ist. Je nachdem, ob dies "True" oder "False" ist, wir der elif oder der else Block ausgeführt.
+ Der else Block wird also nur ausgeführt, wenn keine der Bedingungen "True" war. +

+
+
+
+

Die Flagge ist 16 Felder rechts vom Roboter.

+

Die Flagge ist 24 Schritte vom Roboter entfernt.

+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/training/training-repeat-if-obstacles/obstacle.png b/training/training-repeat-if-obstacles/obstacle.png new file mode 100644 index 0000000..51445c1 Binary files /dev/null and b/training/training-repeat-if-obstacles/obstacle.png differ diff --git a/training/training-repeat-if-obstacles/task.js b/training/training-repeat-if-obstacles/task.js new file mode 100644 index 0000000..5cc980a --- /dev/null +++ b/training/training-repeat-if-obstacles/task.js @@ -0,0 +1,105 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0 }, + obstacle: { num: 2, img: "obstacle.png", side: cellSide, category: "obstacle", isObstacle: true }, + green: { num: 3, img: "green.png", side: cellSide, category: "paint", isObstacle: false, hasColor: true, color: "vert"}, + }, + maxInstructions: 10, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: { + shared: ["east", "north", "south", "obstacleEast"], + easy: [], + medium: [], + hard: ["obstacleNorth", "obstacleSouth"] + } + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: { + shared: ["controls_repeat", "controls_if"], + easy: [], + medium: ["controls_if_else"], + hard: ["controls_if_else"] + } + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkReachGreenArea, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 7, col: 1, dir: 0, type: "green_robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 9, col: 1, dir: 0, type: "green_robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2], + [2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 5, col: 1, dir: 0, type: "green_robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; + +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); + diff --git a/training/training-repeat-if-obstacles/task_new.js b/training/training-repeat-if-obstacles/task_new.js new file mode 100644 index 0000000..3f54066 --- /dev/null +++ b/training/training-repeat-if-obstacles/task_new.js @@ -0,0 +1,110 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + //cellSide: cellSide, + conceptViewer: false, + contextType: "course", + actionDelay: 200, + //itemTypes: { + // green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0 }, + // obstacle: { num: 2, img: "obstacle.png", side: cellSide, category: "obstacle", isObstacle: true }, + // green: { num: 3, img: "green.png", side: cellSide, category: "paint", isObstacle: false, hasColor: true, color: "vert"}, + //}, + maxInstructions: 10, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: { + shared: ["east", "north", "south", "obstacleEast"], + easy: [], + medium: [], + hard: ["obstacleNorth", "obstacleSouth"] + } + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: { + shared: ["controls_repeat", "controls_if"], + easy: [], + medium: ["controls_if_else"], + hard: ["controls_if_else"] + } + }, + pythonAdditionalFunctions: { + shared: ["range"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + //checkEndCondition: robotEndConditions.checkReachExit, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 7, col: 1, type: "robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 9, col: 1, type: "robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2], + [2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 5, col: 1, type: "robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; + +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); + diff --git a/training/training-repeat-if-paint/example_if.png b/training/training-repeat-if-paint/example_if.png new file mode 100644 index 0000000..158f613 Binary files /dev/null and b/training/training-repeat-if-paint/example_if.png differ diff --git a/training/training-repeat-if-paint/example_if_2.png b/training/training-repeat-if-paint/example_if_2.png new file mode 100644 index 0000000..1f00f13 Binary files /dev/null and b/training/training-repeat-if-paint/example_if_2.png differ diff --git a/training/training-repeat-if-paint/example_if_else.png b/training/training-repeat-if-paint/example_if_else.png new file mode 100644 index 0000000..d56c1a0 Binary files /dev/null and b/training/training-repeat-if-paint/example_if_else.png differ diff --git a/training/training-repeat-if-paint/green_robot.png b/training/training-repeat-if-paint/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-repeat-if-paint/green_robot.png differ diff --git a/training/training-repeat-if-paint/icon.png b/training/training-repeat-if-paint/icon.png new file mode 100644 index 0000000..66a789c Binary files /dev/null and b/training/training-repeat-if-paint/icon.png differ diff --git a/training/training-repeat-if-paint/index.html b/training/training-repeat-if-paint/index.html new file mode 100644 index 0000000..c59fec2 --- /dev/null +++ b/training/training-repeat-if-paint/index.html @@ -0,0 +1,158 @@ + + + + + + training-repeat-if-paint + + + + + + + + + +
+

Markierte Felder bemalen

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll alle markierten Felder färben. +

+
+

+ Es gibt immer zwei markierte Felder übereinander. Dein Roboter muss beide Felder färben, bevor er in die nächste Spalte geht. +

+
+
+

+ Mit + dem Baustein falls, + kannst du prüfen, ob das aktuelle Feld, auf dem der Roboter steht markiert ist, um es dann ggf. zu färben: +

+

+ +

+

+ +

+
+
+

+ Mit + der if-Kontrollanweisung, + kannst du prüfen, ob das aktuelle Feld, auf dem der Roboter steht markiert ist, um es dann ggf. zu färben: +

+
+  if feldMarkiert():
+     bemale()
+
+
+
+
+
+

+ Vergiss nicht, dass du mehrere Anweisungen in + einen falls-Baustein, + einfügen kannst: +

+

+ +

+

+ +

+
+
+

+ Vergiss nicht, dass du mehrere Anweisungen in + eine if-Kontrollanweisung, + einfügen kannst: +

+
+if feldMarkiert():
+   bemale()
+   rechts()
+
+

+ Alle Befehle die nach dem Doppelpunkt eingerückt in Zeilen stehen werden ausgeführt, falls die Bedingung "True" ist. In diese Fall also: Wenn das Feld markiert ist, + dann bemahlt der Roboter das Feld und geht einen Schritt nach rechts. +

+
+
+
+
+

+ Du kannst + den Baustein falls- sonst + benutzen um verschiedene Anweisung ausführen zu lassen, je nachdem ob das Feld markiert ist oder nicht. +

+

+ +

+

+ +

+
+
+

+ Du kannst + die if/else-Kontrollanweisung + benutzen um verschiedene Anweisung ausführen zu lassen, je nachdem ob das Feld markiert ist oder nicht. +

+
+if feldMarkiert():
+   markiere()
+else:
+   oben()
+              
+

+ Alle Befehle, die in der if- bzw. if/else-Kontrollstruktur ausgeführt werden sollen, + müssen eingerückt werden. +

+
+
+
+

Insgesamt muss sich der Roboter 14 mal nach rechts bewegen, um die letzte Markierung zu erreichen.

+
+
+
+
+ +
+ + + diff --git a/training/training-repeat-if-paint/index_new.html b/training/training-repeat-if-paint/index_new.html new file mode 100644 index 0000000..db71b77 --- /dev/null +++ b/training/training-repeat-if-paint/index_new.html @@ -0,0 +1,165 @@ + + + + + + training-repeat-if-paint + + + + + + + + + +
+

Markierte Felder bemalen

+ + + + + +
+
+
+ Programmiere den Roboter: +

+ Der Roboter soll alle markierten Felder färben. +

+
+

Es gibt immer zwei markierte Felder übereinander. Dein Roboter muss beide Felder färben, bevor er in die + nächste Spalte geht. +

+
+

+ Bitte schau dir vorab die Erläuterungen der Bausteine unter "weitere Hinweise" an. +

+

+ Bitte schau dir vorab die Erläuterungen unter "weitere Hinweise" an. +

+
+

Weitere Hinweise:

+
+
+

+ Mit + dem Baustein falls, + kannst du prüfen, ob das aktuelle Feld, auf dem der Roboter steht markiert ist, um es dann ggf. zu + färben: +

+

+ +

+

+ +

+
+
+

+ Mit der if-Kontrollanweisung, kannst du eine Fallunterscheidung machen. +

+
+  if aufMarkierung():
+     bemale()
+
+ Wenn der Roboter auf einer Markierung steht, dann wird die Funktion bemale() augerufen. Wenn der Roboter nicht auf einer Markierung steht, dann passiert nichts. +
+
+
+
+

+ Du kannst auch mehrere Anweisungen in + einen falls-Baustein, + einfügen: +

+

+ +

+

+ +

+
+
+

+ Vergiss nicht, dass du mehrere Anweisungen in + eine if-Kontrollanweisung, einfügen kannst: +

+
+if feldMarkiert():
+   bemale()
+   rechts()
+
+

+ Alle Befehle die nach dem Doppelpunkt eingerückt stehen, werden ausgeführt, falls die Bedingung + "True" ist. In diese Fall also: Wenn das Feld markiert ist, dann bemahlt der Roboter das Feld und geht einen Schritt nach rechts. +

+
+
+
+
+

+ Du kannst + den Baustein falls- sonst + benutzen um verschiedene Anweisung ausführen zu lassen, je nachdem ob das Feld markiert ist oder nicht. +

+

+ +

+

+ +

+
+
+

+ Du kannst + die if/else-Kontrollanweisung benutzen um verschiedene Anweisung ausführen zu lassen, je nachdem ob das Feld markiert ist oder nicht. +

+
+if feldMarkiert():
+   markiere()
+else:
+   oben()
+              
+

+ Alle Befehle, die in dem if Block stehen, werden ausgeführt, wenn die Bedingung "True" ist. Das else ist quasi das "sonst" und hat somit keine eigene Bedingung. Die Befehle in diesem Block werden genau dann ausgeführt, wenn die Bedingung hinter dem if "False" war. +

+
+
+
+

Insgesamt muss sich der Roboter 14 mal nach rechts bewegen, um die letzte Markierung zu erreichen.

+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/training/training-repeat-if-paint/marker.png b/training/training-repeat-if-paint/marker.png new file mode 100644 index 0000000..efd3457 Binary files /dev/null and b/training/training-repeat-if-paint/marker.png differ diff --git a/training/training-repeat-if-paint/paint.png b/training/training-repeat-if-paint/paint.png new file mode 100644 index 0000000..32e9406 Binary files /dev/null and b/training/training-repeat-if-paint/paint.png differ diff --git a/training/training-repeat-if-paint/task.js b/training/training-repeat-if-paint/task.js new file mode 100644 index 0000000..9618e70 --- /dev/null +++ b/training/training-repeat-if-paint/task.js @@ -0,0 +1,94 @@ +function initTask(subTask) { +var cellSide = 60; + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + paint: { img: "paint.png", side: cellSide, category: "paint", isPaint: true, isObstacle: false, hasColor: true, color: "gris", zOrder: 1 }, + marker: { num: 2, img: "marker.png", side: cellSide, category: "marker", isObstacle: false, isMarker: true, hasColor: true, color: "marker", zOrder: 0 } + + }, + maxInstructions: 18, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "north", "south", "paint", "markedCell"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: { + shared: ["controls_repeat", "controls_if"], + easy: [], + medium: [], + hard: ["controls_if_else"] + } + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarkersPainted, + computeGrade: function(context, message) { + var rate = 0; + if (context.success) { + rate = 1; + } + return { + successRate: rate, + message: message + }; + } + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 0, dir: 0, type: "green_robot" } + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1], + [1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 2, col: 0, dir: 0, type: "green_robot" } + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 2, col: 0, dir: 0, type: "green_robot" } + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); + diff --git a/training/training-repeat-if-paint/task_new.js b/training/training-repeat-if-paint/task_new.js new file mode 100644 index 0000000..bc1604c --- /dev/null +++ b/training/training-repeat-if-paint/task_new.js @@ -0,0 +1,93 @@ +function initTask(subTask) { +var cellSide = 60; + subTask.gridInfos = { + hideSaveOrLoad: true, + //cellSide: cellSide, + actionDelay: 200, + conceptViewer: false, + contextType: "paint", + maxInstructions: 18, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "north", "south", "dropObject", "onContainer"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: { + shared: ["controls_repeat", "controls_if"], + easy: [], + medium: [], + hard: ["controls_if_else"] + } + }, + pythonAdditionalFunctions: { + shared: ["range"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + //checkEndCondition: robotEndConditions.checkMarkersPainted, + computeGrade: function(context, message) { + var rate = 0; + if (context.success) { + rate = 1; + } + return { + successRate: rate, + message: message + }; + } + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 0, type: "robot" } + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1], + [1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 2, col: 0, type: "robot" } + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 2, col: 0, type: "robot" } + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); + diff --git a/training/training-repeat-marble/example_repeat_1.jpg b/training/training-repeat-marble/example_repeat_1.jpg new file mode 100644 index 0000000..a84ccd0 Binary files /dev/null and b/training/training-repeat-marble/example_repeat_1.jpg differ diff --git a/training/training-repeat-marble/example_repeat_2.jpg b/training/training-repeat-marble/example_repeat_2.jpg new file mode 100644 index 0000000..4e384e1 Binary files /dev/null and b/training/training-repeat-marble/example_repeat_2.jpg differ diff --git a/training/training-repeat-marble/green_robot.png b/training/training-repeat-marble/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-repeat-marble/green_robot.png differ diff --git a/training/training-repeat-marble/hole.png b/training/training-repeat-marble/hole.png new file mode 100644 index 0000000..aa407b6 Binary files /dev/null and b/training/training-repeat-marble/hole.png differ diff --git a/training/training-repeat-marble/icon.png b/training/training-repeat-marble/icon.png new file mode 100644 index 0000000..ca549df Binary files /dev/null and b/training/training-repeat-marble/icon.png differ diff --git a/training/training-repeat-marble/index.html b/training/training-repeat-marble/index.html new file mode 100644 index 0000000..d1952ef --- /dev/null +++ b/training/training-repeat-marble/index.html @@ -0,0 +1,122 @@ + + + + + + training-repeat-marble + + + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Er soll die Murmel in das Loch legen. +

+
+

+ Benutze dafür den Baustein wiederhole, der es dir erlaubt, + eine Anweisung mehrfach hintereinander auszuführen. +

+
+

Statt zum Beispiel fünfmal den gleichen Baustein zu verwenden,

+

+

kannst du auch den Baustein wiederhole 5 mal verwenden:

+

+

+

Um die Anzahl der Wiederholungen zu ändern, kannst du auf die Zahl im Baustein klicken und eine neue Zahl mit der Tastatur eingeben.

+
+
+

+ Benutze dafür die Wiederholungsanweisung for, die + dir erlaubt, eine oder mehrere Anweisungen mehrfach hintereinander auszuführen. +

+

Statt zum Beispiel fünfmal den gleichen Befehl zu schreiben:

+
+  rechts()
+  rechts()
+  rechts()
+  rechts()
+  rechts()
+
+

benutze die Wiederholungsanweisung for:

+
+  for loop in range(5):
+    rechts()
+
+

+ Die Zahl in der Klammer gibt die Anzahl der Wiederholungen an. Alle Befehle, die in der Wiederholungsanweisung ausgeführt + werden sollen, müssen eingerückt werden. Dies kannst du mit einem oder mehreren Leerzeichen oder einem oder mehreren + Tabulatoren tun. Wichtig ist hierbei, dass du immer die gleiche Enrücktiefe verwendest und den Doppelpunkt nicht vergisst. + Die Einrückungen sind wichtig, da sie Anzeigen welche Befehle zu welchem Block gehören. + So geht der Roboter zum Beispiel mit den folgenden Anweisungen +

+
+  for loop in range(5):
+    rechts()
+  links()
+
+

+ erst fünf Schritte nach rechts und dann einen nach links. Der Roboter bewegt sich komplett anders, wenn die Anweisungen so + eingerückt sind: +

+
+  for loop in range(5):
+    rechts()
+    links()
+
+

+ Und zwar führt der Roboter hier 5 Mal folgende Bewegung aus: einen Schritt nach rechts und direkt wieder einen Schritt nach + links. Insgesamt bleibt er also auf der Stelle stehen. +

+ +
+
+
+
+
+
+ +
+ + + diff --git a/training/training-repeat-marble/index_new.html b/training/training-repeat-marble/index_new.html new file mode 100644 index 0000000..d703bed --- /dev/null +++ b/training/training-repeat-marble/index_new.html @@ -0,0 +1,134 @@ + + + + + + training-repeat-marble + + + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+ Programmiere den Roboter: +

+ Der Roboter soll die Murmel in das Loch legen. +

+

+ Bitte schau dir vorab die Erläuterungen der Bausteine unter "weitere Hinweise" an. +

+

+ Bitte schau dir vorab die Erläuterungen unter "weitere Hinweise" an. +

+
+
+

Weitere Hinweise:

+

Mit dem Baustein wiederhole, kannst du eine Anweisung mehrfach hintereinander ausführen.

+

Statt zum Beispiel fünfmal den gleichen Baustein zu verwenden,

+

+

kannst du auch den Baustein wiederhole + verwenden:

+

+

+

Um die Anzahl der Wiederholungen zu ändern, kannst du auf die Zahl im Baustein klicken und eine neue Zahl + mit der Tastatur eingeben.

+
+
+

+ Benutze dafür die Wiederholungsanweisung for, die + dir erlaubt, eine oder mehrere Anweisungen mehrfach hintereinander auszuführen. +

+

Statt zum Beispiel fünfmal den gleichen Befehl zu schreiben:

+
+  rechts()
+  rechts()
+  rechts()
+  rechts()
+  rechts()
+
+

benutze die Wiederholungsanweisung for:

+
+  for loop in range(5):
+    rechts()
+
+

+ Die Zahl in der Klammer gibt die Anzahl der Wiederholungen an. Alle Befehle, die in der + Wiederholungsanweisung ausgeführt + werden sollen, müssen eingerückt werden. Dies kannst du mit einem oder mehreren Leerzeichen oder einem + oder mehreren + Tabulatoren tun. Wichtig ist hierbei, dass du immer die gleiche Einrücktiefe verwendest und den Doppelpunkt + nicht vergisst. + Die Einrückungen sind wichtig, da sie anzeigen welche Befehle zu welchem Block gehören. + So geht der Roboter zum Beispiel mit den folgenden Anweisungen +

+
+  for loop in range(5):
+    rechts()
+  links()
+
+

+ erst fünf Schritte nach rechts und dann einen nach links. Der Roboter bewegt sich komplett anders, wenn + die Anweisungen so + eingerückt sind: +

+
+  for loop in range(5):
+    rechts()
+    links()
+
+

+ Und zwar führt der Roboter hier 5 Mal folgende Bewegung aus: einen Schritt nach rechts und direkt wieder + einen Schritt nach + links. Insgesamt bleibt er also auf der Stelle stehen. +

+ +
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/training/training-repeat-marble/marble.png b/training/training-repeat-marble/marble.png new file mode 100644 index 0000000..990bfd6 Binary files /dev/null and b/training/training-repeat-marble/marble.png differ diff --git a/training/training-repeat-marble/task.js b/training/training-repeat-marble/task.js new file mode 100644 index 0000000..1e10442 --- /dev/null +++ b/training/training-repeat-marble/task.js @@ -0,0 +1,81 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + hole: { num: 2, img: "hole.png", side: cellSide, category: "hole", isObstacle: false, isHole: true, zOrder: 0 }, + marble: { num: 3, img: "marble.png", side: cellSide, category: "marble", isObstacle: false, isTransportable: true, zOrder: 1 }, + }, + maxInstructions: 12, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "south", "pickTransportable", "dropTransportable"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarblesInHoles, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 1, dir: 0, type: "green_robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 7, dir: 0, type: "green_robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 7, col: 0, dir: 0, type: "green_robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); diff --git a/training/training-repeat-marble/task_new.js b/training/training-repeat-marble/task_new.js new file mode 100644 index 0000000..f511d81 --- /dev/null +++ b/training/training-repeat-marble/task_new.js @@ -0,0 +1,86 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "marbles", + //cellSide: cellSide, + actionDelay: 200, + //itemTypes: { + // green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + // hole: { num: 2, img: "hole.png", side: cellSide, category: "hole", isObstacle: false, isHole: true, zOrder: 0 }, + // marble: { num: 3, img: "marble.png", side: cellSide, category: "marble", isObstacle: false, isTransportable: true, zOrder: 1 }, + //}, + maxInstructions: 12, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "south", "withdrawObject", "dropObject"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + pythonAdditionalFunctions: { + shared: ["range"] + } + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + //checkEndCondition: robotEndConditions.checkMarblesInHoles, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 1, type: "robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 7, type: "robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 7, col: 0, type: "robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); diff --git a/training/training-repeat-nested-if-marbles/auf_fisch.png b/training/training-repeat-nested-if-marbles/auf_fisch.png new file mode 100644 index 0000000..673559a Binary files /dev/null and b/training/training-repeat-nested-if-marbles/auf_fisch.png differ diff --git a/training/training-repeat-nested-if-marbles/auf_insel.png b/training/training-repeat-nested-if-marbles/auf_insel.png new file mode 100644 index 0000000..28bb868 Binary files /dev/null and b/training/training-repeat-nested-if-marbles/auf_insel.png differ diff --git a/training/training-repeat-nested-if-marbles/auf_loch.png b/training/training-repeat-nested-if-marbles/auf_loch.png new file mode 100644 index 0000000..9395bc1 Binary files /dev/null and b/training/training-repeat-nested-if-marbles/auf_loch.png differ diff --git a/training/training-repeat-nested-if-marbles/auf_murmel.png b/training/training-repeat-nested-if-marbles/auf_murmel.png new file mode 100644 index 0000000..42d719a Binary files /dev/null and b/training/training-repeat-nested-if-marbles/auf_murmel.png differ diff --git a/training/training-repeat-nested-if-marbles/green_robot.png b/training/training-repeat-nested-if-marbles/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-repeat-nested-if-marbles/green_robot.png differ diff --git a/training/training-repeat-nested-if-marbles/hole.png b/training/training-repeat-nested-if-marbles/hole.png new file mode 100644 index 0000000..aa407b6 Binary files /dev/null and b/training/training-repeat-nested-if-marbles/hole.png differ diff --git a/training/training-repeat-nested-if-marbles/icon.png b/training/training-repeat-nested-if-marbles/icon.png new file mode 100644 index 0000000..7f6505c Binary files /dev/null and b/training/training-repeat-nested-if-marbles/icon.png differ diff --git a/training/training-repeat-nested-if-marbles/index.html b/training/training-repeat-nested-if-marbles/index.html new file mode 100644 index 0000000..6aa1617 --- /dev/null +++ b/training/training-repeat-nested-if-marbles/index.html @@ -0,0 +1,80 @@ + + + + + + training-repeat-nested-if-marbles + + + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll jede Murmel aufheben und in einem Loch ablegen. +

+

+ Der Roboter kann höchstens eine Murmel auf einmal tragen. +

+
+
+

+ Verwende den Baustein wiederhole. + Verwende den Baustein falls, um zu testen ob auf dem aktuellen Feld eine Murmel liegt oder ob sich auf dem aktuellen Feld ein Loch befindet. +

+

+ Verwende Baustein wiederhole ineinander verschachtelt. + Verwende den Baustein falls, um zu testen ob auf dem aktuellen Feld eine Murmel liegt oder ob sich auf dem aktuellen Feld ein Loch befindet. +

+
+

Der Roboter darf nicht versuchen, eine Murmel abzulegen, wenn er gar keine Murmel transportiert. Der Roboter hat keine Sensoren um zu prüfen, ob er eine Murmel transportiert. Er hat auch kein Gedächtnis, mit + dem er sich merken könnte, ob er bereits eine Murmel aufgehoben hat. Du musst du dir also etwas anderes überlegen.

+
+
+
+
+
+ +
+ + + diff --git a/training/training-repeat-nested-if-marbles/index_new.html b/training/training-repeat-nested-if-marbles/index_new.html new file mode 100644 index 0000000..2209f21 --- /dev/null +++ b/training/training-repeat-nested-if-marbles/index_new.html @@ -0,0 +1,116 @@ + + + + + + training-repeat-nested-if-marbles + + + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+ Programmiere den Roboter: +

+ Der Roboter soll jeden Fisch aufheben und auf einer Insel ablegen. +

+

+ Der Roboter kann höchstens einen Fisch auf einmal tragen. +

+
+

+ Bitte schau dir vorab die Erläuterungen unter "weitere Hinweise" an. +

+
+
+
+
+

Weitere Hinweise:

+
+

+ Mit dem Baustein kannst du prüfen, ob auf dem + Feld des Roboters ein Fisch liegt. +

+

+ Mit dem Baustein kannst du prüfen, ob der Roboter auf einer Insel steht. +

+
+
+

+ Der Roboter darf nicht versuchen, einen Fisch abzulegen, wenn er gar keinen Fisch + transportiert. Der Roboter hat keine Sensoren um zu prüfen, ob er einen Fisch transportiert. Er hat + auch kein Gedächtnis, mit dem er sich merken könnte, ob er bereits einen Fisch gefangen hat. Du + musst du dir also etwas + anderes überlegen. +

+
+
+
+
+
+

Weitere Hinweise:

+
+

+ Mit der Funktion aufFisch() kannst du prüfen, ob auf dem Feld des Roboters ein Fisch liegt. +

+

+ Mit der Funktion aufInsel() kannst du prüfen, ob der Roboter auf einer Insel steht. +

+
+
+

+ Der Roboter darf nicht versuchen, einen Fisch abzulegen, wenn er gar keinen Fisch + transportiert. Der Roboter hat keine Sensoren um zu prüfen, ob er einen Fisch transportiert. Er hat + auch kein Gedächtnis, mit dem er sich merken könnte, ob er bereits einen Fisch gefangen hat. Du + musst du dir also etwas anderes überlegen. +

+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/training/training-repeat-nested-if-marbles/index_new_v1.html b/training/training-repeat-nested-if-marbles/index_new_v1.html new file mode 100644 index 0000000..1b2b324 --- /dev/null +++ b/training/training-repeat-nested-if-marbles/index_new_v1.html @@ -0,0 +1,80 @@ + + + + + + training-repeat-nested-if-marbles + + + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll jede Murmel aufheben und in einem Loch ablegen. +

+

+ Der Roboter kann höchstens eine Murmel auf einmal tragen. +

+
+
+

+ Verwende den Baustein wiederhole. + Verwende den Baustein falls, um zu testen ob auf dem aktuellen Feld eine Murmel liegt oder ob sich auf dem aktuellen Feld ein Loch befindet. +

+

+ Verwende Baustein wiederhole ineinander verschachtelt. + Verwende den Baustein falls, um zu testen ob auf dem aktuellen Feld eine Murmel liegt oder ob sich auf dem aktuellen Feld ein Loch befindet. +

+
+

Der Roboter darf nicht versuchen, eine Murmel abzulegen, wenn er gar keine Murmel transportiert. Der Roboter hat keine Sensoren um zu prüfen, ob er eine Murmel transportiert. Er hat auch kein Gedächtnis, mit + dem er sich merken könnte, ob er bereits eine Murmel aufgehoben hat. Du musst dir also etwas anderes überlegen.

+
+
+
+
+
+ +
+ + + diff --git a/training/training-repeat-nested-if-marbles/marble.png b/training/training-repeat-nested-if-marbles/marble.png new file mode 100644 index 0000000..990bfd6 Binary files /dev/null and b/training/training-repeat-nested-if-marbles/marble.png differ diff --git a/training/training-repeat-nested-if-marbles/task.js b/training/training-repeat-nested-if-marbles/task.js new file mode 100644 index 0000000..d9498b5 --- /dev/null +++ b/training/training-repeat-nested-if-marbles/task.js @@ -0,0 +1,85 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + hole: { num: 2, img: "hole.png", side: cellSide, category: "hole", isObstacle: false, isHole: true, zOrder: 0 }, + marble: { num: 3, img: "marble.png", side: cellSide, category: "marble", isObstacle: false, isTransportable: true, zOrder: 1 }, + }, + maxInstructions: 22, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "pickTransportable", "dropTransportable", "onTransportable", "onHole"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat", "controls_if"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarblesInHoles, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 3, 1, 2, 3, 1, 1, 2, 1, 3, 2, 1, 1, 3, 2, 3, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 0, dir: 0, type: "green_robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1], + [1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1], + [1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], + [1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 2, 1, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1] + ], + initItems: [ + { row: 7, col: 0, dir: 0, type: "green_robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1], + [1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 1], + [1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, 1], + [1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1] + ], + initItems: [ + { row: 7, col: 0, dir: 0, type: "green_robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 120; + displayHelper.thresholdMedium = 240; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); diff --git a/training/training-repeat-nested-if-marbles/task_new.js b/training/training-repeat-nested-if-marbles/task_new.js new file mode 100644 index 0000000..87f45b6 --- /dev/null +++ b/training/training-repeat-nested-if-marbles/task_new.js @@ -0,0 +1,372 @@ +function initTask(subTask) { + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "fishing", + maxInstructions: 22, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "withdrawObject", "dropObject", "onObject", "onContainer"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat", "controls_if"] + }, + pythonAdditionalFunctions: { + shared: ["range"] + }, + }, + blocklyColourTheme: "bwinf", + }; + + subTask.data = { + easy: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 5, 1, 6, 5, 1, 1, 6, 1, 5, 6, 1, 1, 5, 6, 5, 6, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [{ + row: 1, + col: 0, + type: "robot" + }, + { + row: 1, + col: 1, + type: "net" + }, + { + row: 1, + col: 4, + type: "net" + }, + { + row: 1, + col: 9, + type: "net" + }, + { + row: 1, + col: 13, + type: "net" + }, + { + row: 1, + col: 15, + type: "net" + }, + { + row: 1, + col: 3, + type: "island", + containerSize: 1 + }, + { + row: 1, + col: 7, + type: "island", + containerSize: 1 + }, + { + row: 1, + col: 10, + type: "island", + containerSize: 1 + }, + { + row: 1, + col: 14, + type: "island", + containerSize: 1 + }, + { + row: 1, + col: 16, + type: "island", + containerSize: 1 + }, + ].concat(initArray(1, { + row: 1, + col: 1, + type: "fishes" + })) + .concat(initArray(1, { + row: 1, + col: 4, + type: "fishes" + })) + .concat(initArray(1, { + row: 1, + col: 9, + type: "fishes" + })).concat(initArray(1, { + row: 1, + col: 13, + type: "fishes" + })) + .concat(initArray(1, { + row: 1, + col: 15, + type: "fishes" + })) + }], + medium: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 5, 1, 1, 6, 1, 1, 1], + [1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1], + [1, 1, 1, 5, 1, 1, 1, 1, 6, 1, 1, 1, 1], + [1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 6, 1], + [1, 1, 5, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1], + [1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 6, 1, 1], + [1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1] + ], + initItems: [{ + row: 7, + col: 0, + type: "robot" + }, + { + row: 1, + col: 6, + type: "net" + }, + { + row: 2, + col: 1, + type: "net" + }, + { + row: 3, + col: 3, + type: "net" + }, + { + row: 4, + col: 4, + type: "net" + }, + { + row: 5, + col: 2, + type: "net" + }, + { + row: 6, + col: 3, + type: "net" + }, + { + row: 7, + col: 1, + type: "net" + }, + + { + row: 1, + col: 9, + type: "island", + containerSize: 1 + }, + { + row: 2, + col: 10, + type: "island", + containerSize: 1 + }, + { + row: 3, + col: 8, + type: "island", + containerSize: 1 + }, + { + row: 4, + col: 11, + type: "island", + containerSize: 1 + }, + { + row: 5, + col: 7, + type: "island", + containerSize: 1 + }, + { + row: 6, + col: 10, + type: "island", + containerSize: 1 + }, + { + row: 7, + col: 11, + type: "island", + containerSize: 1 + }, + ].concat(initArray(1, { + row: 1, + col: 6, + type: "fishes" + })).concat(initArray(1, { + row: 2, + col: 1, + type: "fishes" + })).concat(initArray(1, { + row: 3, + col: 3, + type: "fishes" + })).concat(initArray(1, { + row: 4, + col: 4, + type: "fishes" + })).concat(initArray(1, { + row: 5, + col: 2, + type: "fishes" + })).concat(initArray(1, { + row: 6, + col: 3, + type: "fishes" + })).concat(initArray(1, { + row: 7, + col: 1, + type: "fishes" + })) + }], + hard: [{ + tiles: [ + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], //0 + [1, 1, 1, 1, 1, 6, 1, 1, 5, 1, 1, 1, 1], //1 + [1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1], //2 + [1, 5, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1, 1], //3 + [1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 6, 1, 1], //4 + [1, 1, 1, 6, 1, 1, 1, 1, 5, 1, 1, 1, 1], //5 + [1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 5, 1], //6 + [1, 5, 1, 1, 1, 1, 1, 1, 1, 6, 1, 1, 1] //7 + ], + initItems: [{ + row: 7, + col: 0, + type: "robot" + }, + { + row: 1, + col: 8, + type: "net" + }, + { + row: 2, + col: 2, + type: "net" + }, + { + row: 3, + col: 1, + type: "net" + }, + { + row: 4, + col: 5, + type: "net" + }, + { + row: 5, + col: 8, + type: "net" + }, + { + row: 6, + col: 11, + type: "net" + }, + { + row: 7, + col: 1, + type: "net" + }, + + { + row: 1, + col: 5, + type: "island", + containerSize: 1 + }, + { + row: 2, + col: 11, + type: "island", + containerSize: 1 + }, + { + row: 3, + col: 8, + type: "island", + containerSize: 1 + }, + { + row: 4, + col: 10, + type: "island", + containerSize: 1 + }, + { + row: 5, + col: 3, + type: "island", + containerSize: 1 + }, + { + row: 6, + col: 4, + type: "island", + containerSize: 1 + }, + { + row: 7, + col: 9, + type: "island", + containerSize: 1 + }, + ].concat(initArray(1, { + row: 1, + col: 8, + type: "fishes" + })).concat(initArray(1, { + row: 2, + col: 2, + type: "fishes" + })).concat(initArray(1, { + row: 3, + col: 1, + type: "fishes" + })).concat(initArray(1, { + row: 4, + col: 5, + type: "fishes" + })).concat(initArray(1, { + row: 5, + col: 8, + type: "fishes" + })).concat(initArray(1, { + row: 6, + col: 11, + type: "fishes" + })).concat(initArray(1, { + row: 7, + col: 1, + type: "fishes" + })) + }] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 120; + displayHelper.thresholdMedium = 240; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); \ No newline at end of file diff --git a/training/training-repeat-nested-if-marbles/task_new_v1.js b/training/training-repeat-nested-if-marbles/task_new_v1.js new file mode 100644 index 0000000..a15f1f5 --- /dev/null +++ b/training/training-repeat-nested-if-marbles/task_new_v1.js @@ -0,0 +1,87 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "marbles", + //cellSide: cellSide, + actionDelay: 200, + //itemTypes: { + // green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + // hole: { num: 2, img: "hole.png", side: cellSide, category: "hole", isObstacle: false, isHole: true, zOrder: 0 }, + // marble: { num: 3, img: "marble.png", side: cellSide, category: "marble", isObstacle: false, isTransportable: true, zOrder: 1 }, + //}, + maxInstructions: 22, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "withdrawObject", "dropObject", "onObject", "onContainer"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat", "controls_if"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarblesInHoles, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 4, 1, 3, 4, 1, 1, 3, 1, 4, 3, 1, 1, 4, 3, 4, 3, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 0, type: "robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 4, 1, 1, 3, 1, 1, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1], + [1, 1, 1, 4, 1, 1, 1, 1, 3, 1, 1, 1, 1], + [1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 1, 4, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1], + [1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 3, 1, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1] + ], + initItems: [ + { row: 7, col: 0, type: "robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 3, 1, 1, 4, 1, 1, 1, 1], + [1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 3, 1, 1], + [1, 1, 1, 3, 1, 1, 1, 1, 4, 1, 1, 1, 1], + [1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 4, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1] + ], + initItems: [ + { row: 7, col: 0, type: "robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 120; + displayHelper.thresholdMedium = 240; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); diff --git a/training/training-repeat-nested-if-paint/green_robot.png b/training/training-repeat-nested-if-paint/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-repeat-nested-if-paint/green_robot.png differ diff --git a/training/training-repeat-nested-if-paint/icon.png b/training/training-repeat-nested-if-paint/icon.png new file mode 100644 index 0000000..3ab9913 Binary files /dev/null and b/training/training-repeat-nested-if-paint/icon.png differ diff --git a/training/training-repeat-nested-if-paint/index.html b/training/training-repeat-nested-if-paint/index.html new file mode 100644 index 0000000..5a7171f --- /dev/null +++ b/training/training-repeat-nested-if-paint/index.html @@ -0,0 +1,71 @@ + + + + + + training-repeat-nested-if-paint + + + + + + + + + +
+

Male das Haus

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll alle markierten Felder färben. +

+
+
+

+ Verwende dafür den Baustein wiederhole ineinander verschachtelt. + Verwende den Baustein falls, um zu testen ob das aktuelle Feld markiert ist. +

+
+
+
+
+
+
+ +
+ + + diff --git a/training/training-repeat-nested-if-paint/index_new.html b/training/training-repeat-nested-if-paint/index_new.html new file mode 100644 index 0000000..32d8729 --- /dev/null +++ b/training/training-repeat-nested-if-paint/index_new.html @@ -0,0 +1,64 @@ + + + + + + training-repeat-nested-if-paint + + + + + + + + + +
+

Male das Haus

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll alle markierten Felder färben. +

+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/training/training-repeat-nested-if-paint/marker.png b/training/training-repeat-nested-if-paint/marker.png new file mode 100644 index 0000000..efd3457 Binary files /dev/null and b/training/training-repeat-nested-if-paint/marker.png differ diff --git a/training/training-repeat-nested-if-paint/paint.png b/training/training-repeat-nested-if-paint/paint.png new file mode 100644 index 0000000..32e9406 Binary files /dev/null and b/training/training-repeat-nested-if-paint/paint.png differ diff --git a/training/training-repeat-nested-if-paint/task.js b/training/training-repeat-nested-if-paint/task.js new file mode 100644 index 0000000..618c6ba --- /dev/null +++ b/training/training-repeat-nested-if-paint/task.js @@ -0,0 +1,59 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + paint: { img: "paint.png", side: cellSide, category: "paint", isPaint: true, isObstacle: false, hasColor: true, color: "gris", zOrder: 1 }, + marker: { num: 2, img: "marker.png", side: cellSide, category: "marker", isObstacle: false, isMarker: true, zOrder: 0 } + }, + maxInstructions: 15, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "south", "paint", "markedCell"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat", "controls_if"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarkersPainted, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 2, 2, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 2, 1, 1, 1], + [1, 1, 2, 1, 1, 1, 1, 2, 1, 1], + [1, 2, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 2, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 2, 1, 1, 2, 2, 1, 1, 2, 1], + [1, 2, 1, 1, 2, 2, 1, 1, 2, 1], + [1, 2, 2, 2, 2, 2, 2, 2, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 9, col: 0, dir: 0, type: "green_robot" } + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, null, null, true); + diff --git a/training/training-repeat-nested-if-paint/task_new.js b/training/training-repeat-nested-if-paint/task_new.js new file mode 100644 index 0000000..a88de54 --- /dev/null +++ b/training/training-repeat-nested-if-paint/task_new.js @@ -0,0 +1,64 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "paint", + //cellSide: cellSide, + actionDelay: 200, + //itemTypes: { + // green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + // paint: { img: "paint.png", side: cellSide, category: "paint", isPaint: true, isObstacle: false, hasColor: true, color: "gris", zOrder: 1 }, + // marker: { num: 2, img: "marker.png", side: cellSide, category: "marker", isObstacle: false, isMarker: true, zOrder: 0 } + //}, + maxInstructions: 15, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "south", "dropObject", "onContainer"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat", "controls_if"] + }, + pythonAdditionalFunctions: { + shared: ["range"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarkersPainted, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 2, 2, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 1, 2, 1, 1, 1], + [1, 1, 2, 1, 1, 1, 1, 2, 1, 1], + [1, 2, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 2, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 2, 1, 1, 2, 2, 1, 1, 2, 1], + [1, 2, 1, 1, 2, 2, 1, 1, 2, 1], + [1, 2, 2, 2, 2, 2, 2, 2, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 9, col: 0, type: "robot" } + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, null, null, true); + diff --git a/training/training-repeat-nested-marbles/Parameter.png b/training/training-repeat-nested-marbles/Parameter.png new file mode 100644 index 0000000..60c090b Binary files /dev/null and b/training/training-repeat-nested-marbles/Parameter.png differ diff --git a/training/training-repeat-nested-marbles/example_nested_repeat.png b/training/training-repeat-nested-marbles/example_nested_repeat.png new file mode 100644 index 0000000..2b3e1b2 Binary files /dev/null and b/training/training-repeat-nested-marbles/example_nested_repeat.png differ diff --git a/training/training-repeat-nested-marbles/example_nested_repeat_python.png b/training/training-repeat-nested-marbles/example_nested_repeat_python.png new file mode 100644 index 0000000..6070cdd Binary files /dev/null and b/training/training-repeat-nested-marbles/example_nested_repeat_python.png differ diff --git a/training/training-repeat-nested-marbles/example_nested_repeat_scratch.png b/training/training-repeat-nested-marbles/example_nested_repeat_scratch.png new file mode 100644 index 0000000..b4b0aa4 Binary files /dev/null and b/training/training-repeat-nested-marbles/example_nested_repeat_scratch.png differ diff --git a/training/training-repeat-nested-marbles/green_robot.png b/training/training-repeat-nested-marbles/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-repeat-nested-marbles/green_robot.png differ diff --git a/training/training-repeat-nested-marbles/hole.png b/training/training-repeat-nested-marbles/hole.png new file mode 100644 index 0000000..aa407b6 Binary files /dev/null and b/training/training-repeat-nested-marbles/hole.png differ diff --git a/training/training-repeat-nested-marbles/icon.png b/training/training-repeat-nested-marbles/icon.png new file mode 100644 index 0000000..f6bb137 Binary files /dev/null and b/training/training-repeat-nested-marbles/icon.png differ diff --git a/training/training-repeat-nested-marbles/index.html b/training/training-repeat-nested-marbles/index.html new file mode 100644 index 0000000..888f71f --- /dev/null +++ b/training/training-repeat-nested-marbles/index.html @@ -0,0 +1,90 @@ + + + + + training-repeat-nested-marbles + + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll jede Murmel aufheben und in dem entsprechenden Loch in der jeweiligen Zeile ablegen. +

+

+ Der Roboter kann höchstens eine Murmel auf einmal tragen. +

+
+
+

+ Du wirst dafür + mehrmals den Bausteine wiederhole ineinander verschachtelt verwenden + müssen, so wie hier gezeigt: +

+
+ +
+ +
+ Du wirst dafür mehrere for-Anweisungen ineinander verschachteln müssen, so wie hier gezeigt: +
+for i in range(5):
+  rechts()
+  for j in range(3):
+      oben()
+  rechts()
+
+

+ Dabei wird der Block, mit einer Einrückung insgesamt 5-Mal ausgeführt. Der Roboter geht also 5-Mal: einen Schritt nach rechts, + drei nach oben (die zweite for-Anweisung) und wieder einen Schritt nach rechts. Dabei ist es wichtig, dass die Variable, welche in der for-Anweisung + benutzt wird loop, i, j, etc. nicht gleich ist, wenn die Wiederholungsanweisungen ineinander geschachtelt sind. +

+
+
+
+
+
+
+
+ +
+ + diff --git a/training/training-repeat-nested-marbles/index_new.html b/training/training-repeat-nested-marbles/index_new.html new file mode 100644 index 0000000..eeee393 --- /dev/null +++ b/training/training-repeat-nested-marbles/index_new.html @@ -0,0 +1,117 @@ + + + + + + training-repeat-nested-marbles + + + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+ Programmiere den Roboter: +

+ Der Roboter soll jeden Fisch aufheben und auf der entsprechenden Insel in der + jeweiligen Zeile ablegen. +

+

+ Der Roboter kann höchstens einen Fisch auf einmal tragen. +

+

+ Bitte schau dir vorab die Erläuterungen Erläuterungen der Bausteine unter "weitere Hinweise" an. +

+

+ Bitte schau dir vorab die Erläuterungen unter "weitere Hinweise" an. +

+
+

Weitere Hinweise:

+
+

+ Die Zahl am Netz zeigt jeweils an, wie viele Fische enthalten sind.
+ Die Zahl an der Insel zeigt jeweils an, wie viele Fische bestellt wurden und abgeliefert werden + sollen. +

+
+

+ Als Erinnerung: +

+for loop in range(5):
+   rechts()
+   oben()
+
+ Dieser Code lässt den Roboter fünf Mal einen Schritt nach rechts und einen Schritt nach oben gehen. +

+
+
+
+

+ Du kannst den Bausteine wiederhole mehrmals ineinander verschachtelt verwenden: +

+ +
+ +
+ Du wirst dafür mehrere for-Anweisungen ineinander verschachteln müssen, so wie hier im Beispiel + gezeigt:
+ + +

+ Dabei wird alles, was beim grünen Block eingerückt ist, 5-Mal ausgeführt. Alle Befehle im orangenen Block werden 3-mal ausgeführt. Der Roboter geht also 5-Mal:
+ einen Schritt nach rechts, drei nach oben, einen Schritt nach rechts.

+

+ Anmerkung: Das Wort zwischen for und in ist nur ein Platzhalter, auch Variable genannt (dazu später mehr). Als Name kann hier alles verwendet werde, gesehen habe wir schon loop, i oder j. Wichtig ist, dass bei zwei ineinander geschachtelten for Schleifen nicht zwei Mal der gleiche Name verwendet wird. +

+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/training/training-repeat-nested-marbles/index_new_v1.html b/training/training-repeat-nested-marbles/index_new_v1.html new file mode 100644 index 0000000..15bcf86 --- /dev/null +++ b/training/training-repeat-nested-marbles/index_new_v1.html @@ -0,0 +1,90 @@ + + + + + training-repeat-nested-marbles + + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll jede Murmel aufheben und in dem entsprechenden Loch in der jeweiligen Zeile ablegen. +

+

+ Der Roboter kann höchstens eine Murmel auf einmal tragen. +

+
+
+

+ Du wirst dafür + mehrmals den Bausteine wiederhole ineinander verschachtelt verwenden + müssen, so wie hier gezeigt: +

+
+ +
+ +
+ Du wirst dafür mehrere for-Anweisungen ineinander verschachteln müssen, so wie hier gezeigt: +
+for i in range(5):
+  rechts()
+  for j in range(3):
+      oben()
+  rechts()
+
+

+ Dabei wird der Block, mit einer Einrückung insgesamt 5-Mal ausgeführt. Der Roboter geht also 5-Mal: einen Schritt nach rechts, + drei nach oben (die zweite for-Anweisung) und wieder einen Schritt nach rechts. Dabei ist es wichtig, dass die Variable, welche in der for-Anweisung + benutzt wird loop, i, j, etc. nicht gleich ist, wenn die Wiederholungsanweisungen ineinander geschachtelt sind. +

+
+
+
+
+
+
+
+ +
+ + diff --git a/training/training-repeat-nested-marbles/marble.png b/training/training-repeat-nested-marbles/marble.png new file mode 100644 index 0000000..990bfd6 Binary files /dev/null and b/training/training-repeat-nested-marbles/marble.png differ diff --git a/training/training-repeat-nested-marbles/task.js b/training/training-repeat-nested-marbles/task.js new file mode 100644 index 0000000..5164837 --- /dev/null +++ b/training/training-repeat-nested-marbles/task.js @@ -0,0 +1,81 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + hole: { num: 2, img: "hole.png", side: cellSide, category: "hole", isObstacle: false, isHole: true, zOrder: 0 }, + marble: { num: 3, img: "marble.png", side: cellSide, category: "marble", isObstacle: false, isTransportable: true, zOrder: 1 }, + }, + maxInstructions: 15, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "pickTransportable", "dropTransportable"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarblesInHoles, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 3, 2, 1, 3, 2, 1, 3, 2, 1, 3, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 0, dir: 0, type: "green_robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1], + [1, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 4, col: 0, dir: 0, type: "green_robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 6, col: 0, dir: 0, type: "green_robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); diff --git a/training/training-repeat-nested-marbles/task_new.js b/training/training-repeat-nested-marbles/task_new.js new file mode 100644 index 0000000..18b0343 --- /dev/null +++ b/training/training-repeat-nested-marbles/task_new.js @@ -0,0 +1,261 @@ +function initTask(subTask) { + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "fishing", + maxInstructions: 15, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "withdrawObject", "dropObject"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + pythonAdditionalFunctions: { + shared: ["range"] + } + }, + blocklyColourTheme: "bwinf", + }; + + subTask.data = { + easy: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 5, 6, 1, 5, 6, 1, 5, 6, 1, 5, 6, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [{ + row: 1, + col: 0, + type: "robot" + }, + { + row: 1, + col: 1, + type: "net" + }, + { + row: 1, + col: 4, + type: "net" + }, + { + row: 1, + col: 7, + type: "net" + }, + { + row: 1, + col: 10, + type: "net" + }, + { + row: 1, + col: 2, + type: "island", + containerSize: 1 + }, + { + row: 1, + col: 5, + type: "island", + containerSize: 1 + }, + { + row: 1, + col: 8, + type: "island", + containerSize: 1 + }, + { + row: 1, + col: 11, + type: "island", + containerSize: 1 + }, + ].concat(initArray(1, { + row: 1, + col: 1, + type: "fishes" + })) + .concat(initArray(1, { + row: 1, + col: 4, + type: "fishes" + })) + .concat(initArray(1, { + row: 1, + col: 7, + type: "fishes" + })).concat(initArray(1, { + row: 1, + col: 10, + type: "fishes" + })) + + }], + medium: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 6, 1], + [1, 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1], + [1, 1, 5, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + ], + initItems: [{ + row: 4, + col: 0, + type: "robot" + }, { + row: 3, + col: 2, + type: "net" + }, + { + row: 2, + col: 6, + type: "net" + }, + { + row: 1, + col: 10, + type: "net" + }, + { + row: 3, + col: 7, + type: "island", + containerSize: 1 + }, + { + row: 2, + col: 11, + type: "island", + containerSize: 1 + }, + { + row: 1, + col: 15, + type: "island", + containerSize: 1 + }, + ].concat(initArray(1, { + row: 3, + col: 2, + type: "fishes" + })) + .concat(initArray(1, { + row: 2, + col: 6, + type: "fishes" + })) + .concat(initArray(1, { + row: 1, + col: 10, + type: "fishes" + })) + }], + hard: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1], + [1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1], + [1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1], + [1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1], + [1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + ], + initItems: [{ + row: 6, + col: 0, + type: "robot" + }, + { + row: 1, + col: 1, + type: "net" + }, + { + row: 2, + col: 1, + type: "net" + }, + { + row: 3, + col: 1, + type: "net" + }, + { + row: 4, + col: 1, + type: "net" + }, + { + row: 5, + col: 1, + type: "net" + }, + { + row: 1, + col: 11, + type: "island", + containerSize: 1 + }, + { + row: 2, + col: 11, + type: "island", + containerSize: 1 + }, + { + row: 3, + col: 11, + type: "island", + containerSize: 1 + }, + { + row: 4, + col: 11, + type: "island", + containerSize: 1 + }, + { + row: 5, + col: 11, + type: "island", + containerSize: 1 + }, + ].concat(initArray(1, { + row: 1, + col: 1, + type: "fishes" + })).concat(initArray(1, { + row: 2, + col: 1, + type: "fishes" + })).concat(initArray(1, { + row: 3, + col: 1, + type: "fishes" + })).concat(initArray(1, { + row: 4, + col: 1, + type: "fishes" + })).concat(initArray(1, { + row: 5, + col: 1, + type: "fishes" + })) + }] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true) \ No newline at end of file diff --git a/training/training-repeat-nested-marbles/task_new_v1.js b/training/training-repeat-nested-marbles/task_new_v1.js new file mode 100644 index 0000000..bd018c5 --- /dev/null +++ b/training/training-repeat-nested-marbles/task_new_v1.js @@ -0,0 +1,86 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "marbles", + //cellSide: cellSide, + actionDelay: 200, + //itemTypes: { + // green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + // hole: { num: 2, img: "hole.png", side: cellSide, category: "hole", isObstacle: false, isHole: true, zOrder: 0 }, + // marble: { num: 3, img: "marble.png", side: cellSide, category: "marble", isObstacle: false, isTransportable: true, zOrder: 1 }, + //}, + maxInstructions: 15, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "north", "withdrawObject", "dropObject"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + pythonAdditionalFunctions: { + shared: ["range"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + //checkEndCondition: robotEndConditions.checkMarblesInHoles, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 4, 3, 1, 4, 3, 1, 4, 3, 1, 4, 3, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 0, type: "robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 3, 1], + [1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1], + [1, 1, 4, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 4, col: 0, type: "robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 6, col: 0, type: "robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); diff --git a/training/training-repeat-nested-obstacles/example_nested_repeat.png b/training/training-repeat-nested-obstacles/example_nested_repeat.png new file mode 100644 index 0000000..663928e Binary files /dev/null and b/training/training-repeat-nested-obstacles/example_nested_repeat.png differ diff --git a/training/training-repeat-nested-obstacles/green.png b/training/training-repeat-nested-obstacles/green.png new file mode 100644 index 0000000..dc5ef2a Binary files /dev/null and b/training/training-repeat-nested-obstacles/green.png differ diff --git a/training/training-repeat-nested-obstacles/green_robot.png b/training/training-repeat-nested-obstacles/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-repeat-nested-obstacles/green_robot.png differ diff --git a/training/training-repeat-nested-obstacles/icon.png b/training/training-repeat-nested-obstacles/icon.png new file mode 100644 index 0000000..8a5fef2 Binary files /dev/null and b/training/training-repeat-nested-obstacles/icon.png differ diff --git a/training/training-repeat-nested-obstacles/index.html b/training/training-repeat-nested-obstacles/index.html new file mode 100644 index 0000000..3156816 --- /dev/null +++ b/training/training-repeat-nested-obstacles/index.html @@ -0,0 +1,90 @@ + + + + + training-repeat-nested-obstacles + + + + + + + + +
+

Hindernislauf

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll das grüne Feld am Ende des Parcours erreichen, ohne gegen Hindernisse zu laufen. +

+
+
+

+ Du wirst dafür + mehrmals den Bausteine wiederhole ineinander verschachtelt verwenden + müssen, so wie hier gezeigt: +

+
+

+ +

+

+ +

+
+ +
+

eine for-Anweisung in einer anderen schreiben,

+
+for i in range(10):
+    for loop in range(5):
+        unten()
+    rechts()
+    for j in range(3):
+        oben()
+                        
+
+
+
+

Der Weg nach oben ist 10 Schritte lang.

+ +
+
+
+
+ +
+ + diff --git a/training/training-repeat-nested-obstacles/index_new.html b/training/training-repeat-nested-obstacles/index_new.html new file mode 100644 index 0000000..3c96a66 --- /dev/null +++ b/training/training-repeat-nested-obstacles/index_new.html @@ -0,0 +1,61 @@ + + + + + training-repeat-nested-obstacles + + + + + + + + +
+

Hindernislauf

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll die Flagge am Ende des Parcours erreichen, ohne gegen Hindernisse zu laufen. +

+

Der Weg nach oben ist 10 Schritte lang.

+ +
+
+
+
+ +
+ + diff --git a/training/training-repeat-nested-obstacles/obstacle.png b/training/training-repeat-nested-obstacles/obstacle.png new file mode 100644 index 0000000..32c7e6b Binary files /dev/null and b/training/training-repeat-nested-obstacles/obstacle.png differ diff --git a/training/training-repeat-nested-obstacles/task.js b/training/training-repeat-nested-obstacles/task.js new file mode 100644 index 0000000..cf42669 --- /dev/null +++ b/training/training-repeat-nested-obstacles/task.js @@ -0,0 +1,97 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0 }, + obstacle: { num: 2, img: "obstacle.png", side: cellSide, category: "obstacle", isObstacle: true }, + green: { num: 3, img: "green.png", side: cellSide, category: "paint", isObstacle: false, color: "vert", }, + }, + maxInstructions: 16, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "north", "south"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkReachGreenArea, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2], + [2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 2, col: 1, dir: 0, type: "green_robot" } + ] + } + ], + medium: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 11, col: 1, dir: 0, type: "green_robot" } + ] + } + ], + hard: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 3, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 11, col: 1, dir: 0, type: "green_robot" } + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); + diff --git a/training/training-repeat-nested-obstacles/task_new.js b/training/training-repeat-nested-obstacles/task_new.js new file mode 100644 index 0000000..8f471ff --- /dev/null +++ b/training/training-repeat-nested-obstacles/task_new.js @@ -0,0 +1,102 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "course", + //cellSide: cellSide, + actionDelay: 200, + //itemTypes: { + // green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0 }, + // obstacle: { num: 2, img: "obstacle.png", side: cellSide, category: "obstacle", isObstacle: true }, + // green: { num: 3, img: "green.png", side: cellSide, category: "paint", isObstacle: false, color: "vert", }, + //}, + maxInstructions: 16, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "north", "south"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + pythonAdditionalFunctions: { + shared: ["range"] + } + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + //checkEndCondition: robotEndConditions.checkReachGreenArea, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2], + [2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 2, col: 1,type: "robot" } + ] + } + ], + medium: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2], + [2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 3, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 11, col: 1, type: "robot" } + ] + } + ], + hard: [ + { + tiles: [ + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + [2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 3, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2], + [2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2], + [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + ], + initItems: [ + { row: 11, col: 1, type: "robot" } + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); + diff --git a/training/training-repeat-paint/example_repeat_1.png b/training/training-repeat-paint/example_repeat_1.png new file mode 100644 index 0000000..408159c Binary files /dev/null and b/training/training-repeat-paint/example_repeat_1.png differ diff --git a/training/training-repeat-paint/example_repeat_2.png b/training/training-repeat-paint/example_repeat_2.png new file mode 100644 index 0000000..eb4d0f0 Binary files /dev/null and b/training/training-repeat-paint/example_repeat_2.png differ diff --git a/training/training-repeat-paint/green_robot.png b/training/training-repeat-paint/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-repeat-paint/green_robot.png differ diff --git a/training/training-repeat-paint/icon.png b/training/training-repeat-paint/icon.png new file mode 100644 index 0000000..732effc Binary files /dev/null and b/training/training-repeat-paint/icon.png differ diff --git a/training/training-repeat-paint/index.html b/training/training-repeat-paint/index.html new file mode 100644 index 0000000..195069e --- /dev/null +++ b/training/training-repeat-paint/index.html @@ -0,0 +1,105 @@ + + + + + + training-repeat-paint + + + + + + + + + +
+

Treppe malen

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Der Roboter soll die markierten Felder färben. +

+
+

+ Benutze dafür + den Baustein wiederhole, der + die Wiederholungsanweisung for, die + dir erlaubt, eine oder mehrere Anweisungen mehrfach hintereinander auszuführen. +

+
+

Statt zum Beispiel dreimal die gleichen zwei Bausteine zu verwenden,

+ + + +

+ kannst du den Baustein wiederhole 3 mal verwenden: +

+ + +

Um die Anzahl der Wiederholungen zu ändern, kannst du auf die Zahl im Baustein klicken und eine + neue Zahl mit der Tastatur eingeben.

+
+
+

Statt zum Beispiel dreimal die gleichen zwei Befehle zu schreiben:

+
+  oben()
+  bemale()
+  oben()
+  bemale()
+  oben()
+  bemale()
+
+

benutze die Wiederholungsanweisung for:

+
+  for loop in range(3):
+    oben()
+    bemale()
+
+

+ Die Zahl in der Klammer gibt die Anzahl der Wiederholungen an. Alle Befehle, die in der Wiederholungsanweisung ausgeführt + werden sollen, müssen eingerückt werden. +

+
+
+
+
+
+
+ +
+ + + diff --git a/training/training-repeat-paint/index_new.html b/training/training-repeat-paint/index_new.html new file mode 100644 index 0000000..18d0f21 --- /dev/null +++ b/training/training-repeat-paint/index_new.html @@ -0,0 +1,117 @@ + + + + + + training-repeat-paint + + + + + + + + + +
+

Treppe malen

+ + + + + +
+
+
+ Programmiere den Roboter: +

+ Der Roboter soll die markierten Felder färben. +

+

+ Bitte schau dir vorab die Erläuterungen der Bausteine unter "weitere Hinweise" an. +

+

+ Bitte schau dir vorab die Erläuterungen unter "weitere Hinweise" an. +

+
+

Weitere Hinweise:

+

+ + Mit dem Baustein wiederhole, kannst du eine oder mehrere Anweisungen mehrfach hintereinander ausführen. + + + Benutze dafür die Wiederholungsanweisung for, die dir erlaubt, eine oder mehrere Anweisungen + mehrfach hintereinander auszuführen. + +

+
+

Statt zum Beispiel dreimal die gleichen zwei Bausteine zu verwenden,

+ + + +

+ kannst du den Baustein wiederhole verwenden: +

+ + +

Um die Anzahl der Wiederholungen zu ändern, kannst du auf die Zahl im Baustein klicken und eine + neue Zahl mit der Tastatur eingeben.

+
+
+

Statt zum Beispiel dreimal die gleichen zwei Befehle zu schreiben:

+
+  oben()
+  bemale()
+  oben()
+  bemale()
+  oben()
+  bemale()
+
+

benutze die Wiederholungsanweisung for:

+
+  for loop in range(3):
+    oben()
+    bemale()
+
+

+ Die Zahl in der Klammer gibt die Anzahl der Wiederholungen an. Alle Befehle, die in der + Wiederholungsanweisung ausgeführt + werden sollen, müssen eingerückt werden. +

+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/training/training-repeat-paint/marker.png b/training/training-repeat-paint/marker.png new file mode 100644 index 0000000..efd3457 Binary files /dev/null and b/training/training-repeat-paint/marker.png differ diff --git a/training/training-repeat-paint/paint.png b/training/training-repeat-paint/paint.png new file mode 100644 index 0000000..32e9406 Binary files /dev/null and b/training/training-repeat-paint/paint.png differ diff --git a/training/training-repeat-paint/task.js b/training/training-repeat-paint/task.js new file mode 100644 index 0000000..2a6a6ab --- /dev/null +++ b/training/training-repeat-paint/task.js @@ -0,0 +1,113 @@ +function initTask(subTask) { + var cellSide = 60; + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { + img: "green_robot.png", + side: 80, + nbStates: 9, + isObstacle: true, + offsetX: -14, + category: "robot", + team: 0 + }, + paint: { + img: "paint.png", + side: cellSide, + category: "paint", + isPaint: true, + isObstacle: false, + hasColor: true, + color: "gris" + }, + marker: { + num: 2, + img: "marker.png", + side: cellSide, + category: "marker", + isMarker: true, + isObstacle: false, + hasColor: true, + color: "marker" + } + }, + maxInstructions: 20, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "north", "west", "south", "paint"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarkersPainted, + }; + + subTask.data = { + easy: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [{ + row: 1, + col: 0, + dir: 0, + type: "green_robot" + }, ] + }], + medium: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [{ + row: 8, + col: 0, + dir: 0, + type: "green_robot" + }, ] + }], + hard: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1], + [1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1], + [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], + [1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1] + ], + initItems: [{ + row: 6, + col: 0, + dir: 0, + type: "green_robot" + }, ] + }] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); \ No newline at end of file diff --git a/training/training-repeat-paint/task_new.js b/training/training-repeat-paint/task_new.js new file mode 100644 index 0000000..c496ac0 --- /dev/null +++ b/training/training-repeat-paint/task_new.js @@ -0,0 +1,86 @@ +function initTask(subTask) { + var cellSide = 60; + subTask.gridInfos = { + hideSaveOrLoad: true, + conceptViewer: false, + contextType: "paint", + //cellSide: cellSide, + actionDelay: 200, + + maxInstructions: 20, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "north", "west", "south", "dropObject"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: ["controls_repeat"] + }, + pythonAdditionalFunctions: { + shared: ["range"] + } + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + //checkEndCondition: robotEndConditions.checkMarkersPainted, + }; + + subTask.data = { + easy: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [{ + row: 1, + col: 0, + type: "robot" + }, ] + }], + medium: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [{ + row: 8, + col: 0, + type: "robot" + }, ] + }], + hard: [{ + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1], + [1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1], + [1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1], + [1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1] + ], + initItems: [{ + row: 6, + col: 0, + type: "robot" + }, ] + }] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); \ No newline at end of file diff --git a/training/training-sequence-marble/Menu.png b/training/training-sequence-marble/Menu.png new file mode 100644 index 0000000..c941ad7 Binary files /dev/null and b/training/training-sequence-marble/Menu.png differ diff --git a/training/training-sequence-marble/auto.png b/training/training-sequence-marble/auto.png new file mode 100644 index 0000000..67c38a1 Binary files /dev/null and b/training/training-sequence-marble/auto.png differ diff --git a/training/training-sequence-marble/green_robot.png b/training/training-sequence-marble/green_robot.png new file mode 100644 index 0000000..fc2d4ff Binary files /dev/null and b/training/training-sequence-marble/green_robot.png differ diff --git a/training/training-sequence-marble/hole.png b/training/training-sequence-marble/hole.png new file mode 100644 index 0000000..aa407b6 Binary files /dev/null and b/training/training-sequence-marble/hole.png differ diff --git a/training/training-sequence-marble/icon.png b/training/training-sequence-marble/icon.png new file mode 100644 index 0000000..168e09f Binary files /dev/null and b/training/training-sequence-marble/icon.png differ diff --git a/training/training-sequence-marble/index.html b/training/training-sequence-marble/index.html new file mode 100644 index 0000000..e63f1db --- /dev/null +++ b/training/training-sequence-marble/index.html @@ -0,0 +1,62 @@ + + + + + training-sequence-marble + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+

+ Programmiere den Roboter:
+ Er soll die Murmel im Loch ablegen +

+
+ Programmiere den Roboter:
+ Er soll die beiden Murmel in die beiden Löcher legen. + Der Roboter kann höchstens eine Murmel tragen. +
+
+
+
+
+ +
+ + diff --git a/training/training-sequence-marble/index_new.html b/training/training-sequence-marble/index_new.html new file mode 100644 index 0000000..ce17ef1 --- /dev/null +++ b/training/training-sequence-marble/index_new.html @@ -0,0 +1,75 @@ + + + + + training-sequence-marble + + + + + + + +
+

Murmeln verschieben

+ + + + + +
+
+
+

Programmiere den Roboter:

+

+ Der Roboter soll die Murmel im Loch ablegen +

+
+

+ Der Roboter soll die beiden Murmel in die beiden Löcher legen. + Der Roboter kann höchstens eine Murmel tragen.

+
+

Tipp: + + Wenn du zu faul zum tippen bist, kannst du ab dem ersten Buchstaben Tabulator drücken und der Befehl wird automatisch mit dem ersten Vorschlag im angezeigten Menu vervollständigt. Als Beispiel siehe auch "Weiter Hinweise"

+
+
+ Entweder kann du direkt auf den gewünschten Befehl klicken, oder mit den Pfeiltasten und der Tabulatortaste (rot) arbeiten. + +
+ +
+
+
+
+ +
+ + diff --git a/training/training-sequence-marble/marble.png b/training/training-sequence-marble/marble.png new file mode 100644 index 0000000..990bfd6 Binary files /dev/null and b/training/training-sequence-marble/marble.png differ diff --git a/training/training-sequence-marble/tab.png b/training/training-sequence-marble/tab.png new file mode 100644 index 0000000..403ca85 Binary files /dev/null and b/training/training-sequence-marble/tab.png differ diff --git a/training/training-sequence-marble/task.js b/training/training-sequence-marble/task.js new file mode 100644 index 0000000..a2c2ab9 --- /dev/null +++ b/training/training-sequence-marble/task.js @@ -0,0 +1,75 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + hideSaveOrLoad: true, + cellSide: cellSide, + actionDelay: 200, + itemTypes: { + green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + hole: { num: 2, img: "hole.png", side: cellSide, category: "hole", isObstacle: false, isHole: true, zOrder: 0 }, + marble: { num: 3, img: "marble.png", side: cellSide, category: "marble", isObstacle: false, isTransportable: true, zOrder: 1 }, + }, + maxInstructions: 20, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "pickTransportable", "dropTransportable"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: [] + } + }, + blocklyColourTheme: "bwinf", + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + checkEndCondition: robotEndConditions.checkMarblesInHoles, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 3, 1, 1, 2, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 1, dir: 0, type: "green_robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 2, 1, 3, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 1, dir: 0, type: "green_robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 3, 3, 1, 2, 2, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 1, dir: 0, type: "green_robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true); diff --git a/training/training-sequence-marble/task_new.js b/training/training-sequence-marble/task_new.js new file mode 100644 index 0000000..88d171d --- /dev/null +++ b/training/training-sequence-marble/task_new.js @@ -0,0 +1,78 @@ +function initTask(subTask) { + var cellSide = 60; + + subTask.gridInfos = { + conceptViewer: false, + contextType: "marbles", + blocklyColourTheme: "bwinf", + hideSaveOrLoad: true, + //cellSide: cellSide, + actionDelay: 200, + showCardinals: false, + //itemTypes: { + //green_robot: { img: "green_robot.png", side: 80, nbStates: 9, isObstacle: true, offsetX: -14, category: "robot", team: 0, zOrder: 2 }, + //hole: { num: 2, img: "hole.png", side: cellSide, category: "hole", isObstacle: false, isHole: true, zOrder: 0 }, + //marble: { num: 3, img: "marble.png", side: cellSide, category: "marble", isObstacle: false, isTransportable: true, zOrder: 1 }, + //}, + maxInstructions: 20, + includeBlocks: { + groupByCategory: false, + generatedBlocks: { + robot: ["east", "west", "withdrawObject", "dropObject"] + }, + standardBlocks: { + includeAll: false, + wholeCategories: [], + singleBlocks: [] + } + }, + ignoreInvalidMoves: false, + checkEndEveryTurn: false, + //checkEndCondition: robotEndConditions.checkMarblesInHoles, + }; + + subTask.data = { + easy: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 4, 1, 1, 3, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 1, type: "robot" }, + ] + } + ], + medium: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 3, 1, 4, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 1, type: "robot" }, + ] + } + ], + hard: [ + { + tiles: [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 4, 4, 1, 3, 3, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1] + ], + initItems: [ + { row: 1, col: 1, type: "robot" }, + ] + } + ] + }; + + initBlocklySubTask(subTask); + displayHelper.thresholdEasy = 5000; + displayHelper.thresholdMedium = 10000; +} + +initWrapper(initTask, ["easy", "medium", "hard"], null, true);