Informatik

Felder im Spiel

Im Kapitel Felder hast du gelernt, viele Werte derselben Art unter einem Namen zu speichern. In Spielen ist das überall: Kacheln einer Landschaft, Münzen, Gegner, Sprüche einer Figur, die Punkte mehrerer Runden.

Die Leitfrage für dein Spiel: Wo hast du viele Dinge derselben Art, die du einzeln anlegst? Und wo möchtest du über alle diese Dinge hinweg etwas zählen, suchen oder summieren?

Die MVPs sind kleine, eigenständig lauffähige Beispiele. Starte ein Beispiel mit ▶ und klicke für die Tastensteuerung in seine Ausgabe. Im Reiter Beispiel.java steht die jeweilige Idee. Falls ein Reiter Baukasten.java dabei ist, enthält er vorbereitete Hilfen für Figuren, Texte und Steuerung. Probiere zuerst die angegebene Änderung aus und übertrage dann die Idee in deine Werkstatt.

Mechaniken

Such dir mindestens eine aus. Du darfst sie verändern, kombinieren oder dir etwas ganz anderes ausdenken.

Die Welt als Plan

Im Spiel: Die ganze Landschaft steht als Bild aus Zeichen im Code. Wer sie ändern will, ändert nur ein paar Buchstaben.

Dahinter steckt: ein Feld von Zeichenketten. Jede Zeichenkette ist eine Zeile der Bühne, jedes Zeichen ein Feld von 48 × 48 Pixeln. Zwei verschachtelte Schleifen gehen alle Zeichen durch, und eine Verzweigung entscheidet, was an diese Stelle kommt.

private String[] plan = {
   "################",
   "#S.....M.......#",
   "#..B.......F...#",
   // ... insgesamt 9 Zeilen mit je 16 Zeichen
};
for (int z = 0; z < plan.length; z++) {
   for (int s = 0; s < plan[z].length(); s++) {
      char zeichen = plan[z].charAt(s);
      if (zeichen == '#') {
         this.setzeStein(this.zuX(s), this.zuY(z));
      } else if (zeichen == 'M') {
         // ...
      }
   }
}

Die Methoden zuX und zuY rechnen Spalte und Zeile in Koordinaten um: -360 + pSpalte * 48 und 192 - pZeile * 48.

Aufwand: ★★☆

MVP zum Ausprobieren: Versetze ein # oder ein M im Plan und starte neu.

In dein Spiel übertragen: Lass jede Zeichenart den passenden Gegenstand erzeugen.

Mehrere Räume

Im Spiel: Am rechten Rand gibt es eine Lücke in der Mauer. Wer hindurchgeht, steht im nächsten Raum, mit eigener Landschaft und eigenen Münzen. Links geht es zurück.

Dahinter steckt: ein Plan je Raum, also mehrere Felder von Zeichenketten, und eine Variable für den aktuellen Raum. Verlässt der Spieler die Bühne, nimmt this.removeAll() alles herunter, und die Welt baut den anderen Raum aus seinem Plan auf. Der Spieler kommt auf der gegenüberliegenden Seite wieder herein. Damit das übersichtlich bleibt, steckt der Aufbau in einer Methode baueRaum(String[] pPlan). Vorsicht: removeAll() nimmt auch den Spieler herunter. Er muss danach wieder auf die Bühne. Ob du dafür ein Feld wie planWiese einfach einer Variable plan zuweisen darfst oder es kopieren musst, klärt in der Qualifikationsphase das Kapitel über Referenzen.

Achtung: Weil jeder Raum beim Betreten neu gebaut wird, vergisst er alles. Eingesammelte Münzen liegen wieder da, besiegte Gegner stehen wieder auf. Wie sich jeder Raum seinen Zustand merkt, steht bei Räume als eigene Bühnen in Objektorientierung im Spiel.

Aufwand: ★★★

MVP zum Ausprobieren: Drücke rechts oder links, um den anderen Raum aus seinem Plan aufzubauen.

In dein Spiel übertragen: Rufe baueRaum beim Durchqueren eines Ausgangs auf. Erzeuge entfernte Figuren beim Neubau erneut.

Eine Welt größer als der Bildschirm

Im Spiel: Die Landschaft ist viel breiter als das Fenster. Die Kamera folgt der Figur, und man entdeckt die Welt beim Laufen.

Dahinter steckt: ein Plan mit mehr Spalten und Zeilen, als auf die Bühne passen, zum Beispiel 40 × 20, und eine virtuelle Kamera. In run() richtet sie sich jedes Bild neu auf den Spieler aus:

