Home > spielen > Python-Codierung für Minecraft

Python-Codierung für Minecraft

0
Advertisement

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Diese Instructable zeigt, wie zu installieren und zu verwenden, ein mod Ich schrieb, dass Sie Minecraft mit Python-Skripte steuern können. Ich werde auf Windows konzentrieren, obwohl OS X und Linux sollte genauso gut funktionieren.

Python-Skripte können ordentlich in der Welt Dinge zu generieren, und es gibt viele Beispiele im Web. Mit ein paar Zeilen können Sie eine riesige Glaskugel zu zeichnen, und mit ein bisschen mehr Arbeit einen machen Riese Sierpinski Dreieck in den Himmel und auch OBJ - Dateien wie ein Space Shuttle importieren . Ich selbst machte Spaß Scripts zu zeichnen mit Wasser gefüllten Glas Donut und eine gigantische Klein Flasche , zu drehen alles um in TNT und zu steuern , mit Mine Ihr Gehirn ein Mindflex EEG Spielzeug verwenden. Es gibt eine ganze Buch Einführung Programmierung mit Python - Skripte für Minecraft , und Sie können sogar einfache Minecraft-basierte Spiele zu machen. Ich werde auch zeigen, wie man einfache (und manchmal auch aufwendigere) Schildkröten-basierte Zeichnungen in Minecraft macht, während man zusammen mit der Zeichnung als Schildkröte fahren kann.

Für eine Weile jetzt könnten Sie Python - Skripte für Minecraft auf dem Raspberry Pi schreiben . Ich wollte meine Kinder in der Lage, das zu tun, aber wir haben keine Pi, und es wäre schön, dies mit dem vollen Desktop Minecraft zu tun. Sie könnten Ihren eigenen Server mit dem laufen Himbeersaft - Plugin , die arbeiten die meisten der Python - Skripte ermöglicht. Aber nicht jeder will einen Server installieren und konfigurieren.

Also habe ich das schrieb Raspberry Jam Mod für Minecraft 1.8 (jetzt auf 1.8.8, 1.8.9 und 1.9 als auch portiert) , die den größten Teil des Raspberry Pi Minecraft - Protokoll (etwa die gleiche wie die Himbeersaft - Plugin zur Verfügung stellt) und lässt Raspberry Pi emuliert Python-Skripte laufen mit voller Desktop Minecraft.

Später fand ich heraus , dass jemand das schrieb mcpiapi Mod für Minecraft 1.7.10 ein paar Wochen zuvor. Diese Instructable ist für Raspberry Jam Mod und Minecraft 1.8 / 1.8.8 / 1.8.9 / 1.9 geschrieben, aber ich werde einige der Unterschiede für mcpiapi und Minecraft 1.7.10 beachten. Die meisten meiner Arbeit war mit Python 2.7, aber ich werde auch Python 3 zu decken.

Ich nehme an, dass Sie grundlegende Einrichtung mit dem Erstellen von Ordnern und das Herunterladen, Entpacken und Kopieren von Dateien auf Windows (oder Ihr Betriebssystem der Wahl) haben.

Sie können Python-Skripts für Minecraft mit einem Texteditor, der IDLE-Umgebung, die mit Python geliefert wird, oder mit Visual Studio Python Tools unter Windows erstellen. Die letzte ist eigentlich die schönste in gewisser Weise, so werde ich einige optionale Schritte, wie das zu tun haben.

In diesem Sommer habe ich vor, Kodierung und grundlegende 3D-Geometrie zu begabten Mittel- und Highschoolern unter Verwendung von Minecraft, Raspberry Jam Mod, Python und Visual Studio zu unterrichten.

Wenn Sie dies mit Minecraft Pocket Edition auf Android stattdessen tun wollen, habe ich eine Instructable für das auch.

Schritt 1: Installieren Sie Forge für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Die Forge verwaltet Minecraft Mods und wird für die Raspberry Jam Mod (und die mcpapi Mod für 1,7.10 als gut) benötigt.

Ich nehme an, Sie haben Minecraft installiert.

  1. Sie müssen Minecraft 1.8 / 1.8.8 / 1.8.9 / 1.9 einmal ausführen (Ihre Wahl der Version). Starten Sie dazu den Minecraft Launcher und klicken Sie nach dem Anmelden auf Neues Profil. Stellen Sie den Namen des Profils ein (z. B. "Test von 1.8") und gehen Sie dann zu "Version verwenden" und wählen Sie "Release 1.8.x / 1.9". Dann klicken Sie auf "Profil speichern", stellen Sie sicher, dass das neue Profil im Launcher ausgewählt ist, und klicken Sie auf "Play". Starten Sie eine Welt und stellen Sie sicher, dass es funktioniert.
  2. Beenden Sie Minecraft und Minecraft Launcher.
  3. Laden Sie Forge Installer für Ihre Version.
  4. Führen Sie das Forge-Installationsprogramm aus. Die Standardeinstellungen sollten funktionieren.
  5. Starten Sie Minecraft. Sie haben nun ein neues Forge-Profil.

1.7.10 Variante: Machen Sie eine 1.7.10 Profil in Schritt 1, erhalten Sie Ihre 1.7.10 Forge von hier in Schritt 3.

Schritt 2: Installieren Sie Python

Python-Codierung für Minecraft

Update (Juni 2015): Wenn Sie Windows und wollen Python zu verwenden 2.7, können Sie diesen Schritt überspringen und die nächste nur um die neueste Windows - Installer von meinem Download Github Releases . Dieser bündelt eine Python - Interpreter, meine Beispielskripte und die Mod, bringt alles an der richtigen Stelle (% AppData% \. Minecraft \ Mods und% AppData% \. Minecraft \ mcpipy) und erstellt einen IDLE für Minecraft Python Link im Startmenü Und Desktop. Es erfordert, dass Sie bereits Minecraft 1.8 und Forge installiert haben. Allerdings, wenn Sie Visual Studio verwenden möchten, müssen Sie auch eine unbundled Python-Installation zu tun, wie in diesem Schritt, anstatt nur die Installation des Interpreters in meinem Installer gebündelt.

Alte Anweisungen:

Sie müssen entscheiden, ob Sie Python 2.7 oder Python 3.x. Das Abenteuer in Minecraft Buch nutzt 2.7, und die meisten der Skripte rund um die Web Floating sind für 2.7, aber ich habe eine Menge von Skripten für 3.x konvertiert , wenn Sie es vorziehen.

1. Laden Sie Ihre Wahl von Python aus installiert hier .

2. Führen Sie das Installationsprogramm aus.

3. Klicken Sie auf den Dialog Python anpassen, und vergewissern Sie sich, dass Sie nach unten zu "Hinzufügen von python.exe zu Pfad" scrollen, klicken Sie darauf und wählen Sie "Wird auf der lokalen Festplatte installiert." Wenn Sie Python nicht auf den Pfad hinzufügen, werden Sie nicht in der Lage sein , Skripte mit / Python zu starten aus Minecraft.

