Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level1:programming_intro

Was ist Programmierung

Programmieren ist die Tätigkeit, einem Computer Abfolgen von Anweisungen zu geben, die dieser dann ausführen soll. Die Art, wie diese Anweisungen formuliert sind, muss dabei gewissen Regeln folgen - der sogenannten Syntax.
Die Syntax ist für jede Programmiersprache unterschiedlich. Um Kartenskripte für Siedler 5 zu erstellen, wird die Programmiersprache Lua verwendet, weshalb wir uns in diesem Tutorial-Abschnitt mit der grundlegenden Syntax dieser Sprache beschäftigen. Es ist dabei wichtig, die Regeln, die diese Programmiersprache vorgibt, genau zu verstehen. Der Rechner wird nämlich immer nur genau das ausführen, was im Programm steht. Das kann, abhängig davon wie gut man die Sprache „spricht“, deutlich von dem abweichen, was man eigentlich möchte.
Um Fehler schneller zu finden, hilft es, seine Skripte gut lesbar (FIXME link) zu formulieren und häufige Fehler (FIXME link) zu kennen.


Einfaches Beispiel: Kochrezept

Ein Programm in Lua besteht aus Anweisungen, die Zeile für Zeile aufgeschrieben und vom Rechner von oben nach unten abgearbeitet werden. Das ist sehr gut vergleichbar mit einem Kochrezept: Von oben nach unten werden die gegebenen Anweisungen ausgeführt, welche hoffentlich zu einer Mahlzeit führen. Ein Rezept für wunderbare Brownies, wie es ein Computer versteht, könnte zum Beispiel so aussehen:

wenn vegan:
    Topf <- 90g Margarine
andernfalls:
    Topf <- 90g Butter
    
solange Topfinhalt nicht braun:
    Topfinhalt langsam erhitzen
    
Topf <- 150g dunkle Schokolade
Schokolade schmelzen lassen

wenn vegan:
    Schüssel <- 90ml Kaffee, 30g geschrotete Leinsamen, 100g Zucker, 5g Salz, 5ml Vanilleextrakt
andernfalls:
    Schüssel <- 60ml Kaffee, 1 Ei, 100g Zucker, 5g Salz, 5ml Vanilleextrakt
    
Schüsselinhalt vermischen
Schüssel <- Topfinhalt
Schüsselinhalt vermischen
Schüssel <- 100g Mehl, 10g Backpulver, 30g Kakaopulver, 30g Schokostücke
Schüsselinhalt vermischen
Backblech <- Schüsselinhalt

Bei 180°C etwa 20-25 Minuten backen

Für einen nicht-Programmierer sieht das sicher immer noch unpraktisch aus. Das liegt daran, dass Computer intern nur mit 0en und 1en gesteuert werden (eine 0111000101011… -Abfolge definiert eindeutig ein bestimmtes Verhalten). Die Art, wie wir Programme formulieren, ist daher so gewählt, dass wir das als Menschen gut lesen können. Der Rechner soll aber gleichzeitig aus unserer Formulierung eindeutige Programmabläufe ableiten können. Die Sprache sitzt demnach genau in der Mitte zwischen dem, was Menschen und was Computer intuitiv verstehen.

Aus unserem Beispiel mit dem Rezept lassen sich zwei Arten von Anweisungen ablesen: Anweisungen mit einem Pfeil sind eine sogenannte Zuweisung bzw. Deklaration. Damit legen wir die Voraussetzungen oder das Umfeld fest, mit dem das Programm arbeiten soll. Im Rezept ist das der Inhalt der Schüssel oder des Topfes. In Siedler kann das eine Menge feindlicher Truppen, die Höhe eines Tributs oder die Anzahl erlaubter Helden sein.
Davon unterscheiden sich sogenannte Befehle bzw. Instruktionen. Diese sollen basierend auf den Zuweisungen, die wir gemacht haben, eine Aktion ausführen. Beim Rezept ist jedes Vermischen des Schüsselinhalts ein Befehl. Eine Instruktion in Siedler wäre ein Angriffsbefehl für einen KI-Gegner, das Starten eines Kameraflugs oder auch das Auslösen der Siegmeldung.

Um unser Programm zu steuern, stehen uns außerdem noch weitere Werkzeuge zur Verfügung: Wir können eine Anweisung so lange ausführen, bis eine bestimmte Bedingung erfüllt ist (Schleife) oder abhängig von einer Bedingung unterschiedliche Programmteile ausführen (Verzweigung). Im Beispiel oben ist das Warten auf die Butter eine Schleife (erhitze bis die Bedingung = „Topfinhalt braun?“ erfüllt ist) und die vegane Option eine Verzweigung.


Ereignisse im Spielablauf

Anders als beim Kochrezept haben wir bei Siedler nicht immer die komplette Kontrolle über das Geschehen. Meistens wird der Spieler das Spiel bedienen und wir geben dafür nur die Voraussetzungen bzw. reagieren auf die Aktionen des Spielers. Um dieses Prinzip besser zu veranschaulichen, wollen wir einige Ereignisse beispielhaft betrachten und Möglichkeiten aufzeigen, wie das Skript darauf reagieren kann.

Ereignis Reaktion
Spiel wurde gestartet Gebe Spieler Rohstoffe, platziere NPCs, aktiviere Gegner-KI
Tribut wurde bezahlt Öffne Tor
Es wird Winter KI-Dorf baut Verteidigungstürme
Gegner wurde besiegt Löse Siegmeldung aus

Ein weiteres Prinzip im Spielablauf ist die Verwaltung eines Spielzustands. Kombinieren wir die Ereignisse des bezahlten Tributs und des eintretenden Winters: Ein befreundetes KI-Dorf soll nur dann Verteidigungstürme errichten, wenn der Spieler zuvor die dafür notwendigen Baumaterialien bereitgestellt hat. Die Materialien werden verbraucht und sobald der Sommer eintritt, muss der Spieler sie erneut bezahlen.

simple_state_machine.jpg

Beachte, wie in jedem Zustand des Dorfes nur diejenigen Ereignisse beachtet werden, die tatsächlich eintreten können: Wenn der Tribut schon bezahlt ist, kann er erst wieder nach dem Winter bezahlt werden. Wenn es schon Winter ist, kann es nicht noch einmal Winter werden.

Eine solche Übersicht zu erstellen hilft in zweierlei Hinsicht.

  1. Plane alle Möglichkeiten des Spielers ein: In jedem Punkt gilt es zu überlegen, welche Ereignisse eintreten können. Falls der Spieler den Gegner des Dorfes besiegen kann, muss das ebenfalls beachtet werden. Von „Dorf wird verteidigt“ könnte ein „Ereignis: Gegner besiegt“ zu der Siegmeldung oder einer Questbelohnung führen. Falls hingegen das Dorf zerstört wird, muss der Tribut aus dem Menü entfernt werden.
  2. Bereite alle notwendigen Möglichkeiten im Spiel vor: Für jeden Punkt muss sichergestellt werden, dass alle Übergänge, die man geplant hat, auch wirklich möglich sind. Konkret bedeutet das in diesem Fall, dass der Tribut nach jedem Winter für den Spieler zur Verfügung stehen muss.
scripting/tutorials/level1/programming_intro.txt · Zuletzt geändert: 2023/05/09 17:37 von fritz_98