this.getCamera().setPosition(held.getX(), held.getY());

Probiere aus, was mit den Anzeigen passiert, wenn sich die Kamera bewegt.

Aufwand: ★★☆

MVP zum Ausprobieren: Laufe mit den Pfeiltasten nach rechts. Beobachte auch die Textzeile.

In dein Spiel übertragen: Richte die Kamera in run auf deine Figur aus. Anzeigen brauchen eine feste Position relativ zum Fenster.

Ein Händler mit Sprüchen

Im Spiel: Eine Figur am Wegrand sagt bei jedem Start etwas anderes.

Dahinter steckt: ein Feld von Zeichenketten und ein Index. Woher der Index kommt, entscheidest du: von einer Zufallszahl oder von der Anzahl der Münzen, damit sich der Spruch beim Sammeln ändert.

private String[] sprueche = {
   "Schöner Tag heute!",
   "Hinter dem Felsen liegt etwas.",
   "Ich verkaufe nichts. Noch nicht."
};

Math.random() liefert eine zufällige Kommazahl von 0 bis knapp unter 1. Mal die Länge des Felds und in eine ganze Zahl umgewandelt wird daraus ein Index: (int) (Math.random() * sprueche.length).

Aufwand: ★☆☆

MVP zum Ausprobieren: Starte mehrfach oder drücke Leertaste für einen neuen zufälligen Spruch.

In dein Spiel übertragen: Wähle den Index zufällig oder aus dem Zustand deines Spiels.

Münzen mit verschiedenen Werten

Im Spiel: Die erste Münze bringt 5 Punkte, die zweite 10, die dritte 50.

Dahinter steckt: ein Feld mit den Werten, und die Zahl der schon eingesammelten Münzen ist der Index: punktzahl = punktzahl + werte[punkte];. Was passiert, wenn es mehr Münzen als Werte gibt? Das ist die typische Fehlermeldung beim Zugriff über den Feldrand hinaus.

Aufwand: ★☆☆

MVP zum Ausprobieren: Drücke viermal Leertaste. Nach drei Münzen wird nicht mehr ins Feld gegriffen.

In dein Spiel übertragen: Prüfe den Index vor dem Zugriff und erhöhe ihn erst nach dem Einsammeln.

Wege aus parallelen Feldern

Im Spiel: Münzen liegen genau dort, wo du sie haben möchtest, ohne Plan und ohne zwanzig einzelne Aufrufe.

Dahinter steckt: parallele Felder für die x- und y-Koordinaten. Die Münze Nummer i liegt bei (xs[i], ys[i]).

Aufwand: ★☆☆

MVP zum Ausprobieren: Ändere xs[2] und ys[2], indem du die dritten Werte im Code austauschst.

In dein Spiel übertragen: Halte beide Felder gleich lang; derselbe Index beschreibt denselben Platz.

Statistik nach dem Spiel

Im Spiel: Am Ende steht, wie viele Sekunden du für jede Münze gebraucht hast und welche am längsten gedauert hat.

Dahinter steckt: ein Feld, in das wennMuenzeEingesammelt() die aktuelle Zeit schreibt. Am Ende durchläufst du es mit den drei Grundaufgaben: summieren, Extremwert suchen, zählen.

Aufwand: ★★★

MVP zum Ausprobieren: Drücke dreimal Leertaste mit verschieden langen Pausen.

In dein Spiel übertragen: Speichere entweder Zeitabstände oder Zeitpunkte. Bei Zeitpunkten musst du für die Einzeldauern die Differenzen bilden.

Deine eigene Idee

Wo legst du in deinem Code noch viele Dinge einzeln an? Bäume, Gegner, Schilder, Sprüche? Was davon ließe sich in einem Feld sammeln, und was würdest du dann damit machen?

Fürs Tagebuch: Zeige an deinem Spiel, was ohne Feld schwieriger wäre. Wie viele Variablen bräuchtest du sonst, und welche Schleife könntest du dann nicht schreiben?

Checkpoint

Im Checkpoint nach diesem Kapitel entsteht die ganze Welt aus einem Plan: Steine, Pflanzen, Münzen und der Startplatz. Wie du ihn lädst, steht auf der Startseite der Werkstatt.

Checkpoint: Felder (Online-IDE)

Weiterbauen kannst du in deiner Werkstatt.

Felder im Spiel

Teilbare URL erstellen

Abschnitte auswählen