Schritt 3: Installieren Sie Mod und Scripts

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

1. Erstellen Sie einen Ordner mods in Ihrem Ordner Minecraft. (Um das zu tun, drücken Sie Windows R, geben Sie % AppData% \. Minecraft, drücken Sie die Eingabetaste. Sie werden alles in Ihrer Minecraft Ordner. Wenn Sie bereits ein Mods Unterordner haben, brauchen Sie nichts weiter zu tun. Sonst machen ein. am 8. Windows klicken Sie auf Neuer Ordner, und dann den Namen Mods eingeben und drücken Sie die Eingabetaste.)

2. Laden Sie die mods.zip Datei aus der aktuellen Version des Raspberry Jam Mod . Setzen Sie den Inhalt der Zip - Datei (derzeit vier Ordner: 1.8, 1.8.8, 1.8.9 und 1.9) in den Ordner mods hatte Sie gerade gemacht.

3. Laden Sie die neueste Zip - Datei - Skripte Python enthaltenden Probe und die MCPI Bibliothek von meinem Raspberry Jam Mod Github - Release . Es gibt eine Zip-Datei für Python 2 und die andere für Python 3. Ich werde mit Python 2 arbeiten.

4. Öffnen Sie die heruntergeladene Zip-Datei (in Chrome, indem Sie darauf klicken, am unteren Rand des Fensters). Es hat einen mcpipy Ordner. Kopieren Sie den Ordner mcpipy in Ihrem Ordner Minecraft. (Um das zu tun, klicken Sie einmal auf dem mcpipy Ordner in der ZIP - Datei, und drücken Sie Strg-C und navigieren Sie in das Verzeichnis % AppData% \. Minecraft Ordner wie in Schritt 1, und drücken Sie Strg + V).

Variante für 1.7.10: In Schritt 2, laden Sie die .jar - Datei von hier und steckte es in den Ordner mods, in einem 1.7.10 Unterordner , wenn Sie mögen. (Nach dem im Browser in der .jar - Datei klicken, auf Raw klicken zum Download bereit .) In Schritt 4 müssen Sie einen mcpimods Ordner in Ihrem% AppData% \. Minecraft Ordner zu machen, und ein Python - Ordner im mcpimods Ordner. Dann legen Sie den Inhalt des Ordners mcpipy in den Skripten Zip - Datei in das Verzeichnis % AppData% \. Minecraft \ mcpimods \ Python Ordner.

Schritt 4: Test mod

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Starten Sie Minecraft und achten Sie darauf , dass Sie die Forge - Profil verwenden.

Erstellen Sie eine neue Welt (es ist zu einfach, um die Dinge mit den Python-Skripte). Meine Tochter schlug vor, ich benutze Creative und Superflat.

In Minecraft, Typ / python Donut und drücken Sie die Eingabetaste.

Wenn alles gut geht, wird ein riesiger Glas Donut um dich gezogen, und dann wird es mit Wasser gefüllt werden.

Wenn Sie so etwas wie ein Skript nicht gefunden Fehlermeldung erhalten, bedeutet dies wahrscheinlich , dass Sie nicht die Beispielscripts in der% installiert haben AppData% \. Minecraft \ mcpipy Ordner (oder% AppData% \. Minecraft \ mcpimods \ Python für 1.7. 10, aber die Fehlermeldung kann für 1.7.10 unterschiedlich sein).

Wenn Sie ein "Kann nicht ausführen Programm" Python "" Fehlermeldung erhalten, müssen Sie nicht auf Ihre Python - Verzeichnis in Ihrem Systempfad. Sie können es manuell hinzufügen, um den Pfad, oder einfach neu installieren Python, nach den Anweisungen in Schritt 3 meiner Python-Installation Schritt.

Wenn Sie meine Raspberry Jam Mod verwenden für 1,8, können Sie ein Skript stoppen, ohne Argumente nur die Eingabe / Python ausgeführt wird . (Und in Raspberry Jam Mod können Sie abkürzen / python as / py) .

Schritt 5: Erste Schritte Programmierung Minecraft in Python

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Der einfachste Weg, um Minecraft in Python zu starten, ist, mit einem der einfacheren Beispielskripte zu beginnen. Ich empfehle , machen eine Verknüpfung auf dem Desktop in den Ordner Scripts (% AppData% \. Minecraft \ mcpipy für 1,8 oder% AppData% \. Minecraft \ mcpimods \ Python für 1.7.10).

In Ihrem Skript - Verzeichnis, können Sie direkt auf ein beliebiges Skript , und Sie sollten eine Edit mit IDLE Option. Ein Spaß - Skript zu ändern ist mein Wasser gefüllte Krapfen - Skript (donut.py). Zum Beispiel Wasser in der vorletzten Zeile zu GRASS ändern , um eine dumme Gras gefüllten Krapfen zu machen. Sie können dies mit / Python Donut aus Mine laufen, oder einfach nur durch F5 in IDLE drücken.

Oder ein einfaches neues Skript zu machen, erstellen Sie eine helloworld.py Datei mit Ihrem bevorzugten Texteditor (auch Notepad) im Verzeichnis scripts. An der Spitze:

  Von mc import *

Dadurch wird der benötigte Bibliothekscode importiert. Es importiert auch bequem alle Funktionen aus der Mathematik-Bibliothek sowie Namen für alle Blöcke. Herstellen einer Verbindung zu Minecraft mit:

  Mc = Minecraft ()

Sie können dann senden Sie eine "Hallo Welt!" Nachricht an den Benutzer mit:

  Mc.postToChat ( "Hallo Welt!")

Wenn Sie einen Diamant Block direkt unter dem Spieler erstellen möchten, können Sie auch:

  SpielerPos = mc.player.getPos () mc.setBlock (playerPos.x, playerPos.y-1, playerPos.z, DIAMOND_ORE)

Die Koordinaten für setBlock () und getPos () werden von der Spieler Spawn - Punkt gemessen (was also ist (0,0,0)).

(Eine Liste aller Blockbezeichnungen , die nicht DIAMOND_ORE, MCPI \ block.py im Skript - Ordner zu sehen. Sie können auch direkt Mineblocknummern verwenden.)

So führen Sie Ihr Skript, speichern sie und geben Sie / python Hello World in Ihrer Mine Welt und drücken Sie die Eingabetaste.

Es ist manchmal nützlich, ein ganzes rechteckiges Prisma von Blöcken gleichzeitig zu setzen: Verwenden Sie mc.setBlocks (). Zum Beispiel dieser Auszug aus meinem mengersponge.py Skript zeichnet ein 81x81 Würfel an der Spielerposition (das Skript dann löscht rekursiv - dh mit AIR --subblocks ersetzt im Screenshot der fraktalen Bild zu erzeugen):

  Länge = 3 * 3 * 3 * 3 mc.setBlocks (SpielerPos.x, SpielerPos.y, SpielerPos.z, SpielerPos.x + Länge-1, SpielerPos.y + Länge-1, SpielerPos.z + Länge-1, WOOL_PURPLE )

