Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Dieses Buch wird Ihnen beibringen, wie man Computerspiele mit der beliebten Python- Programmiersprache entwickelt – auch wenn Sie noch nie zuvor programmiert haben! Beginnen Sie mit dem Entwurf klassischer Spiele wie Galgenmännchen, einem Zahlenratespiel und Tic-Tac-Toe. Mit fortgeschrittenen Spielen bauen Sie Ihre Programmierkenntnisse weiter aus, beispielsweise mit einer textbasierten Schatzsuche und einem animierten Kollisionsspiel mit Soundeffekten. Dabei lernen Sie grundlegende Konzepte der Programmierung und der Mathematik, die Ihnen helfen, Ihre Spieleprogrammierung auf die nächste Stufe zu heben. Lernen Sie, wie Sie • Loops, Variablen und Flusssteuerungsanweisungen in funktionierenden Programmen kombinieren. • die richtigen Datenstrukturen für die jeweilige Aufgabe einsetzen, also Listen, Dictionarys und Tupel. • mit dem pygame-Modul Ihre Spiele mit Grafiken und Animation bereichern. • Benutzereingaben über Tastatur und Maus in Ihren Spielen einsetzen. • einfache künstliche Intelligenz programmieren, um gegen den Computer zu spielen. • Kryptografie verwenden, um Text in geheimen Code zu verschlüsseln. • Ihre Programme debuggen und Fehler aufspüren. Entdecken Sie mit diesem Buch spielerisch das Potenzial von Python – und programmieren Sie schon bald Ihre eigenen Spiele!
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 477
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Zu diesem Buch – sowie zu vielen weiteren dpunkt.büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei dpunkt.plus+:
www.dpunkt.plus
Al Sweigart
Der spielerische Weg zur Programmiersprache
Al Sweigart
Lektorat: Gabriel Neumann
Fachgutachterin (amerikanische Ausgabe): Ari Lacenski
Copy-Editing: Claudia Lötschert
Übersetzung & Satz: G&U Language & Publishing Services GmbH, www.gundu.com
Herstellung: Nadine Thiele
Umschlaggestaltung: Helmut Kraus, www.exclam.de
nach der Originalvorlage von No Starch Press
Druck und Bindung: M.P. Media-Print Informationstechnologie GmbH, 33100 Paderborn
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN:
Print 978-3-86490-492-9
PDF 978-3-96088-322-7
ePub 978-3-96088-323-4
mobi 978-3-96088-324-1
1. Auflage 2017
Translation Copyright für die deutschsprachige Ausgabe © 2017 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Copyright © 2017 by Al Sweigart. Title of English-language original: Invent Your Own Computer Games with Python, 4th Edition, ISBN 978-1-59327-795-6, published by No Starch Press.
German-language edition copyright © 2017 by dpunkt.verlag. All rights reserved.
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.
5 4 3 2 1 0
Der Autor
Die Fachgutachterin der amerikanischen Ausgabe
Danksagung
Einleitung
Zielgruppe
Der Aufbau dieses Buches
Die Codebeispiele
Zeilennummern und Einrückungen
Lange Codezeilen
Python herunterladen und installieren
IDLE starten
Online Hilfe finden
1 Die interaktive Shell
Einfaches Rechnen
Integer und Fließkommazahlen
Ausdrücke
Ausdrücke auswerten
Syntaxfehler
Werte in Variablen speichern
Zusammenfassung
2 Programme schreiben
Stringwerte
Stringverkettung
Programme im Dateieditor von IDLE schreiben
Das Hello-World-Programm schreiben
Das Programm speichern
Das Programm ausführen
So funktioniert das Hello-World-Programm
Kommentare
Funktionen: Miniprogramme innerhalb von Programmen
Das Ende des Programms
Variablennamen
Zusammenfassung
3 Zahlen raten
Ein Beispieldurchlauf des Zahlenratespiels
Der Quellcode für das Zahlenratespiel
Das Modul random importieren
Zufallszahlen mit der Funktion random.randint() erzeugen
Den Spieler begrüßen
Flusssteuerungsanweisungen
Code in Schleifen wiederholen
Blöcke
for-Schleifen
Die Vermutung des Spielers abrufen
Werte mit den Funktionen int(), float() und str() umwandeln
Boolesche Werte
Vergleichsoperatoren
Bedingungen
Experimente mit booleschen Werten, Vergleichsoperatoren und Bedingungen
if-Anweisungen
Schleifen mit break vorzeitig abbrechen
Wenn der Spieler gewonnen hat
Wenn der Spieler verloren hat
Zusammenfassung
4 Ein Kalauerprogramm
Ein Beispieldurchlauf von Jokes
De Quellcode für Jokes
Funktionsweise des Codes
Maskierungszeichen
Einfache und doppelte Anführungszeichen
Der Schlüsselwortparameter end der Funktion print()
Zusammenfassung
5 Im Reich der Drachen
Spielverlauf von Dragon Realm
Ein Beispieldurchlauf von Dragon Realm
Das Flussdiagramm für Dragon Realm
Quellcode von Dragon Realm
Die Module random und time importieren
Funktionen
def-Anweisungen
Funktionen aufrufen
Wohin mit Funktionsdefinitionen?
Mehrzeilige Strings
while-Schleifen
Boolesche Operatoren
Der Operator and
Der Operator or
Der Operator not
Ausdrücke mit booleschen Operatoren auswerten
Rückgabewerte
Globaler und lokaler Gültigkeitsbereich
Funktionsparameter
Das Ergebnis anzeigen
Die Höhle mit dem freundlichen Drachen bestimmen
Die Hauptschleife des Spiels
Die Funktionen aufrufen
Neue Runde
Zusammenfassung
6 Der Debugger
Fehlerarten
Der Debugger
Den Debugger starten
Das Programm im Debugger schrittweise durchlaufen
Fehler finden
Haltepunkte setzen
Haltepunkte verwenden
Zusammenfassung
7 Galgenmännchen: Entwurf mit einem Flussdiagramm
Die Regeln für Galgenmännchen
Ein Beispieldurchlauf von Galgenmännchen
ASCII-Grafik
Programme mit Flussdiagrammen entwerfen
Das Flussdiagramm zeichnen
Verzweigungen in Flussdiagrammen
Das Spiel beenden oder neu starten
Erneut raten
Rückmeldung an den Spieler
Zusammenfassung
8 Galgenmännchen: Der Code
Der Quellcode von Galgenmännchen
Das Modul random importieren
Konstanten
Der Datentyp für Listen
Zugriff auf Listenelemente über den Index
Listenverkettung
Der Operator in
Methoden
Die Listenmethoden reverse() und append()
Die Methode split()
Ein Wort aus der Liste auswählen
Die Grafik anzeigen
Die Funktionen list() und range()
Listen- und Stringslices
Das zu erratende Wort mit Leerstellen anzeigen
Die Rateversuche des Spielers abrufen
Die Stringmethoden lower() und upper()
Die while-Schleife verlassen
elif-Anweisungen
Die Eingabe eines gültigen Werts sicherstellen
Dem Spieler eine weitere Runde anbieten
Die Funktionen im Galgenmännchen-Programm
Die Hauptschleife des Spiels
Die Funktion displayBoard() aufrufen
Den Spieler raten lassen
Gehört der Buchstabe zu dem Wort?
Hat der Spieler gewonnen?
Fehlversuche handhaben
Hat der Spieler verloren?
Das Spiel beenden oder zurücksetzen
Zusammenfassung
9 Galgenmännchen: Erweiterungen
Mehr Rateversuche hinzufügen
Dictionarys
Die Größe eines Dictionarys mit len() bestimmen
Der Unterschied zwischen Dictionarys und Listen
Die Dictionary-Methoden keys() und values()
Dictionarys in Galgenmännchen
Zufällige Auswahl aus einer Liste
Elemente aus Listen entfernen
Mehrfachzuweisung
Die Wortkategorie ausgeben
Zusammenfassung
10 Tic-Tac-Toe
Ein Beispieldurchlauf von Tic-Tac-Toe
Der Quellcode von Tic-Tac-Toe
Das Programm entwerfen
Das Spielbrett in Form von Daten darstellen
Die Strategie der Spiel-KI
Das Modul random importieren
Das Spielbrett anzeigen
Den Spieler zwischen X und O wählen lassen
Den ersten Zug auswürfeln
Eine Markierung auf dem Spielbrett vornehmen
Listenverweise
Listenverweise in makeMove()
Hat der Spieler gewonnen?
Die Spielbrettdaten duplizieren
Ist ein Feld belegt?
Einen Zug vom Spieler abrufen
Kurzschlussauswertung
Einen Zug von einer Zugliste auswählen
Der Wert None
Die KI gestalten
Prüfung auf einen Gewinnzug des Computers
Prüfung auf einen Gewinnzug des Spielers
Ecken, Mitte und Seitenfelder prüfen
Ist das Brett voll?
Die Hauptschleife des Spiels
Den Spielerbuchstaben auswählen und den ersten Zug auslosen
Der Zug des Spielers
Der Zug des Computers
Eine weitere Spielrunde anbieten
Zusammenfassung
11 Bagels
Ein Beispieldurchlauf von Bagels
Der Quellcode von Bagels
Das Flussdiagramm für Bagels
Import von random() und Definition von getSecretNum()
Ziffern durcheinanderwürfeln
Reihenfolge von Listenelementen mit random.shuffle() ändern
Die Geheimzahl aus durcheinandergewürfelten Ziffern zusammenstellen
Erweiterte Zuweisungsoperatoren
Berechnungen für die Hinweise
Die Listenmethode sort()
Die Stringmethode join()
Besteht der String nur aus Ziffern?
Das Spiel starten
Stringinterpolation
Die Hauptschleife des Spiels
Die Vermutung des Spielers abrufen
Die Hinweise gewinnen
Auf Sieg oder Niederlage prüfen
Nach einer weiteren Runde fragen
Zusammenfassung
12 Kartesische Koordinaten
Raster und kartesische Koordinaten
Negative Zahlen
Das Koordinatensystem eines Computerbildschirms
Rechentricks
Trick 1: Ein Minuszeichen verschlingt ein Pluszeichen zu seiner Linken
Trick 2: Zweimal Minus gibt Plus
Trick 3: Zwei Zahlen in einer Addition können den Platz tauschen
Beträge und die Funktion abs()
Zusammenfassung
13 Sonar-Schatzsuche
Ein Beispieldurchlauf der Sonar-Schatzsuche
Der Quellcode für die Sonar-Schatzsuche
Entwurf des Programms
Die Module random, sys und math importieren
Ein neues Spielbrett erstellen
Das Spielbrett zeichnen
Die x-Koordinaten am oberen Rand des Spielbretts zeichnen
Das Meer zeichnen
Eine Meeresreihe ausgeben
Die x-Koordinaten am unteren Rand ausgeben
Die zufällig verteilen Schatztruhen erstellen
Die Gültigkeit eines Zugs bestimmen
Einen Zug auf dem Spielbrett machen
Die nächstgelegene Schatztruhe finden
Werte mit der Listenmethode remove() entfernen
Den Zug des Spielers abrufen
Die Spielanleitung ausgeben
Die Hauptschleife des Spiels
Den Spielzustand anzeigen
Den Zug des Spielers verarbeiten
Eine Schatztruhe finden
Hat der Spieler gewonnen?
Hat der Spieler verloren?
Das Programm mit der Funktion sys.exit() beenden
Zusammenfassung
14 Die Caesar-Chiffre
Kryptografie und Verschlüsselung
Funktionsweise der Caesar-Chiffre
Ein Beispieldurchlauf der Caesar-Chiffre
Der Quellcode für die Caesar-Chiffre
Die maximale Schlüssellänge festlegen
Auswahl zwischen Ver- und Entschlüsselung
Die Nachricht vom Benutzer abrufen
Den Schlüssel vom Benutzer abrufen
Die Nachricht verschlüsseln oder entschlüsseln
Strings mit der Methode find() finden
Die einzelnen Buchstaben ver- bzw. entschlüsseln
Das Programm starten
Brute-Force-Entschlüsselung
Den Brute-Force-Modus hinzufügen
Zusammenfassung
15 Reversegam
Die Spielregeln von Reversegam
Ein Beispieldurchlauf von Reversegam
Der Quellcode von Reversegam
Module importieren und Konstanten einrichten
Die Datenstruktur für das Spielbrett
Die Datenstruktur für das Spielbrett auf dem Bildschirm ausgeben
Eine neue Datenstruktur für das Brett erstellen
Züge auf Gültigkeit prüfen
Die acht Richtungen prüfen
Prüfen, ob Steine gedreht werden müssen
Prüfen auf gültige Koordinaten
Eine Liste mit allen gültigen Zügen bekommen
Die Funktion bool() aufrufen
Die Punktzahl des Spielbretts ermitteln
Die Steinwahl des Spielers abfragen
Entscheiden, wer beginnt
Einen Spielstein auf dem Brett platzieren
Die Datenstruktur des Spielbretts kopieren
Bestimmen, was eine Ecke ist
Den Spielzug abfragen
Der Zug des Computers
Strategische Züge in Ecken
Eine Liste der besten Züge erstellen
Die Punkte auf dem Bildschirm ausgeben
Das Spiel starten
Ein Patt erkennen
Der Spieler ist am Zug
Der Spielzug des Computers
Die Spielschleife
Fragen, ob der Spieler erneut spielen möchte
Zusammenfassung
16 Reversegam-KI-Simulation
Der Computer spielt gegen sich selbst
Ein Beispieldurchlauf von Simulation 1
Der Quellcode für Simulation 1
Die Spielereingaben entfernen und einen Computerspieler hinzufügen
Den Computer mehrfach gegen sich selbst spielen lassen
Ein Beispieldurchlauf von Simulation 2
Quellcode für Simulation 2
Den Überblick über mehrere Spiele behalten
Die Funktionsaufrufe print() auskommentieren
Die KI mit Prozentsätzen bewerten
Die verschiedenen KI-Algorithmen vergleichen
Quellcode für Simulation 3
Wie die KI in Simulation 3 funktioniert
Die KI miteinander vergleichen
Zusammenfassung
17 Grafik einsetzen
pygame installieren
Hello World in pygame
Beispieldurchlauf des pygame Hello World
Quellcode für pygame Hello World
Das Modul pygame importieren
pygame initialisieren
Das pygame-Fenster einrichten
Tupel
Surface-Objekte
Farb-Variablen einrichten
Im pygame-Fenster Text ausgeben
Text mit Schriftarten formatieren
Ein Font-Objekt ausgeben
Die Textposition mit Rect-Attributen festlegen
Ein Surface-Objekt mit Farbe füllen
Die Zeichenfunktionen von pygame
Ein Polygon zeichnen
Eine Linie zeichnen
Einen Kreis zeichnen
Eine Ellipse zeichnen
Ein Rechteck zeichnen
Pixel färben
Die blit()-Methode für Surface-Objekte
Das Surface-Objekt auf dem Bildschirm ausgeben
Ereignisse und die Game-Schleife
Ereignis-Objekte erhalten
Das Programm beenden
Zusammenfassung
18 Grafiken animieren
Beispieldurchlauf des Animationsprogramms
Der Quellcode für das Animationsprogramm
Kästen bewegen und abprallen lassen
Die Konstanten einrichten
Konstanten für die Richtung
Konstanten für die Farbe
Datenstrukturen für die Kästen einrichten
Die Game-Schleife
Wenn der Spieler aufhören möchte
Die Kästen bewegen
Einen Kasten abprallen lassen
Kästen an ihren neuen Positionen im Fenster zeichnen
Das Fenster auf den Bildschirm zeichnen
Zusammenfassung
19 Kollisionserkennung
Beispieldurchlauf der Kollisionserkennung
Der Quellcode für die Kollisionserkennung
Die Module importieren
Das Programm mit einem Zeitgeber steuern
Das Fenster und die Datenstrukturen einrichten
Variablen zur Bewegungsverfolgung einrichten
Ereignisse verarbeiten
Das KEYDOWN-Ereignis
Das Ereignis KEYUP
Den Spieler teleportieren
Neue Nahrungsquadrate hinzufügen
Den Spieler im Fenster bewegen
Den Spieler im Fenster zeichnen
Auf Kollisionen prüfen
Die Nahrungsquadrate im Fenster zeichnen
Zusammenfassung
20 Toneffekte und Bilder
Bilder mit Sprites hinzufügen
Ton-und Bilddateien
Beispieldurchlauf des Sprites- und Sound-Programms
Der Code für das Sprites- und Sounds-Programm
Das Fenster und die Datenstruktur einrichten
Ein Sprite hinzufügen
Die Größe eines Sprites verändern
Die Musik und die Toneffekte einrichten
Sound-Dateien hinzufügen
Den Ton ein- und ausschalten
Den Spieler im Fenster zeichnen
Auf Kollisionen prüfen
Die Kirschen im Fenster zeichnen
Zusammenfassung
21 Dodger mit Ton und Grafik
Wiederholung: Die grundlegenden Datentypen in pygame
Ein Beispieldurchlauf von Dodger
Der Quellcode von Dodger
Die Module importieren
Die Konstanten einrichten
Funktionen definieren
Das Spiel beenden und unterbrechen
Kollisionen mit Gegnern feststellen
Text in das Fenster zeichnen
pygame initialisieren und das Fenster einrichten
Schrift-, Klang- und Bildobjekte einrichten
Den Startbildschirm anzeigen
Das Spiel starten
Die Spielschleife
Tastaturereignisse
Mausbewegungen
Neue Gegner hinzufügen
Die Figur des Spielers und die Gegner bewegen
Die Cheats
Gegner entfernen
Das Fenster zeichnen
Den Punktestand ausgeben
Die Spielerfigur und die Gegner zeichnen
Auf Kollisionen prüfen
Game Over
Das Spiel abwandeln
Zusammenfassung
Stichwortverzeichnis
Für Caro
Al Sweigart ist Softwareentwickler, Fachbuchautor und ein echter Frood, der weiß, wo sein Handtuch ist. Er hat mehrere Programmierbücher für Einsteiger geschrieben, darunter Routineaufgaben mit Python automatisieren und Coole Spiele mit Scratch, die ebenfalls beim dpunkt.verlag erschienen sind. Auf seiner Website https://inventwithpython.com/ stehen seine Bücher unter einer Creative-Commons-Lizenz auch kostenlos zur Verfügung.
Ari Lacenski ist Entwicklerin für Android-Anwendungen und Python-Software. Sie lebt in Bay Area, wo sie auf http://gradlewhy.ghost.io/ über Android-Programmierung schreibt und als Mentorin für Women Who Code dient.
Ohne die herausragende Arbeit des Teams von No Starch Press wäre dieses Buch nicht möglich gewesen. Ich danke meinem Herausgeber Bill Pollock und meinen Lektoren Laurel Chun, Jan Cash und Tyler Ortman für ihre unglaubliche Hilfe während des gesamten Vorgangs, meiner Fachgutachterin Ari Lacenski für ihre gründliche Durchsicht und Josh Ellingson für ein weiteres hervorragendes Titelbild.
Die ersten Videospiele, die ich im Kindesalter spielte, machten mich süchtig. Ich wollte sie nicht nur spielen, ich wollte selbst so etwas gestalten. Damals fand ich ein Buch, das mir zeigte, wie ich eigene erste Programme und Spiele schreiben konnte. Das machte Spaß und war ganz einfach. Die ersten Spiele, die ich entwickelte, waren ähnlich wie diejenigen in diesem Buch. Sie waren nicht so ausgefeilt wie die Nintendo-Spiele, die meine Eltern für mich kauften, aber sie waren mein eigenes Werk.
Jetzt, als Erwachsener, habe ich immer noch Spaß am Programmieren und werde sogar dafür bezahlt. Doch auch wenn Sie nicht vorhaben, Programmierer zu werden, ist Programmierung eine nützliche und unterhaltsame Fähigkeit. Sie schulen sich dabei, logisch zu denken, planvoll vorzugehen und ihre Ideen kritisch zu betrachten, wenn Sie Fehler in Ihrem Code gefunden haben.
Viele Programmierbücher für Einsteiger fallen in eine von zwei verschiedenen Kategorien. Die erste Art von Büchern konzentriert sich so sehr auf »Spielentwicklungssoftware« oder stark vereinfachende Sprachen, dass man das, was da gelehrt wird, gar nicht mehr als »Programmieren« bezeichnen kann. Die zweite Kategorie umfasst Bücher, die Programmierung in der Art eines Mathebuchs abhandeln: lauter Lehrsätze und Begriffe, aber nur wenige praktische Anwendungen für die Leser. Das vorliegende Buch verfolgt einen anderen Ansatz und bringt Ihnen das Programmieren am Beispiel von Videospielen bei. Ich stelle Ihnen den Quellcode der Spiele jeweils zu Anfang vor und erkläre dann die Programmierprinzipien anhand dieser Beispiele. Diese Vorgehensweise war für mich selbst von entscheidender Bedeutung, als ich Programmieren lernte. Je mehr ich darüber erfuhr, wie die Programme anderer Leute funktionierten, umso mehr Ideen bekam ich für meine eigenen.
Sie brauchen nicht mehr als einen Computer, den Python-Interpreter (eine kostenlose Software) und dieses Buch. Wenn Sie gelernt haben, wie Sie die Spiele in diesem programmieren, können Sie auch Ihre eigenen entwickeln.
Computer sind unglaubliche Maschinen. Zu lernen, wie man sie programmiert, ist gar nicht so schwer, wie die meisten Leute glauben. Ein Computer-programm ist eine Folge von Anweisungen, die ein Computer verstehen kann, ähnlich wie ein Buch eine Folge von Sätzen ist, die der Leser verstehen kann. Um einen Computer anzuweisen, etwas zu tun, müssen Sie ein Programm in einer Sprache schreiben, die er versteht. In diesem Buch lernen Sie die Programmiersprache Python kennen. Es gibt noch viele andere Programmiersprachen, die Sie lernen können, z. B. BASIC, Java, JavaScript, PHP oder C++.
Als Kind habe ich BASIC gelernt, aber neuere Programmiersprachen wie Python lassen sich noch einfacher lernen. Python wird auch von professionellen Programmierern sowohl bei der Arbeit als auch für Hobbyprojekte verwendet. Installation und Verwendung sind außerdem völlig kostenlos. Sie brauchen lediglich eine Internetverbindung, um die Sprache herunterzuladen.
Da Videospiele nichts anderes sind als Computerprogramme, bestehen sie ebenfalls aus Anweisungen. Im Vergleich zu den Spielen für die Xbox, die Play-Station oder den Nintendo wirken diejenigen, die Sie in diesem Buch erstellen werden, ziemlich simpel. Sie weisen keine anspruchsvolle Grafik auf, sondern sind absichtlich einfach gehalten, sodass Sie sich drauf konzentrieren können, Programmieren zu lernen. Außerdem müssen Spiele nicht kompliziert sein, um Spaß zu machen.
Programmieren an sich ist nicht schwer. Dagegen kann es durchaus schwer sein, Anleitungen zu finden, die einem sagen, wie man interessante Dinge programmiert. Andere Computerbücher behandeln viele Themen, die Neulinge gar nicht brauchen. Dieses Buch zeigt Ihnen, wie Sie Ihre eigenen Spiele programmieren. Damit erwerben Sie eine nützliche Fähigkeit und haben außerdem unterhaltsame Spiele, die Sie stolz vorstellen können. Dieses Buch richtet sich an folgende Leser:
Anfänger ohne jegliche Vorkenntnisse, die sich selbst das Programmieren beibringen möchten
Kinder und Jugendliche, die durch das Schreiben von Spielen programmieren lernen möchten
Erwachsene und Lehrer, die anderen Programmieren beibringen möchten
Jegliche Personen, ob jung oder alt, die anhand einer professionellen Programmiersprache programmieren lernen wollen
In den meisten Kapiteln dieses Buches wird jeweils ein neues Spielprojekt vorgestellt und erläutert. Einige wenige Kapitel sind zusätzlichen interessanten Themen gewidmet, z. B. dem Debugging. Neue Programmierprinzipien werden jeweils dann vorgestellt, wenn sie in den Spielen vorkommen. Die Kapitel sollten in der vorliegenden Reihenfolge gelesen werden. Die folgende kurze Aufstellung zeigt, was Sie in den einzelnen Kapiteln erwartet:
Kapitel 1
: Die interaktive Shell
erklärt, wie Sei die interaktive Shell von Python verwenden können, um Code zeilenweise auszuprobieren.
Kapitel 2
: Programme schreiben
erklärt, wie Sie im Dateieditor von Python vollständige Programme schreiben.
In
Kapitel 3
: Zahlen raten
programmieren Sie das erste Spiel in diesem Buch. Dabei muss der Spieler eine Geheimzahl raten und erhält jeweils den Hinweis, ob seine Vermutung zu hoch oder zu niedrig war.
In
Kapitel 4
: Ein Kalauerprogramm
schreiben Sie ein einfaches Programm, das dem Benutzer mehrere Flachwitze erzählt.
In
Kapitel 5
: Im Reich der Drachen
programmieren Sie ein Ratespiel, in dem der Spieler zwischen zwei Höhlen wählen muss: In einer der beiden wohnt ein freundlicher Drache, in der anderen ein hungriger.
Kapitel 6
: Der Debugger
erklärt, wie Sie Probleme in Ihrem Code mithilfe des Debuggers lösen.
Kapitel 7
: Galgenmännchen: Entwurf mit einem Flussdiagramm
beschreibt, wie Sie Flussdiagramme zur Planung anspruchsvollerer Programme einsetzen, hier für das in den folgenden Kapiteln beschriebene Galgenmännchen-Spiel.
In
Kapitel 8
: Galgenmännchen: Der Code
schreiben Sie das Galgenmännchen-Spiel anhand des Flussdiagramms aus
Kapitel 7
.
In
Kapitel 9
: Galgenmännchen: Erweiterungen
erweitern Sie das Galgenmännchen-Spiel, indem Sie den Python-Datentyp der Dictionarys verwenden.
In
Kapitel 10
: Tic-Tac-Toe
lernen Sie, wie Sie ein Tic-Tac-Toe-Spiel schreiben, bei dem eine künstliche Intelligenz gegen den menschlichen Benutzer antritt.
In
Kapitel 11
: Bagels
schreiben Sie das Denksportspiel Bagels, in dem der Spieler anhand von Hinweisen eine Geheimzahl erraten muss.
Kapitel 12
: Kartesische Koordinaten
erklärt das kartesische Koordinatensystem, das Sie in nachfolgenden Spielen verwenden werden.
In
Kapitel 13
: Sonar-Schatzsuche
schreiben Sie ein Spiel, in dem Sie das Meer nach verlorenen Schatztruhen absuchen.
In
Kapitel 14
: Die Caesar-Chiffre
schreiben Sie ein einfaches Verschlüsselungsprogramm, mit dem Sie Geheimnachrichten verschlüsseln und entschlüsseln können.
In
Kapitel 15
: Reversegam
programmieren Sie ein anspruchsvolles Reversiähnliches Spiel mit einer fast unschlagbaren künstlichen Intelligenz als Gegner.
Kapitel 16
: Reversegam: AI-Simulation
erweitert das Reversegam-Speil aus
Kapitel 15
, sodass nun verschiedene KIs gegeneinander antreten.
Kapitel 17
: Grafik einsetzen
führt das Python-Modul
pygame
ein und zeigt, wie Sie damit 2-D-Grafiken zeichnen können.
Kapitel 18
: Grafiken animieren
zeigt, wie Sie mit
pygame
Grafiken animieren.
In
Kapitel 19
: Kollisionserkennung
lernen Sie, wie Sie in 2-D-Spielen Zusammenstöße zwischen Objekten erkennen können.
In
Kapitel 20
: Sounds und Bilder verwenden
erweitern Sie Ihre einfachen
pygame
-Spiele um Klänge und Bilder.
Kapitel 21
: Dodger mit Ton und Grafik
wendet den Stoff aus den
Kapiteln 17
bis
20
für ein animiertes Spiel namens Dodger an.
Die meisten Kapitel dieses Buches beginnen mit einem Beispieldurchlauf des Programms, das in dem Kapitel vorgestellt wird. Dieser Durchlauf zeigt, wie das Programm aussieht, wenn Sie es ausführen. Die Eingaben des Benutzers sind durch Fettdruck gekennzeichnet.
Ich rate Ihnen, den Code der einzelnen Programme jeweils selbst in den IDLE-Dateieditor einzugeben, anstatt ihn einfach nur herunterzuladen und zu kopieren. Wenn Sie sich die Zeit nehmen, den Code abzutippen, werden Sie mehr davon im Kopf behalten.
Beim Abtippen des Quellcodes aus dem Buch dürfen Sie die Nummern zu Beginn der einzelnen Zeilen nicht mit eingeben! Nehmen wir an, Sie sehen die folgende Codezeile:
Hier dürfen Sie weder 9. noch das darauffolgende Leerzeichen eingeben, sondern nur Folgendes:
Die Zeilennummern stehen hier nur, um in den Erklärungen auf die einzelnen Zeilen verweisen zu können. Sie gehören nicht zum Quellcode des Programms.
Abgesehen von diesen Zeilennummern jedoch müssen Sie den Code genau so eingeben, wie er in dem Buch erscheint. Einige Zeilen sind mit vier, acht oder mehr Leerzeichen eingerückt. Diese Leerzeichen zu Anfang einer Zeile wirken sich darauf aus, wie Python die Anweisungen deutet, weshalb es sehr wichtig ist, sie einzuschließen.
Betrachten Sie dazu das folgende Beispiel. Die Leerzeichen sind durch dicke Punkte (•) dargestellt, sodass Sie sie sehen können:
Die erste Zeile ist nicht eingerückt, die zweite um vier und die dritte um acht Leerzeichen. In den tatsächlichen Beispielen in dem Buch sind die Leerzeichen zwar nicht durch solche Punkte gekennzeichnet, aber da alle Zeichen in IDLE die gleiche Breite aufweisen, können Sie die Anzahl der Leerzeichen einfach dadurch bestimmen, dass Sie die Anzahl der Zeichen in der darüber- oder darunterliegenden Zeile zählen.
Manche Codeanweisungen sind so lang, dass sie nicht mehr in eine Buchzeile passen und daher in die nächste Codezeile umbrechen. Allerdings passt die Zeile auf den Computerbildschirm. Geben Sie sie dort in einer einzigen Zeile ein, ohne zwischendurch die Eingabetaste zu drücken. Ob eine Anweisung einfach nur fortgesetzt wird oder ob tatsächlich eine neue Anweisung beginnt, können Sie anhand der Zeilennummern auf der linken Seite erkennen. Das folgende Beispiel zeigt nur zwei Anweisungen:
1. print('This is the first instruction!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxx')
2. print('This is the second instruction, not the third instruction.')
Die erste Anweisung bricht in die zweite Buchzeile um. Da die zweite Buchzeile keine Zeilennummer trägt, können Sie erkennen, dass es sich immer noch um die erste Codezeile handelt.
Um die Programme eingeben und ausprobieren zu können, Sie müssen eine Software installieren, die als Python-Interpreter bezeichnet wird und die Anweisungen versteht, die Sie in der Sprache Python geschrieben habe. Den Python-Interpreter werde ich im Folgenden der Einfachheit halber auch einfach als Python bezeichnen.
In diesem Abschnitt zeige ich Ihnen, wie Sie Python 3 – genauer gesagt, Python 3.4 – für Windows, OS X und Ubuntu herunterladen. Es gibt schon neuere Versionen als 3.4, aber das Modul pygame, das wir in den Kapiteln 17 bis 21 verwenden, unterstützt zurzeit nur die Versionen bis 3.4.
Beachten Sie auch, dass es erhebliche Unterschiede zwischen Python 2 und Python 3 gibt. Die Programme in diesem Buch verwenden Python 3. Wenn Sie versuchen, Sie mit Python 2 auszuführen, erhalten Sie Fehlermeldungen. Das ist so wichtig, dass ich bei jedem Programm den kleinen Pinguin hinzugefügt habe, um Sie darauf aufmerksam zu machen.
Wenn Sie mit Windows arbeiten, laden Sie den MSI-Installer für Windows x86-64 von https://www.python.org/downloads/release/python-344/ herunter und doppelklicken darauf. Möglicherweise müssen Sie das Administratorkennwort für Ihren Computer eingeben.
Folgen Sie den Anweisungen, die der Installer anzeigt, um Python zu installieren. Die Vorgehensweise ist wie folgt:
Wählen Sie
Install for All Users
und klicken Sie auf
Weiter
.
Bestätigen Sie die Installation im Ordner
C:\Python34
, indem Sie auf
Weiter
klicken.
Klicken Sie auf
Weiter
, um den Abschnitt
Customize Python
zu überspringen.
Wenn Sie mit OS X arbeiten, laden Sie den MSI-Installer für Mac OS X 64 Bit/32 Bit von https://www.python.org/downloads/release/python-344/ herunter und doppelklicken darauf. Möglicherweise müssen Sie das Administratorkennwort für Ihren Computer eingeben.
Folgen Sie den Anweisungen, die der Installer anzeigt, um Python zu installieren. Die Vorgehensweise ist wie folgt:
Wenn Sie eine Warnung der Art »Python.mpkg kann nicht geöffnet werden, da es von einem nicht verifizierten Entwickler stammt« erhalten, klicken Sie bei gedrückter -Taste auf die Datei
Python.mpkg
und wählen
Öffnen
aus dem dann angezeigten Menü. Möglicherweise müssen Sie das Administratorpasswort für Ihren Computer eingeben.
Klicken Sie im Willkommensabschnitt auf
Continue
und dann auf
Agree
, um die Lizenzverarbeitung zu akzeptieren.
Wählen Sie
Macintosh HD
(bzw. den Namen Ihrer Festplatte) aus und klicken Sie auf
Install
.
Wenn Sie Ubuntu verwenden, könne Sie Python wie folgt aus dem Ubuntu Software Center heraus installieren:
Öffnen Sie das Ubuntu Software Center.
Geben Sie in das Suchfeld oben rechts in dem Fenster
Python
ein.
Wählen Sie
IDLE (Python 3.4 GUI 64 bit)
aus.
Klicken Sie auf
Install
. Möglicherweise müssen Sie das Administratorpasswort Computer eingeben, um die Installation abzuschließen.
Sollten die angegebenen Vorgehensweisen nicht funktionieren, finden Sie alternative Installationsanweisungen für Python 3.4 auf https://www.nostarch.com/inventwithpython/.
IDLE steht für Interactive Development Enrivonment, also »interaktive Entwicklungsumgebung«. Es handelt sich dabei um eine Art Textverarbeitungssystem zum Schreiben von Python-Programmen. Je nach Betriebssystem müssen Sie zum Starten dieser Software jeweils unterschiedlich vorgehen:
Unter Windows klicken Sie auf das Startmenü unten links, geben
IDLE
ein und wählen
IDLE (Python GUI)
.
Unter OS X öffnen Sie den Finder und klicken auf
Programme
. Doppelklicken Sie anschließend auf
Python 3.x
und dann auf das IDLE-Symbol.
Unter Ubuntu und anderen Linux-Distributionen öffnen Sie ein Terminal-Fenster und geben
idle3
ein. Es kann auch sein, dass Sie auf
Applications
am oberen Bildschirmrand und dann auf
Programming
und
IDLE3
klicken können.
Das Fenster, das Sie beim Start von IDLE sehen, ist die interaktive Shell (siehe Abbildung). Wenn Sie hinter der Eingabeaufforderung >>> Python-Anweisungen in die Shell eingeben, führt Python sie aus. Anschließend erscheint wieder die Eingabeaufforderung >>>, um auf Ihre nächste Anweisung zu warten.
Abb. E–1Die interaktive Shell von IDLE
Die Quellcodedateien und andere Materialien zu diesem Buch finden Sie auf https://www.nostarch.com/inventwithpython/. Wenn Sie Fragen zur Programmierung im Zusammenhang mit diesem Buch haben, können Sie auf https://reddit.com/r/inventwithpython/ nachschauen oder sich über [email protected] an mich wenden (in englischer Sprache).
Bevor Sie Ihre Fragen stellen, sollten Sie aber Folgendes unternehmen:
Wenn Sie bei einem Programm aus diesem Buch, das Sie abgetippt haben, Fehlermeldungen erhalten, prüfen Sie, ob sich Tippfehler eingeschlichen haben. Das können Sie mit dem Vergleichswerkzeug (Diff Tool) machen, das auf
https://www.nostarch.com/inventwithpython#diff
zur Verfügung steht. Kopieren Sie Ihren Code in das Diff-Tool. Sollte es Unterschiede zwischen Ihrer Version des Codes und dem im Buch geben, werden sie Ihnen angezeigt.
Schauen Sie im Web nach, ob jemand bereits die gleiche Frage gestellt (und eine Antwort darauf erhalten) hat.
Je besser Sie Ihre Programmierfragen formulieren, umso besser können andere Ihnen helfen. Gehen Sie daher in solchen Fällen immer wie folgt vor:
Erklären Sie, was Sie zu tun versuchen, wenn der Fehler auftritt. Dadurch können potenzielle Helfer erkennen, ob Sie vielleicht völlig vom Wege abgekommen sind.
Kopieren Sie die gesamte Fehlermeldung und Ihren Code.
Geben Sie an, welches Betriebssystem und welche Version Sie benutzen.
Beschreiben Sie, was Sie bereits getan haben, um das Problem zu lösen. Dadurch versichern Sie anderen, dass Sie schon selbst Anstrengungen unternommen haben, um der Sache auf den Grund zu gehen.
Bleiben Sie höflich. Fordern Sie keine Hilfe und drängen Sie Ihre Helfer nicht, schnell zu antworten.
Nun sind Sie bereit zu lernen, wie Sie Ihre eigenen Computerspiele programmieren!
Bevor Sie Spiele entwickeln können, müssen Sie erst einige elementare Programmierprinzipien lernen. In diesem Kapitel erfahren Sie daher, wie Sie die interaktive Shell von Python nutzen und grundlegende Rechenoperationen durchführen.
Starten Sie IDLE nach der Anleitung im Abschnitt »IDLE starten« in der Einleitung. Als Erstes wollen wir Python nutzen, um einige einfache Rechenaufgaben zu lösen. Die interaktive Shell lässt sich wie ein Taschenrechner benutzen. Geben Sie 2 + 2 an der Eingabeaufforderung >>> der Shell ein und drücken Sie die Eingabetaste (die je nach Tastatur oder heißen kann). Abbildung 1–1 zeigt, wie die Rechenaufgabe in der interaktiven Shell angezeigt wird. Wie Sie sehen, antwortet die Shell mit der Zahl 4.
Abb. 1–1Eingabe von 2 + 2 in die aktive Shell
Diese Rechenaufgabe ist ein einfacher Programmbefehl. Das Pluszeichen weist den Computer an, die beiden Zahlen 2 und 2 zu addieren. Der Computer erledigt diese Aufgabe und gibt in der folgenden Zeile die Zahl 4 aus. Tabelle 1–1 nennt weitere mathematische Symbole, die in Python zur Verfügung stehen.
Operator
Operation
+
Addition
–
Subtraktion
*
Multiplikation
/
Division
Tab. 1–1Mathematische Operatoren
Das Minuszeichen subtrahiert Zahlen, das Sternchen multipliziert sie und der Schrägstrich teilt sie. Bei der Verwendung auf diese Weise werden +, –, * und / als Operatoren bezeichnet. Sie weisen Python an, was es mit den Zahlen auf beiden Seiten tun soll.
Integer sind ganze Zahlen wie 4, 99 oder 0. Bei Fließkommazahlen dagegen handelt es sich um Dezimalbrüche wie 3.5, 42.1 oder 5.0 (wobei in Programmiersprachen statt des im Deutschen üblichen Kommas ein Punkt verwendet wird). In Python ist 5 ein Integer und 5.0 eine Fließkommazahl.
Diese Zahlen werden als Werte bezeichnet. (Wir werden später noch andere Arten von Werten kennenlernen.) In der Rechenaufgabe, die Sie in die Shell eingegeben haben, sind 2 und 2 Integerwerte.
Die Rechenaufgabe 2 + 2 ist ein Beispiel für einen Ausdruck. Wie Abbildung 1–2 zeigt, bestehen Ausdrücke aus Werten (den Zahlen), die durch Operatoren (die Rechenzeichen) verbunden sind, um daraus einen neuen Wert zu bilden, der im Code verwendet werden kann. Computer können Millionen von Ausdrücken in Sekundenschnelle berechnen.
Abb. 1–2Ausdrücke bestehen aus Werten und Operatoren
Versuchen Sie, einige Ausdrücke in die interaktive Shell einzugeben. Drücken Sie nach jedem dieser Ausdrücke :
>>> 2+2+2+2+2
10
>>> 8*6
48
>>> 10-5+6
11
>>> 2 + 2
4
Diese Ausdrücke sehen alle wie ganz normale Rechenaufgaben aus. Beachten Sie aber die Leerzeichen in dem Beispiel 2 +2. In Python können Sie beliebig viele Leerzeichen zwischen Werte und Operatoren schreiben. Eingaben in die aktive Shell müssen jedoch immer am Anfang der Zeile beginnen (ohne Leerzeichen davor).
Wenn ein Computer den Ausdruck 10 + 5 verarbeitet und den Wert 15 zurückgibt, so spricht man davon, dass er den Ausdruck auswertet. Das bedeutet, dass der Ausdruck auf einen einzigen Wert reduziert wird. Wenn Sie eine Rechenaufgabe lösen, reduzieren Sie sie damit auch auf einen einzigen Wert, nämlich das Ergebnis. Die Ausdrücke 10 + 5 und 10 + 3 + 2 werden beide zu 15 ausgewertet.
Wenn Python einen Ausdruck auswertet, führt es die Operationen in der gleichen Reihenfolge aus, wie Sie es beim Rechnen tun. Dabei gelten die folgenden Regeln:
Teile des Ausdrucks, die in Klammern stehen, werden zuerst ausgewertet.
Multiplikation und Division erfolgen vor Addition und Subtraktion.
Die Auswertung erfolgt von links nach rechts.
Der Ausdruck 1 + 2 * 3 + 4 ergibt daher 11 und nicht 13, da zuerst 2 * 3 berechnet wird. Lautete die Aufgabe stattdessen (1 + 2) * (3 + 4), würde sich 21 ergeben, da (1 + 2) und (3 + 4) in Klammern sehen und daher vor der Multiplikation ausgewertet werden.
Ausdrücke können eine beliebige Größe aufweisen, werden aber stets zu einem einzigen Wert ausgewertet. Auch einzelne Werte können Ausdrücke sein. So wird beispielsweise der Ausdruck 15 zu dem Wert 15 ausgewertet. Der Ausdruck 8 * 3 / 2 + 2 + 7 - 9 ergibt 21. Dabei erfolgt die Berechnung in den folgenden Schritten:
Der Computer führt zwar alle diese Schritte durch, doch in der interaktiven Shell sehen Sie nichts davon, sondern nur das Ergebnis:
>>> 8 * 3 / 2 + 2 + 7 - 9
12.0
Ausdrücke mit dem Divisionsoperator / werden stets zu einer Fließkommazahl ausgewertet, hier beispielsweise 24 / 2 zu 12.0. Mathematische Operationen, an denen auch nur ein Fließkommawert beteiligt ist, ergeben wiederum Fließkommawerte. In unserem Beispiel wird deshalb 12.0 + 2 zu 14.0 ausgewertet.
Wenn Sie 5 + in die interaktive Shell eingeben, erhalten Sie die folgende Fehlermeldung:
>>> 5 +
SyntaxError: invalid syntax
Das liegt daran, dass 5 + kein Ausdruck ist. Ausdrücke bestehen aus Werten, die durch Operatoren verbunden sind, und der Operator + erwartet einen Wert davor und dahinter. Wenn ein erwarteter Wert fehlt, wird eine Fehlermeldung angezeigt.
SyntaxError bedeutet, dass Python den Befehl nicht versteht, da Sie ihn falsch eingegeben haben. Bei der Programmierung geht es nicht einfach darum, dem Computer Befehle zu erteilen; man muss auch schon genau wissen, wie man diese Befehle auf die richtige Weise gibt!
Machen Sie sich jedoch keine Sorgen über solche Fehler. Durch diese Art falscher Angaben können Sie den Computer nicht beschädigen. Geben Sie den Befehl einfach an der nächsten Eingabeaufforderung (>>>) korrekt in die Shell ein.
Wenn ein Ausdruck zu einem Wert ausgewertet wird, können Sie diesen Wert später nutzen, wenn Sie ihn in einer Variablen speichern. Eine solche Variable können Sie sich als eine Schachtel vorstellen, in der Sie den Wert ablegen.
Eine Zuweisungsanweisung speichert einen Wert in einer Variablen. Geben Sie dazu den Namen der Variablen ein, dann ein Gleichheitszeichen – den sogenannten Zuweisungsoperator – und schließlich den Wert, den Sie speichern wollen:
Abb. 1–3Variablen fungieren wie Schachteln, in denen Sie Werte aufbewahren können.
Wenn Sie drücken, scheint nichts zu passieren. In Python wissen Sie, dass ein Befehl erfolgreich ausgeführt wurde, wenn keine Fehlermeldung erscheint. Es wird einfach wieder die Eingabeaufforderung >>> angezeigt, sodass Sie den nächsten Befehl eingeben können.
Die Beispielvariablen in diesem Kapitel tragen nichtssagende Namen wie spam, eggs und bacon, doch für die Variablen in Ihren Programmen sollten Sie Namen verwenden, die die enthaltenen Daten beschreiben. Stellen Sie sich vor, Sie würden bei einem Umzug alle Kartons einfach mit Sachen beschriften. Sie würden nichts mehr wiederfinden!
Python erstellt die Variable, wenn sie zum ersten Mal in einer Zuweisungsanweisung verwendet wird. Um zu prüfen, ob sich ein Wert in der Variablen befindet, geben Sie den Variablennamen in die interaktive Shell ein:
Der Ausdruck spam wird zu dem Wert ausgewertet, der sich in der Variablen spam befindet, also 15.
Variablen können Sie auch in Ausdrücken verwenden. Geben Sie Folgendes in die interaktive Shell ein:
Hier haben Sie zunächst den Wert der Variablen spam auf 15 gesetzt, sodass die Eingabe spam + 5 dem Ausdruck 15 + 5 entspricht. Die Auswertung von spam + 5 läuft wie folgt ab:
Es ist nicht möglich, eine Variable schon vor der Zuweisungsanweisung zu verwenden, mit der sie erstellt wird. Sollten Sie das versuchen, so gibt Python die Fehlermeldung NameError aus, da eine Variable des angegebenen Namens noch nicht existiert. Der gleiche Fehler ergibt sich auch, wenn Sie den Variablennamen falsch schreiben:
Der Fehler tritt auf, da es nur eine Variable namens spam gibt, aber nicht spma.
Den Wert, der in einer Variablen gespeichert ist, können Sie mit einer weiteren Zuweisungsanweisung ändern. Probieren Sie das folgende Beispiel in der interaktiven Shell aus:
Abb. 1–4Der Wert15inspamwird durch den Wert3überschrieben.
Sie können den Wert in spam sogar dazu verwenden, spam selbst einen neuen Wert zuzuweisen:
In der ersten Anweisung dieses Beispiels speichern Sie den Wert 15 in spam. In der nächsten addieren Sie 5 zu dem Wert von spam und weisen den neuen Wert spam + 5, der 20 ergibt, der Variablen spam zu. Wenn Sie das dreimal tun, enthält spam schließlich den Wert 30.
Bis jetzt haben wir uns nur mit einer einzigen Variablen beschäftigt, doch Sie können in Ihren Programmen so viele Variablen verwenden, wie Sie benötigen. Als Beispiel wollen wir den beiden Variablen eggs und bacon unterschiedliche Werte zuweisen:
Die Variable bacon enthält jetzt den Wert 10, während sich in eggs der Wert 15 befindet. Jede Variable stellt eine eigene Schachtel mit einem eigenen Wert dar, wie Sie in Abbildung 1–5 sehen.
Abb. 1–5Unterschiedliche Werte in den Variablenbaconundeggs
In diesem Kapitel haben Sie die Grundlagen zum Schreiben von Python-Programmbefehlen gelernt. Da Computer nicht denken können und nur bestimmte Befehle verstehen, müssen Sie Python genau sagen, was es tun soll.
Ausdrücke sind Werte (wie 2 oder 5), die durch Operatoren (wie + und -) verbunden sind. Python kann Ausdrücke auswerten, wobei sie auf einen einzigen Wert reduziert werden. Werte können Sie auch in Variablen speichern, sodass das Programm sich diese Werte merkt und später verwenden kann.
Es gibt noch mehr Operatoren und Werte in Python. Im nächsten Kapitel lernen Sie weitere Grundprinzipien kennen und schreiben Ihr erstes Programm. Dabei erfahren Sie, wie Sie mit Text in Ausdrücken umgehen. Python ist nicht auf Zahlen beschränkt – es kann weit mehr als ein Taschenrechner!
Sehen wir uns nun an, was Python alles mit Text anstellen kann. Praktisch alle Programme zeigen den Benutzern Text an, und die Benutzer geben über die Tastatur auch oft Text ein. In diesem Kapitel schreiben Sie Ihr erstes Programm, und dabei kommt beides vor. Sie lernen dabei, wie Sie Text in Variablen speichern können, wie Sie Texte kombinieren und wie Sie sie auf dem Bildschirm anzeigen. Das Programm, das Sie schreiben, zeigt die Begrüßung Hello world! an und fragt den Benutzer nach seinem Namen.
Textwerte werden in Python als Strings bezeichnet. Sie können sie ähnlich verwenden wie Integer- und Fließkommawerte. Unter anderem können Sie Strings auch in Variablen speichern. Im Code steht am Anfang und am Ende eines Stringwerts jeweils ein einfaches Anführungszeichen. Geben Sie den folgenden Code in die interaktive Shell ein:
Die einfachen Anführungszeichen teilen Python mit, wo der String anfängt und wo er endet, aber sie gehören nicht zum eigentlichen Text des Stringwerts. Wenn Sie anschließend spam in die Shell eingeben, wird der Inhalt dieser Variablen angezeigt. Wie Sie bereits wissen, wertet Python zu dem Wert aus, der darin gespeichert ist, in diesem Fall also zu dem String 'hello':
Strings können beliebige Zeichen enthalten und beliebig lang sein, wie die folgenden Beispiele zeigen:
'hello'
'Hi there!'
'KITTENS'
'7 apples, 14 oranges, 3 lemons'
'Anything not pertaining to elephants is irrelephant.'
'A long time ago, in a galaxy far, far away...'
'O*&#wY%*&OCfsdYO*&gfC%YO*&%3yc8r2'
Ebenso wie Integer- und Fließkommawerte können Sie auch Stringwerte mit Operatoren zu Ausdrücken kombinieren. Wenn Sie zwei Strings mit dem Operator + verbinden, führen Sie eine sogenannte Stringverkettung durch. Geben Sie zur Veranschaulichung 'Hello' + 'World!' in die interaktive Shell ein:
>>> 'Hello' + 'World!'
'HelloWorld!'
Der Ausdruck wird zu einem einzigen Stringwert ausgewertet, nämlich 'HelloWorld!'. Der Ergebnisstring enthält kein Leerzeichen, da in keinem der beiden verketteten Strings ein Leerzeichen vorkam. Anders verhält es sich im folgenden Beispiel:
>>> 'Hello ' + 'World!'
'Hello World!'
Der Operator + wirkt sich auf Strings und Integerwerte unterschiedlich aus, da es sich dabei um verschiedene Datentypen handelt. Alle Werten haben einen Datentyp: der Wert 'Hello' den Datentyp String, der Wert 5 den Typ Integer. Anhand des Datentyps kann Python erkennen, was die Operatoren bei der Auswertung eines Ausdrucks tun sollen. So verkettet der Operator + Strings und addiert Integer- und Fließkommawerte.
Bis jetzt haben Sie immer nur einen Befehl nach dem anderen in die interaktive Shell von IDLE eingegeben. Um ein Programm zu schreiben, müssen Sie jedoch mehrere Befehle eingeben, die dann alle auf einen Rutsch ausgeführt werden. Das ist genau das, was Sie als Nächstes tun werden: Sie schreiben Ihr erstes Programm!
Neben dem Interpreter gibt es in IDLE noch den Dateieditor. Um ihn zu öffnen, klicken Sie oben in der interaktiven Shell auf das Menü File und wählen New File. Daraufhin erscheint ein leeres Fenster, in das Sie den Code Ihres Programms eingeben können (siehe Abb. 2–1).
Abb. 2–1Dateieditor (links) und interaktive Shell (rechts)
Die beiden Fenster sehen sich sehr ähnlich, allerdings wird in der interaktiven Shell die Eingabeaufforderung >>> angezeigt, im Dateieditor dagegen nicht.
Unter Programmierern herrscht die Tradition, dass das jeweils erste Programm den Text Hello world! auf dem Bildschirm ausgibt. Im Folgenden werden Sie nun Ihr Hello-World-Programm schreiben.
Die Zahlen, die am Anfang der Codezeilen stehen, dürfen Sie dabei nicht mit eingeben. Sie sind in diesem Buch nur abgedruckt, um auf einfache Weise auf einzelne Codezeilen verweisen zu können. In der unteren rechten Ecke des Dateieditors wird angezeigt, in welcher Codezeile sich der blinkende Cursor gerade befindet. In Abbildung 2–2 sehen Sie, dass er sich in Zeile 1 (senkrechte Position) und Spalte 0 (waagerechte Position) befindet.
Abb. 2–2In der unteren rechten Ecke des Dateieditors können Sie ablesen, in welcher Zeile sich der Cursor gerade befindet.
Geben Sie den folgenden Text in das neue Fenster des Dateieditors ein. Dies ist der Quellcode des Programms. Er enthält die Befehle, die Python befolgt, wenn Sie das Programm ausführen.
hello.py
IDLE stellt die verschiedenen Arten von Befehlen in unterschiedlichen Farben dar. Wenn Sie den Code fertig eingegeben haben, sieht das Fenster so aus wie in Abbildung 2–3.
Abb. 2–3Der Dateieditor nach der Eingabe des Codes
Vergewissern Sie sich, dass das IDLE-Fenster genau so aussieht.
Nachdem Sie den Quellcode eingegeben haben, speichern Sie ihn, indem Sie auf File > Save As klicken oder + drücken. Abbildung 2–4 zeigt das Speichern-Dialogfeld, das daraufhin geöffnet wird. Geben Sie als Dateiname hello.py ein und klicken Sie auf Save.
Abb. 2–4Das Programm speichern
Speichern Sie Ihre Programme möglichst oft. Falls der Computer abstürzt oder Sie versehentlich IDLE beenden, verlieren Sie dann nicht so viel von Ihrer Arbeit.
Um das zuvor gespeicherte Programm zu laden, klicken Sie auf File > Open. Wählen Sie in dem daraufhin eingeblendeten Fenster die Datei hello.py aus und klicken Sie auf Open. Daraufhin wird das Programm hello.py im Dateieditor geöffnet.
Nun ist es an der Zeit, das Programm auszuführen. Klicken Sie dazu auf Run > Run Module oder drücken Sie im Dateieditor . Das Programm wird daraufhin in der interaktiven Shell ausgeführt.
Geben Sie Ihren Namen ein, wenn das Programm danach fragt. Diesen Vorgang sehen Sie in Abbildung 2–5.
Abb. 2–5Die interaktive Shellnachder Ausführung von hello.py
Wenn Sie Ihren Namen eingeben und die Eingabetasten drücken, begrüßt das Programm Sie namentlich! Herzlichen Glückwunsch! Sie haben gerade Ihr erstes Programm geschrieben und sind jetzt ein Computerprogrammierer. Drücken Sie erneut , um das Programm ein zweites Mal auszuführen, und geben Sie diesmal einen anderen Namen ein.
Wenn Sie eine Fehlermeldung erhalten, vergleichen Sie Ihren Code mit dem aus diesem Buch. Das können Sie ganz einfach mit dem Diff Tool erreichen, das Sie online auf https://www.nostarch.com/inventwithpython#diff finden. Kopieren Sie Ihren Code im Dateieditor, fügen Sie ihn auf der genannten Webseite ein und klicken Sie auf die Schaltfläche Compare. Das Tool zeigt jegliche Unterschiede zwischen Ihrem Code und dem im Buch an (siehe Abb. 2–6).
Sollten Sie eine NameError-Meldung wie die Folgende erhalten, dann haben Sie nicht Python 3 verwendet, sondern Python 2:
Um dieses Problem zu lösen, installieren Sie Python 3.4 und führen das Programm erneut aus (siehe den Abschnitt »Python herunterladen und installieren« in der Einleitung).
Abb. 2–6Das Diff Tool auf https://www.nostarch.com/inventwithpython#diff
Jede Codezeile ist ein Befehl, den Python ausführt. Diese Befehle bilden das Programm, vergleichbar mit den einzelnen Schritten in einem Rezept. Python nimmt sich einen Befehl nach dem anderen vor, wobei es am Anfang des Programms beginnt und sich dann weiter vorarbeitet.
Im Folgenden sehen wir uns die einzelnen Codezeilen an, um herauszufinden, was sie jeweils bewirken. Dabei beginnen wir mit Zeile 1.
Die erste Zeile des Hello-World-Programms ist ein Kommentar:
1. # Dieses Programm sagt "Hello" und fragt nach dem Namen.
Jeglicher Text, der auf ein amerikanisches Nummernzeichen (#) folgt, wird als Kommentar aufgefasst. Das sind Bemerkungen des Programmierers darüber, was der Code bewirkt. Geschrieben werden sie nicht für Python, sondern für Personen, die den Code lesen und verstehen wollen. Bei der Ausführung eines Programms ignoriert Python solche Kommentare. Gewöhnlich stellen Programmierer einen Kommentar ganz an den Anfang des Codes, um den Zweck des Programms zu beschreiben. Der Kommentar in dem Hello-World-Programm erklärt, dass das Programm »Hello« sagt und den Benutzer nach dem Namen fragt.
Eine Funktion ist eine Art von Miniprogramm innerhalb eines Programms. Sie enthält mehrere Befehle, die Python ausführen soll. Das Gute an Funktionen ist, dass Sie nur wissen müssen, was sie tun, aber nicht, wie sie es tun. Im Lieferumfang von Python ist bereits eine Reihe von Funktionen enthalten, von denen wir in dem Hello-World-Programm print() und input() verwenden.
Ein Funktionsaufruf weist Python an, den Code der genannten Funktion auszuführen. Beispielsweise ruft das Hello-World-Programm die Funktion print() auf, die den zwischen den Klammern eingegebenen String auf dem Bildschirm ausgibt.
Die Zeilen 2 und 3 des Hello-World-Programms enthalten Aufrufe von print():
2. print('Hello world!')
3. print('What is your name?')
Der Wert in den Klammern des Funktionsaufrufs wird als Argument bezeichnet. Das Argument des print()-Aufrufs in Zeile 2 ist also 'Hello world!', das des Aufrufs in Zeile 3 dagegen 'What is your name?'. Diese Argumente werden der Funktion übergeben.
In Zeile 4 steht eine Zuweisungsanweisung, die den Variablennamen myName und den Funktionsaufruf input() enthält:
Beim Aufruf von input() wartet das Programm darauf, dass der Benutzer Text eingibt. Der Funktionsaufruf wird dann zu diesem Textstring ausgewertet. Funktionsaufrufe können überall dort in Ausdrücken verwendet werden, wo auch ein Wert stehen könnte.
Der Wert, zu dem der Funktionsaufruf ausgewertet wird, ist der sogenannte Rückgabewert. (Statt »der Wert, zu dem ein Funktionsaufruf ausgewertet wird« kann man auch »der Wert, den ein Funktionsaufruf zurückgibt« sagen). Der Rückgabewert von input() ist hier der vom Benutzer eingegebene String, nämlich der Name. Wenn der Benutzer Albert eingibt, wird der Funktionsaufruf input() zu dem String 'Albert' ausgewertet:
Dadurch wird der String 'Albert' in der Variablen myName gespeichert.
Die letzte Zeile des Hello-World-Programms enthält einen weiteren Aufruf von print():
5. print('It is good to meet you, ' + myName)
Der Ausdruck 'It is good to meet you, ' + myName steht in den Klammern von print(). Da Argumente immer einzelne Werte sind, wertet Python zunächst diesen Ausdruck aus und übergibt dann den resultierenden Wert als Argument. Unter der Annahme, dass in myName der Wert 'Albert' gespeichert ist, läuft die Auswertung wie folgt ab:
Dadurch begrüßt das Programm den Benutzer mit Namen.
Nach der Ausführung der letzten Zeile endet das Programm. Die Ausführung wird beendet, und Python vergisst alle in den Variablen gespeicherten Werte, auch den String in myName. Wenn Sie das Programm erneut starten und einen anderen Namen eingeben, hält das Programm ihn für Ihren Namen:
Hello world!
What is your name?
Carolyn
It is good to meet you, Carolyn
Denken Sie immer daran, dass der Computer genau das tut, was Sie ihm befehlen. Computer befolgen stumpf jegliche Befehle, die Sie ihnen geben. Sie kümmern sich nicht darum, ob Sie Ihren richtigen Namen, den Namen einer anderen Person oder irgendetwas Albernes eingeben. Was auch immer Sie eingeben, der Computer behandelt es auf dieselbe Weise:
Hello world!
What is your name?
poop
It is good to meet you, poop
Es lässt sich leichter nachvollziehen, wie Ihr Programm funktioniert, wenn Sie den Variablen beschreibende Namen geben. Wir hätten die Variable myName auch abrahamLincoln oder nAmE nennen können, ohne dass sich an der Ausführung durch Python irgendetwas geändert hätte, aber diese Namen sagen nichts darüber aus, was für Informationen in der Variablen gespeichert sind. Wie schon in Kapitel 1 erwähnt, wäre es alles andere als hilfreich, bei einem Umzug sämtliche Kartons mit Sachen zu beschriften. Bei den Beispielen zur interaktiven Shell haben wir Variablennamen wie spam, eggs und bacon verwendet, da die Namen in diesen Fällen keine Rolle spielen. Sämtliche Variablen in den Programmen in diesem Buch tragen jedoch beschreibende Namen, und so sollten Sie es in Ihren Programmen auch halten.
Bei Variablennamen wird zwischen Groß- und Kleinschreibung unterschieden, weshalb spam, SPAM, Spam und sPAM in Python vier verschiedene Variablen mit jeweils eigenen Werten sind. Es ist jedoch äußerst ungünstig, in einem Programm Variablen zu verwenden, deren Namen sich nur durch die Groß- und Kleinschreibung unterscheiden. Verwenden Sie stattdessen aussagekräftige Namen.
Variablennamen werden gewöhnlich in Kleinbuchstaben geschrieben. Wenn sie aus mehr als einem Wort bestehen, ist es sinnvoll, die Anfangsbuchstaben der einzelnen Wörter außer dem ersten groß zu schreiben. So lässt sich beispielsweise der Variablenname whatIHadForBreakfastThisMorning besser lesen als whatihadforbreakfastthismorning. Diese Form von Binnenmajuskeln wird auch als Camel-Case bezeichnet (da das Auf und Ab an Kamelhöcker erinnert) und macht den Code besser lesbar. Abgesehen davon bevorzugen Programmierer kürzere Variablennamen, etwa breakfast oder foodThisMorning statt whatIHadForBreakfastThisMorning, was den Code ebenfalls verständlicher macht. Dies sind sogenannte Konventionen – keine zwingenden, aber übliche Vorgehensweisen bei der Programmierung in Python.
Mithilfe von Strings und Funktionen können Sie interaktive Programme schreiben, da Text das wichtigste Medium ist, über das Benutzer und Computer miteinander kommunizieren. Vom Benutzer eingegebenen Text rufen Sie mit der Funktion input() ab, und um Text auf dem Bildschirm anzuzeigen, verwenden Sie die Funktion print().
Strings sind einfach nur Werte eines neuen Datentyps. Alle Werte haben einen Datentyp, der unter anderem beeinflusst, wie der Operator + funktioniert.
Funktionen dienen dazu, komplizierte Befehle in Programmen auszuführen. Python wird mit vielen vorgefertigten Funktionen geliefert, die Sie in diesem Buch kennenlernen werden. Überall dort, wo in einem Ausdruck ein Wert stehen kann, lässt sich auch ein Funktionsaufruf verwenden.
Bis jetzt wurden bei der Ausführung die einzelnen Programmschritte einer nach dem anderen abgearbeitet. In Kapitel 3 erfahren Sie jedoch, wie Sie ein Programm noch auf andere Weise ausführen können als in einer Reihe vom Anfang bis zum Ende. Wenn Sie diese Technik beherrschen, sind Sie bereit, um Spiele zu entwickeln!
In diesem Kapitel schreiben Sie ein Zahlenratespiel (»Guess The Number«). Der Computer denkt sich eine Geheimzahl von 1 bis 20 aus und bittet den Benutzer, sie zu erraten. Nach jedem Versuch teilt der Computer dem Benutzer mit, ob die eingegebene Zahl zu hoch oder zu niedrig war. Der Benutzer gewinnt, wenn er die Zahl mit sechs Versuchen erraten kann.
Dieses Spiel ist zum Lernen sehr gut geeignet, da das Programm dafür sehr kurz ist, aber viele Programmierprinzipien abdeckt. So lernen Sie dabei, wie Sie Werte in einen anderen Datentyp umwandeln und wann Sie das tun müssen. Da es sich bei dem Programm um ein Spiel handelt, werden wir den Benutzer von nun an den Spieler nennen.
Das folgende Listing zeigt, was ein Spieler angezeigt bekommt, wenn er das Zahlenratespiel ausführt. Die Eingaben des Spielers sind dabei durch Fettdruck gekennzeichnet.
Hello! What is your name?
Albert
Well, Albert, I am thinking of a number between 1 and 20.
Take a guess.
10
Your guess is too high.
Take a guess.
2
Your guess is too low.
Take a guess.
4
Good job, Albert! You guessed my number in 3 guesses!
Klicken Sie auf File > New Windows, um ein neues Dateieditorfenster zu öffnen. Geben Sie den folgenden Quellcode in das leere Fenster ein und speichern Sie ihn als guess.py. Führen Sie das Programm anschließend mit aus.
Achten Sie bei der Eingabe genau auf die Leerzeichen. Einige Zeilen müssen um vier oder acht Leerzeichen eingerückt werden.
Falls Sie eine Fehlermeldung erhalten, vergleichen Sie den eingegebenen Code mit dem Code aus dem Buch. Dazu können Sie das Diff Tool auf https://www.nostarch.com/inventwithpython#diff verwenden.
guess.py
Sehen wir uns zunächst die beiden ersten Zeilen des Programms an:
1. # Dies ist ein Zahlenratespiel.
2. import random
Die erste Zeile ist ein Kommentar, wie Sie ihn schon in Kapitel 2 kennengelernt haben. Wie Sie bereits wissen, ignoriert Python alles, was auf das Zeichen # folgt. Der Kommentar gibt lediglich an, wozu das Programm gut ist.
Bei der zweiten Zeile handelt es sich um eine import-Anweisung. Wie Sie schon gelernt haben, sind Anweisungen Befehle, die irgendeine Aktion durchführen, im Gegensatz zu Ausdrücken aber nicht zu einem Wert ausgewertet werden. Sie kennen bereits die Zuweisungsanweisung, die einen Wert in einer Variablen speichert.
Python wird mit vielen vorgefertigten Funktionen geliefert, von denen sich einige jedoch in separaten Programmen befinden, nämlich in sogenannten Modulen. Um diese Funktionen zu nutzen, müssen Sie das betreffende Modul mit einer import-Anweisung in Ihr Programm importieren.
Zeile 2 importiert das Modul random, damit das Programm die darin enthaltene Funktion randint() aufrufen kann. Diese Funktion erzeugt die Zufallszahl, die der Spieler raten soll.
Nach dem Import des Moduls erstellen Sie in Zeile 4 als Nächstes die neue Variable guessesTaken, sodass sie später in dem Programm verwendet werden kann:
Diese Variable enthält die Anzahl der Rateversuche, die der Spieler schon durchgeführt hat. Da der Spieler an dieser Stelle im Programm noch gar nichts geraten hat, speichern Sie zunächst den Integer 0 in dieser Variablen.
Die Zeilen 6 und 7 sind identisch mit den entsprechenden Zeilen aus dem Hello-World-Programm in Kapitel 2. Programmierer greifen oft auf Code aus anderen Programmen zurück, um sich selbst Arbeit zu ersparen.
Zeile 6 ruft die Funktion print() auf. Wie Sie bereits wissen, ist eine Funktion eine Art Miniprogramm innerhalb Ihres Programms. Wird diese Funktion aufgerufen, so wird dieses Miniprogramm ausgeführt. Der Code von print() zeigt das String-Argument, das Sie übergeben, auf dem Bildschirm an.
Zeile 7 ruft den vom Spieler eingegebenen Namen ab und speichert ihn in der Variablen myName