Mit allem, was du inzwischen über Python gelernt hast, kannst du in Zukunft nicht nur Plugins programmieren, auch das Programmieren eigener Python-Programme, häufig auch Python-Skripte genannt, sollte dir leicht von der Hand gehen. Natürlich gibt es einige Unterschiede und Besonderheiten, die zu beachten sind, aber die grundsätzlichen Regeln bleiben dieselben. Dieses Kapitel soll dir einen kleinen Ausblick darauf geben, wie du in Zukunft deine Python-Kenntnisse auch außerhalb von Minecraft einsetzen könntest.
Solltest du dich dafür interessieren, so seien dir auch die Bücher »Python für Kids« und »Python 3 – Lernen und professionell anwenden«, die ebenfalls im mitp-Verlag erschienen sind, ans Herz gelegt. Dort wird, nicht nur für Kids, ausführlich erklärt, wie du eigene Programme mit Python erstellen kannst.
Wenn wir heute an Computerprogramme denken, dann denken wir meist sofort an grafische Benutzeroberflächen, Buttons und Grafiken. In einer nicht allzu fernen Vergangenheit war das noch anders: Ein Computerprogramm bestand lediglich aus Text, der in der Kommandozeile ein- und ausgegeben werden konnte. Wenn du anfängst, deine ersten eigenen Programme zu schreiben, wirst du dich vorübergehend in diese Zeit zurückversetzt fühlen.
Wie du Informationen auf der Kommandozeile ausgeben kannst, hast du bereits im »Hallo Welt«-Programm gesehen. Der print
-Befehl funktioniert in Plugins und »normalen« Python-Programmen. Andere Befehle wie sendMessage
oder broadcastMessage
funktionieren dagegen nur in Minecraft-Plugins.
Wie es schon bei den Plugins der Fall war, werden auch Programme erst richtig interessant, wenn sie Daten verarbeiten können, die der Nutzer eingibt. Glücklicherweise geht das, wie du in Listing 16.2 sehen kannst, sehr einfach.
1 name = input("Wie heisst du? ")
2 print("Hallo " + name)
Listing 16.2: Einlesen einer Eingabe
Solltest du eine Version 2.x von Python verwenden, dann lautet der Befehl raw_input
, statt input
.
Der Befehl input
wartet auf die Eingabe eines Spielers. In Klammern kann ihm ein Text übergeben werden, der dem Benutzer erklärt, welche Eingabe erwartet wird. Das Programm bleibt dann solange an dieser Stelle stehen, bis der Benutzer eine Eingabe vornimmt und diese mit Enter bestätigt. Diese Eingabe wird dann von der Funktion als Rückgabewert an dein Programm geliefert und die Ausführung geht ganz normal weiter. Die Ausgabe des Programmes sieht dann wie in Abbildung 16.3 gezeigt aus.
Besteht eine Eingabe aus Zahlen, so werden diese zunächst, wie du es bereits von den Plugins kennst, ebenfalls als String gespeichert und müssen umgewandelt werden, bevor zum Beispiel mit ihnen gerechnet werden kann.
Damit sind wir auch schon fast am Ende unseres kurzen Ausflugs in die Welt der Python-Programme angekommen. Allerdings nicht, bevor wir nicht zumindest ein kleines Spiel selbst programmiert haben. Das nächste Minecraft werden wir an dieser Stelle wohl noch nicht entwickeln können, aber ein unterhaltsames Quiz sollte dir bereits problemlos gelingen.
Der Aufbau soll dabei ganz klassisch sein: Der Spieler bekommt eine Frage gestellt und wählt eine von vier Antwortmöglichkeiten aus, von denen selbstverständlich nur eine richtig ist.
Zu Beginn solltest du eine Klasse wie in Listing 16.3 anlegen, die für die Repräsentation einer Frage zuständig ist. Die Klasse muss den Fragetext, die richtige Antwort und drei falsche Antworten speichern. Diese Klasse kannst du in deinem eben erstellten Ordner in einer Datei mit dem Namen frage.py
speichern.
1 class Frage:
2 def __init__(self, frage, richtige_antwort, falsche_antworten):
3 self.__frage = frage
4 self.__falsche_antworten = falsche_antworten
5 self.__richtige_antwort = richtige_antwort
6
7 def get_frage(self):
8 return self.__frage
9
10 def get_falsche_antworten(self):
11 return self.__falsche_antworten
12
13 def get_richtige_antwort(self):
14 return self.__richtige_antwort
Listing 16.3: Frage
-Klasse
In Kapitel 5 wurden Konventionen für die Schreibung von Variablennamen eingeführt. Vielleicht erinnerst du dich noch daran, dass Variablen in Python eigentlich komplett kleingeschrieben werden und verschiedene Worte durch Unterstriche getrennt werden. Für die Programmierung von Plugins haben wir, da der Minecraft-Server in Java geschrieben ist, auf die Java-Konvention zurückgegriffen, die Binnenmajuskel verwendet. Da wir nun unabhängig vom Server arbeiten, können wir auch zur üblichen Python-Konvention zurückkehren und Unterstriche verwenden.
Für das eigentliche Quiz kannst du eine weitere Datei anlegen, die den Namen quiz.py
trägt. Da sich beide Dateien im selben Ordner befinden, funktioniert der Import der Frage-Klasse innerhalb der Quiz-Datei, wie du in Listing 16.4 sehen kannst, denkbar einfach. Als from
wird einfach der Dateiname ohne .py
-Endung angegeben und als import
der Klassenname.
1 from frage import Frage
2
3 fragen = []
4
5 fragen.append(Frage("Wie heisst die Hauptstadt von Frankreich?", "Paris", ["Bruessel", "Lyon", "Marseille"]))
6
7 fragen.append(Frage("Wie ist der Spitzname des Minecraft-Erfinders?", "notch", ["motch", "scotch", "botch"]))
8
9 fragen.append (Frage("Wie viele Bundeslaender hat die Bundesrepublik Deutschland?", "16", ["15", "17", "18"]))
10
11 fragen.append (Frage("Wie heisst die Hauptstadt der Steiermark?", "Graz", ["Wien", "Hartberg", "Eisenstadt"]))
Listing 16.4: Grundgerüst des Quiz
Ist die Klasse erst einmal importiert, so kannst du, wie ebenfalls in Listing 16.4 gezeigt, sehr einfach neue Fragen hinzufügen. Nun müssen die Fragen aber natürlich auch noch ausgegeben und auf die Antwort gewartet werden.
Du kannst die Fragen entweder in der Reihenfolge anzeigen, in der sie eingegeben wurden, oder in einer zufälligen Reihenfolge, wenn du eine etwas ausgeklügeltere Umsetzung wählst. Für letzteres kannst du wie in Listing 16.5 auf den dir bereits bekannten Zufallsgenerator zurückgreifen. Um zu verhindern, dass Fragen doppelt angezeigt werden, kannst du sie einfach mit dem dir bereits aus Kapitel 5 bekannten remove
-Befehl aus der Liste der Fragen löschen, nachdem sie angezeigt wurden.
1 while(len(fragen) > 0):
2 zufallszahl = random.randint(0, len(fragen)-1)
3 frage = fragen[zufallszahl]
4 fragen.remove(zufallszahl)
5 print(frage.get_frage())
Listing 16.5: Randomisierte Anzeige der Fragen
Neben dem Fragetext selbst müssen dem Nutzer als nächstes noch die Antwortmöglichkeiten angezeigt werden. Hier solltest du wie in Listing 16.6 auf jeden Fall auf eine zufällige Reihenfolge setzen, denn wenn die richtige Antwort auf jede Frage immer die erste Antwortmöglichkeit ist, verliert das Quiz schnell seinen Reiz.
1 while(len(fragen) > 0):
2 zufallszahl = random.randint(0, len(fragen)-1)
3 frage = fragen[zufallszahl]
4 fragen.remove(zufallszahl)
5 print(frage.get_frage())
6
7 antworten = frage.get_falsche_antworten()
8
9 antworten.append(frage.get_richtige_antwort())
10 random.shuffle(antworten)
11
12 for i in range(0, len(antworten)):
13 print(str(i) + ": " + antworten[i], end=" ")
14 print("")
Listing 16.6: Anzeige der Antwortmöglichkeiten
Die zufällige Reihenfolge wird in Listing 16.6 durch den Befehl shuff
le
sichergestellt, der die Elemente eines Arrays zufällig durcheinander würfelt. Neu ist auch, dass der pr
int
-Befehl noch den Zusatz end=" "
bekommt. Dieser sorgt dafür, dass die Antwortmöglichkeiten alle in einer Reihe stehen und nicht, wie normal, nach jedem print
-Befehl eine neue Reihe begonnen wird. Dafür brauchen wir dann aber in der letzten Reihe einen zusätzlichen print
-Befehl, der die Reihe mit den Antwortmöglichkeiten beendet.
Als nächstes muss nun noch die Antwort des Spielers eingelesen werden. Genau der richtige Einsatz für die input
-Funktion also. Dabei solltest du bedenken, dass deine Nutzer möglicherweise nicht immer eine der Antwortmöglichkeiten, 0, 1, 2 oder 3, eingeben, sondern beliebigen anderen Text oder Zahlen. Deshalb solltest du, bevor du »Falsch« oder »Richtig« ausgibst, zunächst auf jeden Fall prüfen, ob es sich überhaupt um eine gültige Eingabe handelt. Mit der Funktion isdigit
kannst du prüfen, ob es sich bei einem String um eine positive Zahl handelt. Das reicht allerdings noch nicht ganz aus, deshalb solltest du im nächsten Schritt auch noch überprüfen, ob diese Zahl kleiner als vier ist.
1 while(len(fragen) > 0):
2 zufallszahl = random.randint(0, len(fragen)-1)
3 frage = fragen[zufallszahl]
4 fragen.remove(zufallszahl)
5 print(frage.get_frage())
6
7 antworten = frage.get_falsche_antworten()
8
9 antworten.append(frage.get_richtige_antwort())
10 random.shuffle(antworten)
11
12 for i in range(0, len(antworten)):
13 print(str(i) + ": " + antworten[i], end=" ")
14 print("")
15
16 antwort = input("Bitte waehle deine Antwort: ")
17 if antwort.isdigit() & int(antwort) < 4:
18 if antworten[int(antwort)] == frage.get_richtige_antwort():
19 print("Richtig!")
20 else:
21 print("Falsch")
22 else:
23 print("Bitte gib eine Zahl zwischen 0 und 3 als Antwort ein.")
Listing 16.7: Einlesen der Antwort
Nun musst du nur noch die einzelnen Teile des Quiz zusammenführen und die erforderlichen Importe hinzufügen. Wie das Endergebnis aussehen sollte, kannst du in Listing 16.8 sehen.
1 import random
2 from frage import Frage
3
4 fragen = []
5
6 fragen.append(Frage("Wie heisst die Hauptstadt von Frankreich?", "Paris", ["Bruessel", "Lyon", "Marseille"]))
7
8 fragen.append(Frage("Wie ist der Spitzname des Minecraft-Erfinders?", "notch", ["motch", "scotch", "botch"]))
9
10 fragen.append (Frage("Wie viele Bundeslaender hat die Bundesrepublik Deutschland?", "16", ["15", "17", "18"]))
11
12 fragen.append (Frage("Wie heisst die Hauptstadt der Steiermark?", "Graz", ["Wien", "Hartberg", "Eisenstadt"]))
13
14 while(len(fragen) > 0):
15 zufallszahl = random.randint(0, len(fragen)-1)
16 frage = fragen[zufallszahl]
17 fragen.remove(zufallszahl)
18 print(frage.get_frage())
19
20 antworten = frage.get_falsche_antworten()
21
22 antworten.append(frage.get_richtige_antwort())
23 random.shuffle(antworten)
24
25 for i in range(0, len(antworten)):
26 print(str(i) + ": " + antworten[i], end=" ")
27 print("")
28
29 antwort = input("Bitte waehle deine Antwort: ")
30 if antwort.isdigit() & int(antwort) < 4:
31 if antworten[int(antwort)] == frage.get_richtige_antwort():
32 print("Richtig!")
33 else:
34 print("Falsch")
35 else:
36 print("Bitte gib eine Zahl zwischen 0 und 3 als Antwort ein.")
Listing 16.8: Komplettes Quiz
Damit sind wir auch schon am Ende dieses Buches und unseres kurzen Ausflugs in die Welt der Python-Programme angekommen. Ich hoffe, er hat dich auf die Möglichkeiten neugierig gemacht, die du als Python-Programmierer nun hast. Denn wenn du weiter am Ball bleibst und mehr über das Programmieren lernst, ist das, was du in diesem Buch gesehen und gelernt hast, erst der Anfang. Viel Spaß dabei!