Technischer Hinweis: Beginnend mit von mc import * eine Menge Sachen importiert (Minecraft, Blockdefinitionen, die Definitionen von Instanzen, Mathematik) direkt in unsere Namespace. Dies ist praktisch für die Fokussierung auf das Wesentliche für Anfänger (denken Sie daran, dass ich werde mit dieser Codierung für Anfänger zu lehren). Fortgeschrittenere Benutzer bevorzugen es, mehr pythonisch zu sein, indem die Namespaces getrennt und in den Header gesetzt werden:

  Import mcpi.minecraft als minecraft import mcpi.block als block import mcpi.entity als entity import math

und dann beginnend mit mc = minecraft.Minecraft () oder sogar mc = minecraft.Minecraft.create (), Referenzierbausteinen als block.DIAMOND_ORE usw.

Schritt 6: Einfache Schildkröten-basierte Zeichnung

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Eine besonders einfache Art, in Minecraft zu zeichnen ist die Verwendung eines Schildkröten-basierten Systems. Ich habe eine sehr einfache Klasse Turtle (inspiriert von Martin O'Hanlons MinecraftTurtle Klasse , sondern auch für Stand-alone - Einsatz) , die ich plane , in diesem Sommer zu verwenden , Mittel- und Hochschüler zu Mine Python Scripting einzuführen.

Starten Sie eine Minecraft-Welt im kreativen Modus, und machen Sie Ihren Player fliegen (double-tap-Leertaste). Initialisieren Sie das Skript mit:

  Von turtle import * t = new Turtle ()

(Ich wickelte die alle Mine Verbindung Code innerhalb der Klasse Turtle und es bringt auch Mathe in den Namensraum für die Bequemlichkeit.) Sie jetzt Dinge wie T.GO tun können (15) um eine Linie zu zeichnen , während 15 Blöcke nach vorn bewegen, s.rechts ( 45) zu drehen 45 Grad nach rechts, t.down (30) 30 Grad zu drehen , nach unten und damit einfache Bilder zeichnen.

Sie ziehen zusammen mit der Schildkröte, wie es zeichnet, was Spaß macht, und die Schildkröte beginnt, wo der Spieler ist, zeigt horizontal.

Zum Beispiel können Sie ein horizontales Quadrat mit:

  (50) t.right (90) t.go (50) t.rechts (90) t.go (50)

Du machst einen 7-seitigen Stern, indem du tust:

  (50) t.right (180-180./7)

sieben Mal. Oder nur einmal in einer Schleife:

  Für i im Bereich (7): t.go (50) t.right (180-180./7)

Sie können Materialien mit penblock (ändern). Zum Beispiel ein goldener vertikaler Stern:

  T.penblock (GOLD_BLOCK) für i im Bereich (7): t.go (50) t.right (180-180./7)

Und Sie können die Stiftbreite mit stiftbreite (x) ändern. Zum Beispiel, zieht dies ein sehr einfaches Glas Donut (eigentlich ein verdickter 90-gon, aber wer kann den Unterschied sagen?):

  (10) für i im Bereich (90): t.go (Umfang / 90) t.left (360/90)

Hier sind alle verfügbaren Methoden:

  • gehen (x): move x Blöcke nach vorn (Zeichnung wenn Stift ist unten)
  • zurück (x): move x Blöcke nach hinten (Zeichnung wenn Stift nach unten ist)
  • stifthoch (): Pause Lebenslauf Zeichnung Zeichnung
  • links (Winkel): Drehen Sie den Winkel (in Grad) links
  • rechts (Winkel): nach rechts drehen um den Winkel (in Grad)
  • up (Winkel): Drehen um einen Winkel (in Grad) auf; Anfänger sollten nicht die links / rechts mischen und / Ab - Drehungen oder können sie unerwartete Ergebnisse erhalten (Technische Anmerkung: Die gleiche wie Tonhöhe (Winkel))
  • nach unten (Winkel): von Winkel nach unten drehen (in Grad) (Technische Anmerkung: die gleiche wie Tonhöhe (-Winkel))
  • pendelay (x): jede Bewegung oder Drehung der Schildkröte wird durch x Sekunden verzögert; Standardwert ist 0,05; Auf Null gesetzt für viel schnellere Zeichnung (der Spieler bewegt sich immer noch mit jeder gezeichneten Linie, aber sofort von Anfang bis Ende)
  • Winkel (x): Horizontalwinkel x (im Uhrzeigersinn in Grad; 0 = Süd, 90 = West, 180 = Nord, 270 = Ost) festgelegt; Setzt Rollwinkel zurück
  • verticalangle (x): vertikale Winkel x (in Grad, nach oben ist positiv; 90 = vertikal nach oben; -90 = senkrecht nach unten) festgelegt; Setzt Rollwinkel zurück
  • Winkel (Kompass, vertikal, Rolle): Setzt Kompass, vertikale und Rollwinkel; Ausgelassenen Argumente werden als Null angenommen
  • penblock (x): Setzt Material zum Zeichnen von x zu blockieren; Eine Liste der vordefinierten Blöcke finden MCPI / block.py
  • goto (x, y, z): Setzt Stiftposition auf (x, y, z); Zugriff Sie können auch die Position als t.position.x, t.position.y und t.position.z
  • folgen (): Der Spieler folgt der Schildkröte
  • nofollow (): Der Spieler folgt nicht der Schildkröte
  • Schildkröte (x): wenn x PLAYER ist, ist dies das gleiche wie folgt () und , wenn x None ist, ist dies das gleiche wie nofollow (). Wenn Sie mit Raspberry Jam Mod können Sie auch andere Entitäten als Sie selbst als die Schildkröte. Zum Beispiel Schildkröte (Pferd) laicht ein Pferd wie eine Schildkröte zu verwenden (alle Einheiten verfügbar sind in MCPI / entity.py aufgeführt, aber die Lebenden sind am besten als andere sind nicht in der Lage schweben zu lassen, und der Ender Drachen nicht kontrolliert werden kann) . Die Einheit bleibt, sobald das Skript beendet ist. Um es zu verschwinden, rufen Sie Schildkröte (keine) oder Schildkröte (PLAYER).
  • stiftbreite (x): Set Strichbreite bis x (Standard ist 1; breitere Striche Zeichnung verlangsamen, und wenn Folgemodus aktiviert ist, können Sie in der Schlaganfall eingeschlossen am Ende, so dass am Ende sollten Sie rufen stifthoch () und wieder aus Der Zeichnung)
  • Pitch (x), Gieren (x) und Rolle (x): drehen Schildkröte über Pitch / Gier / Rollwinkel (nächster Schritt der Instructable sehen)
  • startface () und Stirnseite (): Start und ein gefülltes konvexe Polygon Zeichnen fertig
  • push () und pop (): (aber nicht beschleunigen oder Schildkröte Art Überschrift, Material, Gesicht Status, Dicke) Zeichenzustand speichern und wiederherstellen; nützlich für die L-Systeme
  • gridalign (): Richten Sie die aktuelle Position und Schildkröte Richtung an das Netz (die beste Annäherung an die aktuelle Bewegungsrichtung der Schildkröte gewählt wird)

Der mcpiapi mod, im Gegensatz zu meinem Raspberry Jam Mod, unterstützt nicht die Einstellung des Spielers. Dies bedeutet, dass der Spieler nicht die gleiche Richtung wie die Schildkröte. (Und es gibt einige Chance auf andere Probleme mit Schildkröten-Skripte.)

Technischer Hinweis: Wenn Sie bereits ein Objekt Mine mc haben, initialisieren mit t = Schildkröte (mc). Wenn Sie das Objekt Mine weglassen , wenn die Schildkröte zu initialisieren, ist es für Sie erstellt haben , und in jedem Fall, können Sie das Objekt über Mine t.mc zugreifen.

Bonus für Raspberry Jam Mod 0.10 Benutzer:

Sie können auch mit Python-Code für die Kontrolle der Schildkröte direkt aus dem Minecraft-Chat-Fenster spielen. (Wird derzeit nicht von mcpiapi mod. Unterstützt)

In Minecraft, führen Sie das Skript turtleconsole.py eingeben: / py turtleconsole [Enter].

Dann wird jede Python-Zeile, die Sie in den Chat eintragen, vom Python-Interpreter ausgeführt. So geben Sie eine Linie in den Chat, drücken Sie T, geben Sie die Zeile und drücken Sie [Enter]. Zum Verlassen des turtleconsole, geben Sie einfach / py [Enter] oder quit eingeben () [Enter] in den Chat.

Der Kontext enthält eine lokale Variable t auf einer Schildkröte () Objekt initialisiert, so dass Sie jede Initialisierung Code nicht ausgeführt werden müssen, nur Dinge wie:

  T.penblock (GOLD_BLOCK) t.back (10)

Es gibt auch eine Konsole für die gesamte nicht-Turtle - API: console.py (die eine vorinitialisiert mc lokale Variable enthält). (Gib einfach keine postToChat () -Aufrufe ein, oder sie verwirren den Interpreter.)

Schritt 7: Erweiterte Schildkröten-basierte Zeichnung

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Mit der linken (), rechts (), nach oben () und nach unten () Methoden für die Schildkröte ist einfach. Für einige Zeichnungen benötigen wir jedoch eine anspruchsvollere 3D-Steuerung. Zum Beispiel möchten Sie vielleicht einen Krapfen um 45 Grad nach oben ziehen. Es ist verlockend, das Glas Donut-Skript aus dem vorherigen Schritt zu nehmen, und fügen Sie vor der Schleife:

  T (45)

Aber das ergibt ein unerwartetes Ergebnis - siehe das Bild. Der Grund dafür ist, dass die Schildkröte wird die ganze Zeit klettern, während die d.left () -Methode dreht es um die vertikale Achse, und so erhalten Sie eine Spirale.

Stattdessen, was wir tun müssen, ist Gieren / pitch / roll rotatins der Schildkröte. Siehe das Bild von der NASA (US-Regierung Werke sind public domain) erklären, wie die drei Winkel gehen, und nur vorstellen, dass das Flugzeug Ihre Schildkröte ist. (Wegen der Beschränkungen von Minecraft hat der Rollwinkel keinen Einfluss darauf, wie die Schildkröte aussieht, oder die Sichtweise, von der aus Sie sehen.) Was wir tun müssen, um unseren seitlichen Donut zu ziehen, rollt zuerst unsere Schildkröte um 45 Grad mit t.roll (45), und dann beim zeichnen der Donut Verwendung t.yaw (-Winkel) anstelle von t.left (Winkel). Der überarbeitete Code befindet sich im Screenshot.

Was ist schön über die Gier / Nick / Roll-Rotationen ist, dass sie immer relativ zu, wo die Schildkröte zeigt, während left () und right () relativ zur Minecraft-Welt sind.

Schließlich ist hier ein viel weiter fortgeschrittenes Beispiel. Lassen Sie uns einen Baum zeichnen. Hierbei handelt es sich um eine rekursive Funktion. Beginnen Sie damit, damit die Zeichnung so schnell wie möglich erfolgt

  Aus Schildkrötenimport * t = Schildkröte () t.pendelay (0) t.turtle (Keine)

Jetzt machen wir unsere rekursive Baumfunktion. Die Grundidee dahinter ist, dass ein Ast nur ein kleinerer Baum ist. Also machen wir eine Funktion, die einen Zähler und eine Zweiglänge benötigt. Der Zähler gibt an, wie viele Iterationen der Baum gehen wird. Beispielsweise bedeutet der Zähler = 1, dass nur der Stamm gezogen wird, und der Zähler = 1 bedeutet, dass der Stamm und ein Satz von Zweigen gezeichnet werden.

  Def Baum (Zähler, branchLen): if counter == 0: return t.go (branchLen) für i im Bereich (4): t.pitch (30) tree (counter-1, branchLen * 0.75) t.pitch (- 30) t.roll (90) t.back (branchLen)

Zuerst überprüft der Code, ob unser Zähler auf Null heruntergelaufen ist. Wenn ja, haben wir nichts zu zeichnen. Dann ziehen wir einen Stamm. Dann zeichnen wir vier Zweige, die mit einer einfachen Schleife aus ihm herausragen. Um dieses Bit des Codes zu entwerfen, stelle ich mich gerade als die Schildkröte vor, gerade gereizt oben entlang dem Stamm. Um einen Zweig zu zeichnen, ich mich selbst um 30 Grad Neigung nach oben (dh t.pitch (30)) und einen neuen Baum kleinerer Größe ziehen: seine Zähler weniger nach dem anderen, und sein Stamm wird 3/4 der Länge sein Meiner aktuellen Stamm. Ich denke, ich neige mich wieder um 30 Grad. Ich drehe mich um 90 Grad und wiederholen Sie die Übung. Schließlich, sobald ich fertig bin mit den Zweigen, gehe ich wieder den Kofferraum.

Schließlich muss ich nur diesen Code aufrufen. Ich werde einen Baum mit einem Zähler von 6 und einer Anfangszweiglänge von 20 machen. Und für ein gutes Maß mache ich es aus Holz, und natürlich vertikal nach oben:

  (90) Baum (6, 20)

Dieser Fraktalbaum sieht nicht sehr realistisch aus. Wir sollten der Stamm dick machen und die Zweige werden dünner und dünner , wie sie gehen nach außen ( zum Beispiel bekommen halb so dick, bis sie einen einzelnen Block zu erreichen), und wir sollten von WOOD wechseln VERLÄSST Blöcke wie wir ausgehen. Aber am allermeisten sind echte Bäume nicht so regelmäßig. Wir brauchen etwas Zufälligkeit. Die einfachste Form der Zufälligkeit ist nur, um jedem Zweig eine Chance geben, nicht wachsen, sagen, eine 20% Chance. I umgesetzt all dies in meinem fancytree.py Skript . Der resultierende Baum sieht überraschend realistisch für etwas aus, das durch solch ein relativ einfaches Stück Code erzeugt wird. Ein lustiger Nebeneffekt, wie ich es implementiert habe, ist, dass es eine 20% ige Chance gibt, dass nichts gezogen wird, dh der Baum hat eine Chance, nicht zu wachsen, was auch realistisch ist. Und jedes Mal, wenn Sie das Skript, erhalten Sie etwas anderes.

Eine weitere nützliche Eigenschaft der Schildkröte Zeichnung Klasse ist in der Lage, nicht nur Linien, sondern polygonalen Flächen zu zeichnen. Um dies zu tun, nur nicht t.startface (), ziehen Sie Ihre Oberfläche, und dann tun t.endface (). Sobald Sie im Gesicht Modus sind, können Sie jedes Mal eine Linie zeichnen, zieht der Code tatsächlich ein Dreieck: eine Ecke ist der Punkt , die Schildkröte war , als t.startface () aufgerufen wurde und die Linie ist die gegenüberliegende Kante. Dieses zeichnet ein Fünfeck, das auf seiner Seite um 45 Grad gekippt ist:

  (45) t.startface () für i im Bereich (5): t.go (20) t.yaw (360/5) t.endface ()

Schritt 8: L-System Fraktale mit Schildkröte Grafiken

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Zeichne ein Dreieck. Nun nehmen Sie jede Zeile des Dreiecks und ersetzen Sie es durch eine Linie mit einem dreieckigen Bump auf sie. Wiederholen. Wie auf dem animierten Bild (public domain, basierend auf Python-Codierung für Minecraft


), Erhalten Sie eine Schneeflocke Koch .

Dies kann durch ein super-einfaches Schildkröten-Grafikprogramm modelliert werden. Stellen Sie sich vor, dass F bedeutet "nach vorn" und "+" und "-" um 60 Grad, gegen den Uhrzeigersinn und im Uhrzeigersinn drehen. Dann kann das anfängliche Dreieck gezeichnet werden durch:

  F ++ F ++ F

Dh nach vorne, nach rechts um 120 Grad, dann nach vorne, um 120 Grad nach rechts, nach vorne gehen.

Die Dreieckslinie kann folgendermaßen gezeichnet werden:

  F-F ++ FF

So können wir eine Schneeflocke erzeugen. Wir nehmen die anfängliche Schildkröte Programm F ++ F ++ F ein Dreieck zu zeichnen. Jeder F darin repräsentiert eine Linie. So ersetzen Sie jede F durch F-F ++ FF. Wenn wir weitergehen, erzeugen wir die Koch-Schneeflocke.

Dies ist ein einfaches Beispiel für ein L-System. Die Idee hinter einem L-System ist , dass wir mit einer Reihe von Zeichen (in diesem Fall F ++ F ++ F) und dann eine Reihe von Regeln beginnen , wie die Zeichen zu ändern (in diesem Fall ist die eine Regel zu ersetzen F mit F-F ++ FF) in jeder Iteration. Wir wenden dieses eine Reihe von Zeiten an und wir erhalten eine ziemlich komplizierte Zeichenkette. Zum Beispiel, nach zwei Iterationen in der Schneeflocke Fall, erhalten wir:

  F-F ++ F-F ++ F-F ++ F-F ++ F-F ++ F-F ++ F-F ++ F-F ++ FF-F ++ FF-F ++ FF-F ++ FF-F +

Nach vier erhalten wir das Bild oben. (Um wirklich ein Fraktal zu erhalten, sollten die Linien mit jeder Iteration schrumpfen, aber das wird in Minecraft nicht funktionieren.)

Es gibt eine Menge wirklich gute Informationen in diesem kostenlosen PDF - Buch .

Ich schrieb ein sehr einfaches lsystem.py Modul. Zur Umsetzung der Schneeflocke, starten Sie mit Kesselplatte:

  Import lsystem von turtle import * t = Turtle () t.pendelay (0) t.penblock (GOLD_BLOCK)

Jetzt müssen wir die Regeln definieren. Ich definiere die Regeln durch ein Python-Wörterbuch:

  Rules = { 'F': 'F-F ++ FF'}

Als nächstes definieren wir das Axiom oder den Ausgangspunkt:

  Axiom = 'F ++ F ++ F'

Schließlich müssen wir dem System sagen, was jedes Symbol in den Zeichenfolgen bedeutet. Für verschiedene L-Systeme werden wir ihnen verschiedene Bedeutungen zuordnen (zB Rotationen um verschiedene Winkel). Also brauchen wir ein zweites Python-Wörterbuch, das angibt, was für jedes Symbol getan wird. Wenn Sie keine Aktion für ein Symbol angeben, wird das Symbol ignoriert, wenn es für die Schildkröte Zeit ist, die Ausgabe zu zeichnen (es könnte aber für die Erzeugung wichtig sein). Die Bedeutungen werden durch ein Wörterbuch gegeben, das eine Funktion zum Aufrufen für jedes Symbol spezifiziert. Eine Online-Funktionen können mit dem Lambda - Operator angegeben werden. In diesem Fall sind alle Funktionen Einzeiler:

  Lambda: t.go (2), '+': lambda: t.yaw (60), '-': lambda: t.yaw (-60)}

