Ihr sollt in 2er- oder 3er-Gruppen ein kleines Minecraft Projekt erstellen. Es handelt sich dabei um ein Coding-Projekt, d.h. es geht nicht so sehr darum, von Hand eine möglichst tolle Welt zu erschaffen. Ihr sollt eher Python-Programme erstellen, welche in Minecraft einen coolen Effekt erzielen. Dabei kann man zwei verschiedene Dinge anstreben. Entweder man verwendet Python, um Objekte automatisiert zu bauen, oder man verwendet Python, um Interaktivität in die Welt zu bringen (siehe unten).
Konkret ist also euer Auftrag:
Es ist wichtig, dass ihr jeweils die Programme extern speichert (z.B. in eine Textdatei oder direkt in das wiki reinkopieren). Auch die Welt würde ich jeweils exportieren, damit ihr nicht plötzlich eure Arbeit verliert.
Voraussichtlich ist die Projektabgabe am 04.03.2021
| Kriterium | Bemerkungen |
|---|---|
| Originalität/Konzeption | Wurde eine neue, eigenständige Idee umgesetzt? Wurde diese Idee durchdacht und geplant realisiert? |
| Arbeitsweise der Gruppe | Wurde die Arbeit ausgewogen aufgeteilt und gemeinsam umgesetzt? War die Arbeitsweise selbständig? Wurde zielorientiert gearbeitet? |
| Komplexität der Lösung | Wie hoch ist die Komplexität des Projektes bezüglich Programmier- konzeption und Logik? |
| Qualität des Quellcodes | Ist der Code modular und verständlich geschrieben und gut strukturiert? (Funktionen verwenden, wenn nötig kommentieren, Redundanz vermeiden) |
| Qualität der Dokumentation und der Präsentation | Wird im Wiki das Projekt angemessen präsentiert und erklärt? Wird das Projekt angemessen und verständlich kurz präsentiert? |
Wir haben gesehen, dass man den Agenten verwenden kann, um Objekte zu bauen. Dies ist jedoch recht kompliziert, da der Agent die Blocks nicht an seiner eigenen Position hinlegt, sondern vor oder hinter oder neben sich stellt. Dies macht die Programmierung nicht sehr einfach.
Will man Blöcke automatisch erstellen lassen, kann man dies auch direkt machen, d.h. ohne den Agenten. Dazu verwendet man hauptsächlich die Befehle: blocks.place und blocks.fill. Damit kann man einen Block an einer bestimmten Position setzen, oder einen ganzen Quader von Blöcken auf einmal erstellen.
Eine Linie von Blocks erstellen, wobei jeder zweite Block aus Gold bzw. aus Blauer Wolle besteht: (das %-Zeichen ist die Modulo-Rechnung vgl. Stunde)
for i in range(3,20,1):
if (i%2)==0:
blocks.place(GOLD_BLOCK, pos(i, 0, 0))
else:
blocks.place(BLUE_WOOL, pos(i,0,0))
Einen Grossen Goldblock erstellen und mit Luft aushöhlen:
blocks.fill(GOLD_BLOCK, pos(1, 1, 1), pos(10, 10, 10)) blocks.fill(AIR, pos(2,2,2), pos(9, 9, 9))
Man kann auch Python-Funktionen ausführen, wenn bestimmte Bedingungen erfüllt sind. Dazu verwendet man sogenannte „Listeners“, Diese funktionieren genau wie bei Tigerjython:
Wenn der Spieler „baue_Goldhaus“ in den Chat tippt, soll der ausgehöhlte Goldblock erstellt werden:
def on_chat():
blocks.fill(GOLD_BLOCK, pos(1, 1, 1), pos(10, 10, 10))
blocks.fill(AIR, pos(2,2,2), pos(9, 9, 9))
player.on_chat("baue_Goldhaus", on_chat)
Es gibt verschiedene von diesen Listenern. Alle beginnen mit player.on, oder mit blocks.on . (player.on_chat, player.on_item_interacted, blocks.on_block_broken, blocks,on_blocks_placed,)
Was ich noch selber rausfinden muss: wie ruft man am besten eine Python-Funktion auf aus Minecraft (sodass man z.B. einen Schalter bewegen kann und die Funktion wird ausgeführt). Aktuell funktioniert für mich nur der Trick, dass ich einen Block erstelle und wenn man ihn zerstört wird die Funktion aufgerufen, die den Block gleich wieder hinzufügt. Dies ist dann ein „Pseudo-Schalter“. Es wäre aber eleganter, wenn man z.B. Command_Blocks verwenden könnte (das scheint aber nicht zu gehen).