Schließlich rufen wir das L-System auf und geben an, wie viele Iterationen (in diesem Fall 4):

  Lsystem.lsystem (Axiom, Regeln, Wörterbuch, 4)

Es gibt einen speziellen Trick für einige L-Systeme. Diese L-Systeme sind gitterbündig, wobei alle Drehungen 90 Grad betragen. Die quadratische Kurve (squarecurve.py) und Drachenkurve (dragoncurve.py) sind schöne Beispiele. Der Trick ist zu rufen, irgendwo in der Nähe des Anfangs des Codes:

  T.gridalign ()

Dies verschiebt Ihre Schildkröte zu einer ganzzahligen Rasterposition und richtet ihre Überschrift zu einer Rasterrichtung aus. Danach bleibt die Schildkröte exakt gitterbündig, solange man sie nur um ganzzahlige Zahlen verschiebt (z. B. 7, nicht 7.1 und nicht einmal 7. oder 7.0, da es sich um Gleitkommazahlen in Python handelt) und drehen sich nur um ganzzahlige Zahlen Die Vielfache von 90 Grad sind (zB -180 oder 90, aber nicht 90,0 oder 45). Der Drachenkurven-Code gibt auch ein Beispiel für eine Vorwärtsfunktion, die etwas komplizierter ist - anstatt nur eine Linie, zeichnet es eine Wand mit einer Öffnung in ihr.

Eigentlich ruft gridalign () kann manchmal eine gute Idee, auch wenn nicht alle Ihre Winkel rechte Winkel sind. Sie werden wahrscheinlich einige Round-off Probleme in einem großen Bild, aber es kann immer noch besser aussehen. Sehen Sie das Beispiel der Raumfüllung Kurve (in lila Glasmalerei!).

L-Systeme müssen nicht zweidimensional sein. Sie können Symbole, die Gier-, Nick-und Roll-Rotationen. Für das Entwerfen von Bäumen ist es ein nützlicher Trick, Stapelbefehle zu haben: '[', um den aktuellen Zeichnungsstatus in einen Stapel zu speichern und ']', um ihn wiederherzustellen. Dies wird mit dem Drück Schildkröte Modul () und pop () Methoden. Zum Beispiel, hier ist ein Code-Schnipsel für das Zeichnen eines einfachen Baumes (ltree.py):

  t.pitch (90) Regeln = { 'L': '[^ FL]> [^ FL]> [^ FL]} Axiom =' FL 'Wörterbuch = {' F ': lambda: T.GO (10) , '^': lambda: t.pitch (20), '>': Lambda: t.roll (120), '[': lambda: t.push (), ']': lambda: t.pop () } Lsystem.lsystem (Axiom, Regeln, Wörterbuch, 5)

Denken Sie an die L als Blatt (obwohl diese einfache Code eigentlich nicht das Blatt ziehen - das dem Wörterbuch werden müssten hinzugefügt). Wir beginnen mit FL, die ein Stamm und ein Blatt ist. Dann ersetzen wir jedes Blatt von [^ FL]> [^ FL]> [^ FL]. Dies ist ein Satz von drei Zweigen, die jeweils um 20 Grad vom Stamm gekippt, 120 Grad auseinander. Die Halterungen dafür sorgen , dass nach jeder neuen ^ FL gezogen wird, wir sind wieder da, wo wir , bevor es waren. Dies wiederholt sich, so dass die Blätter an den Zweigen durch Dreiergruppen von Zweigen ersetzt werden, und so weiter.

Eine realistischere Baum könnte komplexeren Code für '[' haben. Es könnte die nachfolgenden Zweige kürzer und dünner machen und ihr Material ändern , wie wir auf die Blätter näher (und dann auf Restore ']'). Ich schließe einen solchen Baum als Demo - Code in lsystem.py, basierend auf Regeln (mit einigen Tweaks) aus dem Geeky Blogger .

Sie können auch grid-aligned 3D Dinge. Beispielsweise hat eine Kurve hilbert.py 3D Hilbert.

Schließlich möchten Sie vielleicht eine Randomisierung in die L-Systemregeln einführen. Bisher haben sich unsere Regeln waren deterministisch : eine einzelne Saite gegeben wurde , dass ein Symbol ersetzt, zum Beispiel 'F': 'F-F ++ F-F'. Doch statt eines einfachen Ersatz - String, kann man eine Python - Liste von Paaren (p, string) geben, wobei p eine Wahrscheinlichkeit ist (von 0 bis 1) und string ist der String mit diesem Wahrscheinlichkeit zu verwenden. Die Wahrscheinlichkeiten für ein gegebenes Quellensymbol würden besser nicht mehr als 1 addieren, aber sie können bis zu weniger als eins addieren - in diesem Fall gibt es eine Chance, dass es keinen Ersatz geben wird. Zum Beispiel, hier ist eine leicht randomisierte Version von geeky.blogger's Baum:

  Regeln = { 'A': [(0,55, '^ f [^^ f >>>>>> A] >>> [^^ f >>>>>> A] >>>>> [^^ f >>>>>> A] '), (0,25,' ^ f >> [^^ f >>>>>> A] >>> [^^ f >>>>>> A] ')]}

Diese Regel hat eine 55% ige Chance, ein A durch eine Drei-Zweig-Struktur zu ersetzen, und eine Chance von 25%, es durch eine Zweigstruktur zu ersetzen. Das ist nicht sehr zufällig - mehr Zufälligkeit würde die Dinge noch naturgetreuer machen. Ich füge einen Screenshot von einem ziemlich spärlichen Wald zufällig generiert mit dieser Regel (und zufällige Platzierung von Bäumen, vorbehaltlich einer minimalen Distanz).

Schritt 9: Kartesische Zeichnung

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Ich habe auch eine einfache Klasse für das Zeichnen mit kartesischen Koordinaten. Sie können mit:

  Aus Zeichnung importieren * d = Zeichnung ()

(Diese Initialisierung der Minecraft-Verbindung und bringt Mathematik und Block Namen in den Namespace.) Dann haben Sie mehrere Convenience-Methoden:

  • d.penwidth (x): Sätze Dicke der Punkte / Linien / Flächen
  • d.line (x1, x2, x3, y1, y2, y3, Block): zeichnet Linie von (x1, x2, x3) bis (y1, y2, y3) aus dem Blockmaterial gefertigt
  • d.face (vertex, Block): zieht ein Gesicht mit den Eckpunkten im vertex aus dem Blockmaterial hergestellt

Zum Beispiel können Sie ein Rechteck, das bei 45 Grad aus Glas in Höhe 0 am Spawnpunkt geneigt ist, mit:

  D.face ([(0,0,0), (0,10,10), (10,10,10), (10,0,0)])

Für Spaß, angepasst ich wirklich ordentlich Simon Tatham Polyeder Generation Code der Minezeichenklasse zu verwenden. Sein Code beginnt mit einer Reihe von zufälligen Punkten auf einer Kugel, und dann simuliert sie abstoßen, bis sie zu einer Konfiguration, die oft regelmäßig zu stabilisieren. Dann hat er zwei ordentliche Methoden, aus diesen Punkten ein Polyeder zu machen, eine Gesichtsmethode und eine Scheitelmethode. Ich habe dies in polyhedron.py. Dieses Skript nimmt Befehlszeilenargumente. Zum Beispiel, um ein Ikosaeder verwenden 12 Punkte und die Vertex Konstruktion. Direkt von Minecraft:

  / Python-Polyeder 12 Scheitelpunkt

Für einen Dodekaeder, ändern Scheitel zu stellen. Sie können auch ein weiteres Argument für die Größe hinzufügen. Das Polyeder wird aus Glas mit Steinrändern und wird um den Spieler zentriert werden.

Technischer Hinweis: Wenn Sie bereits ein Objekt mc Minecraft haben, initialisieren mit d = Zeichnung (mc). In beiden Fällen können Sie das Objekt über Mine d.mc zugreifen.

Schritt 10: Empfohlen: Pause bei Verlust des Fokus deaktivieren

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Minecraft pausiert normalerweise das Spiel und geht in das Spiel-Menü, wenn Sie Alt-Tab aus ihm heraus oder sonst verlieren Fokus. Dies macht es schwieriger zu sehen, was Ihre Python-Skripte tun, wenn Sie starten sie von außerhalb von Minecraft. Um das zu tun, ich Ihnen die options.txt Datei in Ihrem Verzeichnis Mine empfehlen bearbeiten (% AppData% \. Minecraft auf Windows), ändern Sie die

  PauseOnLostFocus: true

Zeile zu

  PauseOnLostFocus: false

Und speichern Sie dann, und starten Sie Minecraft neu.

Dies ist besonders für den interaktiven Betrieb von Python-Scripts geeignet. Im Screenshot spiele ich mit Michael O'Hanlons 3D-Schildkröte-Zeichnung (und, ja, das ist Deep Space Nine im Hintergrund).

Schritt 11: Erweiterte Hinweise 1: Zeichnen von Objekten, die durch eine Ungleichung definiert werden

Python-Codierung für Minecraft

Es gibt grundsätzlich zwei verschiedene Techniken für das Zeichnen mathematisch definierter Objekte mit einem Python-Skript in Minecraft.

Ein Weg besteht darin, einen festen Gegenstand durch eine Ungleichung zu definieren. Zum Beispiel kann eine auf (x0, y0, z0) zentrierte Kugel mit dem Radius r durch die Ungleichung definiert werden:

  (X - x0) ** 2 + (y - y0) ** 2 + (z - z0) ** 2 <= r ** 2

(Dh der Abstand zu (x0, y0, z0) höchstens r.) So eine Kugel nur Schleife durch alle Punkte zu zeichnen (x, y, z) in einem Würfel der Seitenlänge 2 * r + 1 umgebende (X0, y0, z0) und zeichnen Sie einen Block, wenn die obige Ungleichung gilt.

Ich habe gelernt , diese Technik aus der Probe nt7s_sphere.py Skript. Beginnen Sie mit dem Standard-Header und init Minecraft-Verbindungscode:

  Von mc import * mc = Minecraft ()

Dann einfach tun:

  Radius = 8 playerPos = mc.player.getPos () für x in Bereich (Radius * -1, Radius): für y in Bereich (Radius * -1, Radius): für z in Bereich (Radius * -1, Radius) : wenn x ** 2 + y ** 2 + z ** 2 <Radius ** 2: mc.setBlock (playerPos.x + x, playerPos.y + y + Radius, playerPos.z - z - 10, Glas)

Dies zieht eine Kugel des angegebenen Radius über dem Spieler und einen kleinen Versatz in der z-Richtung.

Ich benutze die gleiche Technik, aber mit einer komplizierteren Formel, in meinem donut.py Skript (ja, das ist komplizierter als die Schildkröte-basierte Methode):

  Für x im Bereich (-Rr, R + r): für y im Bereich (-Rr, R + r): xy_dist = math.sqrt (x ** 2 + y ** 2) if (xy_dist> 0): ringx = X / xy_dist * R # nächster Punkt auf dem Hauptring ringy = y / xy_dist * R ring_dist_sq = (x-ringx) ** 2 + (y-Ringy) ** 2 für z im Bereich (-Rr, R + r) : if (ring_dist_sq + z ** 2 <= r ** 2): mc.setBlock (mCX + x, mcy + z, MCZ + y, mcblock, mcmeta)

Während die Ungleichungstechnik am besten für feste Formen geeignet ist, können Sie sie für Hohlformen auf zwei Arten verwenden. One way is to use two inequalities, for instance in the case of the sphere one to make sure that we're within the outer radius of the center and another to make sure we're not closer than the inner radius. The other way is just to draw another object with smaller dimensions made out of air inside the larger solid object, much as in my donut.py script, I initially draw a glass donut, and then replace the inside of it with water.

Step 12: Advanced notes 2: Drawing an object defined by a parametric surface

Python-Codierung für Minecraft

Python-Codierung für Minecraft

One can also draw a surface by parametrizing it with two parameters, say a and b, and then looping over a range of these parameters, setting blocks where needed. In my Klein bottle and Mobius strip scripts, I have a general draw_surface() method that lets one do this. For instance, the Mobius strip (see my mobius.py script) is defined by the three formulae:

 x = (3 + a * cos(b/2)) * cos(b) y = a * sin(b/2) z = (3 + a * cos(b/2)) * sin(b)

with a ranging from -1 to 1 and b ranging from 0 to 2*pi (yet another reason why this can be in the pi/e contest?). You can think of b as defining the angle around the circuit, and a moving one from one edge to the other.

Using scripts like this, you need to ensure that in your loops over a and b, the steps are sufficiently small that there are no gaps in the surface. Unless that's the effect you're after.

For details and examples see mobius.py , klein.py and klein2.py .

Step 13: Advanced notes 3: Knots

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

You can find parametric equation for knots on the net. This time, we're going to do things slightly different from before. Before, we had loops driving calls to mc.setBlock() directly. But in our surface plots, such as the Klein bottle, often the same block would get drawn multiple times, which is slow and inefficient. A better way is to keep track of the set of exact blocks that were already drawn to avoid redoing the same thing.

Let me go through an example like that (in knot.py ) to draw a knot. Start with a standard header like:

 from mc import *

We now need to generate our knot. I used the cinquefoil formulas from here . This requires looping a parameter t from 0 to 2*pi, with small enough steps to ensure we don't have gaps. I used 10000 steps. Since this is done in-memory, and computers are fast, and overlapping blocks are only sent once to Minecraft, it's easier to easier to do more steps than to think how many is enough. It's important for the coordinates that go in the dictionary to be integers so we can tell that the same block is being drawing (a block at (1.1,1.2,1.4) and a block at (1,1,1) are the same thing in Minecraft).

We first initialize and set the position of the knot relative to the player. Note that the player position need not be an integer (you might not be standing exactly aligned with a block) and should be turned into an integer.

 mc = Minecraft() playerPos = mc.player.getPos() scale = 12 x0 = int(playerPos.x) y0 = int(playerPos.y + 5*scale) z0 = int(playerPos.z)

Now we make an empty set named done to store the coordinates we've already drawn:

 done = set()

And we draw the set:

 t = 0 while t < 2*pi: x = x0+int( scale * cos(2*t) * (3 + cos(5*t)) ) y = y0+int( scale * sin(2*t) * (3 + cos(5*t)) ) z = z0+int( scale * sin(5*t) ) if (x,y,z) not in done: mc.setBlock(x,y,z,GOLD_BLOCK) done.add((x,y,z)) t += 2*pi / 10000

This only draws data that isn't already drawn. Note that we need to round off the x, y and z coordinates with the int() function. That's the magic behind the overlap removal: when the rounded coordinates are the same, only one block is drawn. (Note: the double parenthesis in the done.add((x,y,z)) line are due to the fact that what we're adding to the set is the coordinate triple (x,y,z) .)

The above code is in knot.py .

The knot would look better if the rope were thicker. There are many ways one can do that. An inefficient way, but easy since computers are fast these days, is just to draw a little ball instead of a point at each pixel. To do that, first I make a little utility function to draw a ball while checking in the done set to ensure there are no duplicate blocks:

 def ball(x0,y0,z0,r,block,done): for x in range(-r,r): for y in range(-r,r): for z in range(-r,r): if (x**2 + y**2 + z**2 <= r**2): if not (x0+x,y0+y,z0+z) in done: mc.setBlock(x0+x,y0+y,z0+z, block) done.add((x0+x,y0+y,z0+z))

This uses the inequality method to fill in a ball at (x0,y0,z0), of radius r.

Then just modify our knot-making while loop to make a ball instead of just a point:

 scale = 10 x0 = int(playerPos.x) y0 = int(playerPos.y + 5*scale) z0 = int(playerPos.z) done = set() t = 0 while t < 2*pi: x = x0+int( scale * cos(2*t) * (3 + cos(5*t)) ) y = y0+int( scale * sin(2*t) * (3 + cos(5*t)) ) z = z0+int( scale * sin(5*t) ) ball(x,y,z,4,GOLD_BLOCK,done) t += 2*pi / 10000

The result is in knot2.py in the sample scripts.

Other sample knots are in trefoil.py , trefoil2.py and borromean.py . If you draw with multiple materials, you can use a dictionary in place of a set, or just go sequentially through the different materials and clear the set before each (that's what I do in trefoil2.py and borromean.py ).

Step 14: Advanced note 4: Flying with your brain

Python-Codierung für Minecraft

Python-Codierung für Minecraft

In another Instructable, I describe how to hack a Mindflex EEG toy to work over Bluetooth. Using python and a modified version of the NeuroPy package , you can now control Minecraft with your brain. Here's how to do it, either with the Mindflex or with a full Mindwave Mobile set. In my example scripts, I do this in the neurosky.py script.

Start by importing relevant packages and initializing Minecraft:

 from mc import * from NeuroPy.NeuroPy import NeuroPy mc = Minecraft()

Then connect to the EEG headset. My hacked Mindflex EEG toy connects to my Windows laptop as COM11 and works over 57600 baud. It also needs a special initialization string to be sent to it to switch it to 57600 baud (and raw mode). This was done with:

 eeg = NeuroPy("COM11",57600,True)

If you have an official Mindwave Mobile (or are using Mindflex but left it at 9600 baud), then you can omit the ",True" part.

Now we set up a simple callback routine that will move you upward (this needs Creative mode) when the "meditation" value from the eeg (which ranges from 0 to 100) goes above 60, and to move downward when it goes below 40:

 up = 60 down = 40 def callback(a): mc.postToChat(a) if a > up: pos = mc.player.getPos() pos.y = pos.y + 1 if mc.getBlock(pos.x,pos.y,pos.z) == block.AIR.id: mc.player.setPos(pos) elif a < down: pos = mc.player.getPos() pos.y = pos.y - 1 if mc.getBlock(pos.x,pos.y,pos.z) == block.AIR.id: mc.player.setPos(pos) eeg.setCallBack("meditation", callback)

For good measure, I posted the meditation value to chat. Now, all we need to do is start up the EEG and inform the user:

 mc.postToChat("Connecting to EEG") eeg.start() mc.postToChat("To fly up, be meditative")

Finally, we need to keep the script from exiting, by starting an endless loop of sleeping:

 while True: time.sleep(10)

(My neurosky.py script is slightly fancier by letting you select whether to work with the "meditation" or the "attention" value from the headset. By default it does attention, but /python neurosky m will start it in meditation mode.)

Then turn on the headset, and start the script with /python scriptname . To stop a script if you're using Raspberry Jam Mod and Minecraft 1.8, you can use the /python command without any argument. (Otherwise, you'll have to set up some exit condition, or just exit Minecraft.)

Step 15: Optional: Visual Studio with Python and Minecraft: Getting started

Python-Codierung für Minecraft

Python-Codierung für Minecraft

If you're running on Windows, the free (for education, open source, individual developers and small businesses) Visual Studio together with the Python Tools is a nice way to develop python code for Minecraft. However, you need a full official Python installation instead of just the Python that is bundled with my Windows mod installer.

A really useful thing is that Visual Studio's code completion will help you with the Minecraft python api. For instance, when you type "block." it will pop up a list of all the block types ( AIR , BED , etc.).

Make sure you have installed Python, the mod, and the sample scripts.

1. Download and install Visual Studio Community Edition 2013.

2. Download and install Python Tools for Visual Studio (PTVS 2.1 VS 2013.msi).

3. Start Visual Studio.

4. Click on "Open Project", search for your sample scripts folder ( %appdata%\.minecraft\mcpipy with Raspberry Jam Mod) and load the mcpipy.sln solution.

5. In the Solution Explorer window on the right, you can choose an existing script to modify, for instance knot2.py (or you can create a new one by clicking on the bold mcpipy in the Solution Explorer and choosing from the main menu "Project", "Add new item", and then choosing "Python" and "Empty module").

Now you can edit the script to your heart's content.

Step 16: Optional: Visual Studio with Python and Minecraft: Running and debugging

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Because we set up all the scripts to be part of one project, to run or debug a script, you need to tell Visual Studio which script is the one you want to run. Right click on the script in the Solution Explorer window (if you lose the Solution Explorer, go to the "Windows" menu and choose "Reset Window Layout") and "Set as Startup File".

You will also want to have Minecraft running with a world opened, or otherwise your script won't be able to connect to Minecraft.

After setting the startup file, you can run by pulling down "Debug", and choosing "Start debugging" (or just press F5) or "Start without debugging" (ctrl-F5). If you choose "Start debugging", the script will run much more slowly, but you will have useful debug features, like the ability to pause the script at any time, step through it step-by-step (there are useful buttons on the toolbar), and examine the variables while running (see the "Autos" and "Locals" boxes).

You can also run in debug mode up to a particular line in the script by right-clicking on the line and choosing "Run to cursor". This is handy if you know that something is wrong in your script around that line, and you want to have a look at the variables at that point. For instance, if you run the knot2.py script up to around the line that invokes draw_data() , you can see the contents of the knot dictionary that stores the list of blocks to be drawn.

Step 17: Additional resources

Python-Codierung für Minecraft

Python-Codierung für Minecraft

Python-Codierung für Minecraft

The best resource for programming Minecraft in python is the Adventures in Minecraft book by Martin O'Hanlon.

O'Hanlon also has a lot of good information on the stuffaboutcode.com site. In particular, he has an API reference here . The Raspberry Jam Mod (and mcpiapi mod) supports just about everything that the Raspberry Juice server plugin does.

The real-time working analog clock in the picture above is from one of the stuffaboutcode scripts (sitting above one of my donuts): /python stuffaboutcode_clock

A rather cool thing that O'Hanlon did was to write a python script to convert Wavefront .obj file to Minecraft. You can download the zip of his script and some object files from here . Then edit minecraft-renderObjv2.py to uncomment the object you want and comment out the others, and add the contents of the zip to your scripts directory. The pictures show the New York City and space shuttle objects he included.

I am planning to teach a summer middle/high school gifted class using python and Minecraft. Suggestions for neat projects for kids are very much welcome in the comments.

Related Reading