← Projects/Tutorials/Game-Design 101
MyKeyZ Tutorial · Game-Design

Game-Design 101

Wie baut man ein Spiel, das Spass macht? Hier baust du es Schritt für Schritt, wie nach einem Möbel-Bauplan. Bei jedem Schritt siehst du sofort, was sich ändert, und welche unsichtbaren Teile dahinter die Arbeit machen.

EinsteigerIntro, Start, Story und 9 KapitelVorschau läuft im Browser
TeilelisteWas du im Kapitel brauchst, wie die Schrauben-Übersicht.
VorschauLäuft wirklich, ändert sich mit jedem Schritt. Rot umrandet: neu.
UnsichtbarDie Teile, die du nicht siehst, aber ohne die nichts geht.
⚠️ AchtungDer typische Anfängerfehler an dieser Stelle.
BauplanDie Roadmap deines Spiels

Fünf Entscheide in dieser Reihenfolge, bevor gebaut wird. Die Kapitel unten gehen sie Schritt für Schritt durch.

GenreWelche Art Spiel?
SpielmechanikWas tust du?
DesignWie sieht es aus, wie fühlt es sich an?
SettingWo und wann spielt es?
TechstackWomit baust du es?

Die Kapitel sind vorerst auf Deutsch. Dieser Überblick ist schon zweisprachig.

✦

Die Kunst des Game Designs

Warum wir spielen, und was Game Design ausmacht.

Teileliste: was du in diesem Kapitel brauchst
  • 1. Der Spieltrieb: Warum wir spielen (Homo Ludens)
  • 2. Die Spielwiesen des modernen Game Designs
  • 3. Deine Rolle als Game Designer
1
Schritt 1 von 4

Die Kunst des Game Designs

„Wir hören nicht auf zu spielen, weil wir alt werden. Wir werden alt, weil wir aufhören zu spielen.“

— George Bernard Shaw

Das Spielen begleitet uns ein Leben lang: Von den ersten neugierigen Schritten im Kindesalter bis hin zu komplexen digitalen Welten, taktischen Brettspielen oder fesselnden Rollenspielen. Aber warum fasziniert uns das Spielen seit Jahrtausenden? Und was macht ein richtig gutes Spiel aus?

2
Schritt 2 von 4

1. Der Spieltrieb: Warum wir spielen (Homo Ludens)

Spielen ist weit mehr als nur Zeitvertreib – es ist ein menschliches Grundbedürfnis. In der Spielforschung (Ludologie) gilt der Mensch als Homo Ludens (der spielende Mensch). Im geschützten Raum eines Spiels lernen wir:

  • Regeln auszutesten, ohne echte Konsequenzen befürchten zu müssen.
  • Gemeinschaft zu erleben und soziale Bindungen zu stärken.
  • In neue Rollen zu schlüpfen und eigene Grenzen auszuloten.

Schon historische Klassiker wie Mensch ärgere dich nicht (inspiriert vom altindischen Pachisi) zeigten: Spiele sind ein Spiegel des Lebens – voller Hoffnung, kleiner Krisen und dem Glück des gemeinsamen Gewinnens (oder Verlierens).

3
Schritt 3 von 4

2. Die Spielwiesen des modernen Game Designs

Als Game Designer gestaltest du Welten, die ganz unterschiedliche menschliche Bedürfnisse ansprechen. Die moderne Spiellandschaft teilt sich dabei in drei grosse Hauptbereiche auf:

BereichCharakteristikWas es im Spielenden auslöst
Brett- & GesellschaftsspieleAnaloge Runden am Tisch, oft prämiert durch Auszeichnungen wie Spiel des Jahres.Verbindung & Entschleunigung: Fördert echte soziale Interaktion, Haptik und das Miteinander im Kreis von Familie und Freunden.
Videospiele & eSportInteraktive digitale Welten – von kreativen Sandboxen wie Minecraft bis zu hochkompetitiven Ligen.Immersion & Leistung: Bietet packende Storys, maximale Gestaltungsfreiheit, fordert aber auch Skill, Reaktion und Verantwortungsbewusstsein.
Rollenspiele & CosplayAktives Verkörpern fremder Charaktere (Pen & Paper, LARP, digitale RPGs).Identität & Gemeinschaft: Erlaubt kreativen Selbstausdruck, das Ausleben fantastischer Welten und das Wachsen von starken Communitys.
4
Schritt 4 von 4

3. Deine Rolle als Game Designer

Hier kommt die Magie ins Spiel: Game Design ist die Kunst, Regeln, Mechaniken und Welten so miteinander zu verweben, dass aus einfachem Code oder Pappe ein unvergessliches Erlebnis wird.

Ob du ein kleines Tool für zwischendurch baust oder ein komplexes System entwirfst – du erschaffst den Rahmen, in dem Menschen Freude, Spannung und Gemeinschaft erleben.

00

Start: Game heisst Spiel

Bevor du baust: Woher kommt das Wort «Game», warum entscheidest du zuerst das Genre, und wie sieht der Plan aus, mit dem aus einer Idee ein Spiel wird?

Teileliste: was du in diesem Kapitel brauchst
  • Das Wort: «Game» ist Englisch und heisst Spiel
  • Die Genres: sehr viele, auch solche mit ernstem Hintergrund
  • Das Konzept: zuerst das Genre entscheiden, planen und festhalten
  • Die Roadmap: Genre → Spielmechanik → Design → Setting → Techstack
  • Danach: Storytelling (Kapitel ★ Story)
1
Schritt 1 von 9

Game heisst Spiel

Das Wort «Game» kommt aus dem Englischen und heisst Spiel. Das solltest du nicht vergessen.

Egal wie gross dein Projekt wird und wie viel Technik dahintersteckt: Am Ende baust du ein Spiel, also etwas, das man spielen will.

VorherEin Wort.
JetztGame heisst Spiel. Nicht vergessen!

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.bild = 'spiel';
draw · zeichnen
if (S.bild === 'spiel') {
  text('GAME', 82, 62, '#4de1ff', 30, 'center');
  text('=', 160, 62, '#ffffff', 30, 'center');
  text('SPIEL', 238, 62, '#ffe36b', 30, 'center');
  text('Nicht vergessen!', 160, 92, '#ffffff', 13, 'center');
  const hoch = Math.abs(Math.sin(t * 3)) * 34;   // ein hüpfender Ball
  circle(160, GROUND - 8 - hoch, 8, '#ff9f43');
  rect(0, GROUND, W, H - GROUND, '#2a3a55');
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Spielschleife loop() in gd101.js
    Läuft 60 Mal pro Sekunde und ruft setup einmal, danach immer wieder draw auf. Auch dieses Bild ist ein kleines Programm.
    Ohne: Es gäbe nur ein leeres Feld.
  • Die Zeit t Spielschleife
    Zählt die Sekunden seit dem Start. Der Ball hüpft, weil seine Höhe aus t berechnet wird.
    Ohne: Der Ball stünde still.
Probier esDenk an dein Lieblingsspiel. Warum spielst du es so gern? Schreib es dir in einem Satz auf.
2
Schritt 2 von 9

Viele Genres, auch ernste: zuerst das Genre entscheiden

Es gibt sehr viele Genres: Jump-and-Run, Rätsel, Strategie, Rennspiel, Abenteuer und viele mehr. Und es gibt auch Genres mit einem sehr ernsten Hintergrund, zum Beispiel Spiele über Krieg, Flucht oder eine Naturkatastrophe.

Darum gilt beim Konzept: Zuerst entscheidest du, welches Genre du machen willst. Dann planst du es und hältst es im Konzept fest. Erst danach geht es weiter:

  1. Genre entscheiden, planen, im Konzept festhalten
  2. die Roadmap: Genre → Spielmechanik → Design → Setting → Techstack
  3. das Storytelling
VorherGame heisst Spiel.
JetztZuerst das Genre entscheiden und im Konzept festhalten, dann Roadmap, dann Storytelling.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.bild = 'ernst';
draw · zeichnen
if (S.bild === 'ernst') {
  const karten = [['1 · Genre', 'entscheiden, planen, festhalten', '#4de1ff'], ['2 · Roadmap', 'Genre bis Techstack', '#ff9f43'], ['3 · Story', 'Storytelling', '#ffd24a']];
  karten.forEach((k, i) => {
    const x = 12 + i * 102;
    rect(x, 40, 92, 96, '#162544');
    rect(x, 40, 92, 5, k[2]);
    text(k[0], x + 46, 72, k[2], 12, 'center');
    text(k[1], x + 46, 100, '#ffffff', 7, 'center');
  });
  text('Das Konzept: in dieser Reihenfolge', 160, 26, '#ffffff', 12, 'center');
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Entscheidung vor dem Code
    Das Genre steht in keinem Programm. Es steht in deinem Konzept, und alles andere (Mechanik, Bilder, Texte, Töne) richtet sich danach. Bei einem ernsten Hintergrund planst du besonders sorgfältig, was dein Spiel zeigen soll.
    Ohne: Du baust drauflos und merkst spät, dass Teile nicht zusammenpassen.
Probier esWähle ein Genre für dein eigenes Spiel und schreib es als ersten Satz in dein Konzept: «Mein Spiel ist ein …».
AchtungDas Genre erst am Schluss festlegen geht fast immer schief. Dann passen Mechanik, Bilder und Geschichte nicht zusammen.
3
Schritt 3 von 9

Die Roadmap: so sieht der Plan aus

Eine Roadmap ist dein Fahrplan: Welche Entscheidung kommt zuerst, welche danach? Für ein Spiel gehst du in dieser Reihenfolge vor:

Genre → Spielmechanik → Design → Setting → Techstack

Jede Station baut auf der vorherigen auf. Nach der Roadmap kommt das Storytelling (Kapitel ★ Story). In den nächsten fünf Schritten schauen wir jede kurz an, immer mit einem Mini-Beispiel: Ship Ahoi!!!, der Seeschlacht aus dem Lab.

VorherEine Idee im Kopf.
JetztFünf Stationen in einer festen Reihenfolge.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.bild = 'karte';
S.hl = 0;   // 0 = alle Stationen der Reihe nach zeigen
S.namen = ['Genre', 'Mechanik', 'Design', 'Setting', 'Techstack'];
S.bsp = ['Strategie, Seeschlacht', 'Feld antippen: Platsch!', 'Comic-Meer, grosse Knöpfe', 'Käpt\'n Krawall jagt Meerjungfrauen', 'HTML + JavaScript, offline'];
draw · zeichnen
if (S.bild === 'karte') {
  const h = S.hl || 1 + Math.floor(t / 1.5) % 5;   // welche Station leuchtet
  for (let i = 0; i < 5; i++) {
    const x = 6 + i * 63, an = i + 1 === h;
    rect(x, 52, 56, 40, an ? '#ff4d4d' : '#162544');
    text(i + 1, x + 28, 68, '#ffffff', 11, 'center');
    text(S.namen[i], x + 28, 84, '#ffffff', 9, 'center');
    if (i < 4) text('→', x + 59, 76, '#8aa0c8', 10, 'center');
  }
  text('Roadmap', 160, 32, '#ffe36b', 15, 'center');
  text('Beispiel: ' + S.bsp[h - 1], 160, 122, '#ffffff', 11, 'center');
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Reihenfolge
    Das Genre entscheidet, welche Mechanik passt. Die Mechanik bestimmt, was das Design zeigen muss. Das Setting gibt allem eine Welt. Und erst am Schluss wählst du die Technik, die das alles kann.
    Ohne: Du baust zuerst mit einer Technik und merkst später, dass sie für dein Spiel nicht taugt.
Probier esSchau zu, wie die Stationen der Reihe nach aufleuchten. Unten steht jeweils, wie es bei Ship Ahoi!!! aussieht.
4
Schritt 4 von 9

1 · Genre: Welche Art Spiel?

Das Genre ist die Art des Spiels: Jump-and-Run, Rätsel, Strategie, Rennspiel, Abenteuer, Simulation. Du hast es schon im Konzept entschieden; in der Roadmap ist es die erste Station, auf der alles andere aufbaut. Es sagt den Spielern schon vor dem ersten Klick, was sie ungefähr erwartet.

Mini-Beispiel: Ship Ahoi!!! ist ein Strategiespiel, genauer eine Seeschlacht wie «Schiffe versenken». Man denkt nach, statt schnell zu reagieren.

VorherAlle Stationen.
JetztStation 1: Genre.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.hl = 1;
Probier esWelches Genre haben deine drei Lieblingsspiele? Gibt es ein Genre, das du noch nie gespielt hast?
5
Schritt 5 von 9

2 · Spielmechanik: Was tust du?

Die Spielmechanik ist das, was der Spieler immer wieder tut, und was danach passiert. Mehr dazu in Kapitel 2.

Mini-Beispiel: Bei Ship Ahoi!!! tippst du ein Feld im fremden Meer an. Dann kommt «Platsch!» (daneben) oder «BOING!» (Treffer). Wer ein Schiff verliert, fährt bei einer anderen Crew mit: «Niemand bleibt zurück».

VorherStation 1: Genre.
JetztStation 2: Spielmechanik.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.hl = 2;
Probier esBeschreibe die Mechanik von einem Spiel, das du kennst, in einem Satz: «Ich tue …, dann passiert …».
6
Schritt 6 von 9

3 · Design: Wie sieht es aus, wie fühlt es sich an?

Beim Design entscheidest du, wie das Spiel aussieht, klingt und sich bedient: Farben, Figuren, Knöpfe, Töne, wie schwer es ist.

Mini-Beispiel: Ship Ahoi!!! hat ein buntes Comic-Meer, laute Effekte wie «BOING!» und grosse Knöpfe, die man auch auf dem Handy gut trifft.

VorherStation 2: Spielmechanik.
JetztStation 3: Design.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.hl = 3;
Probier esStell dir dasselbe Spiel ganz in Grau und ohne Ton vor. Wäre es noch gleich lustig?
7
Schritt 7 von 9

4 · Setting: Wo und wann spielt es?

Das Setting ist die Welt des Spiels: der Ort, die Zeit, die Figuren. Es gibt der Mechanik einen Sinn.

Mini-Beispiel: Ship Ahoi!!! spielt auf hoher See. Der fiese Käpt'n Krawall jagt die Meerjungfrauen, und die Crews halten zusammen. Wie das Setting zur Geschichte wird, zeigt das Kapitel ★ Story.

VorherStation 3: Design.
JetztStation 4: Setting.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.hl = 4;
Probier esNimm ein ganz einfaches Spiel: Eine Figur läuft hin und her und sammelt Lichter. Erfinde zwei ganz verschiedene Settings dafür, zum Beispiel Weltraum und Unterwasser.
8
Schritt 8 von 9

5 · Techstack: Womit baust du es?

Der Techstack sind deine Werkzeuge: Programmiersprache, Programme, wo das Spiel läuft (Browser, Handy, Konsole). Ganz am Schluss, denn die Technik muss zum Spiel passen, nicht umgekehrt.

Mini-Beispiel: Ship Ahoi!!! ist mit HTML und JavaScript gebaut, läuft im Browser und sogar offline. Mehrere Geräte verbinden sich ohne Internet über einen QR-Code.

VorherStation 4: Setting.
JetztStation 5: Techstack.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.hl = 5;

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Dieser Kurs
    Auch Game-Design 101 hat einen Techstack: HTML, CSS und JavaScript, ohne Bibliothek und ohne Internet. Die Vorschau hier ist ein canvas.
Probier esWelche Werkzeuge hast du schon? Ein Computer mit Browser reicht für den Anfang.
9
Schritt 9 von 9

Das nimmst du mit

  • Game heisst Spiel. Das solltest du nicht vergessen.
  • Es gibt sehr viele Genres, auch solche mit sehr ernstem Hintergrund. Beim Konzept entscheidest du zuerst das Genre, planst es und hältst es im Konzept fest.
  • Danach die Roadmap: Genre → Spielmechanik → Design → Setting → Techstack. Erst die Idee, ganz am Schluss die Technik.
  • Dann das Storytelling: Kapitel ★ Story.
VorherDu kennst den Fahrplan.
JetztWeiter im Kapitel ★ Story: Geschichten, die packen.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.hl = 0;

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Dein Ideenblatt
    In Kapitel 8 füllst du ein eigenes Ideenblatt aus. Die Roadmap hilft dir dabei, nichts zu vergessen.
Besonders wichtig★

Storytelling: Geschichten, die packen

Warum spielt man ein Spiel lieber, wenn es eine Geschichte hat, auch wenn sie ganz einfach ist? Wir nehmen ein kleines Spiel, «Fang das Licht», und geben ihm eine Story.

Teileliste: was du in diesem Kapitel brauchst
  • Figur: jemand, mit dem man mitfiebert
  • Wunsch: was die Figur will oder braucht
  • Hindernis: was im Weg steht
  • Gefühl: Freude, Spannung, Erleichterung
  • Ende: wie es ausgeht, auch wenn es knapp nicht reicht
  • Steuerung: Pfeiltasten oder die Knöpfe ◀ ▶ unter der Vorschau
1
Schritt 1 von 6

Viele Spiele haben kaum Story

Viele Spiele sind zum schnellen Konsumieren gemacht: kurz spielen, Punkte holen, weg. Eine Geschichte gibt es dort kaum oder gar nicht.

Hier siehst du ein kleines Spiel: «Fang das Licht». Du steuerst die blaue Figur mit den Pfeiltasten oder den Knöpfen ◀ ▶ nach links und rechts. Berührst du ein gelbes Licht, gibt es einen Punkt und es springt woanders hin. Das orange Licht gibt 3 Punkte, verschwindet aber bald wieder. Du hast 20 Sekunden Zeit, danach startet Tippen eine neue Runde. In Kapitel 1 baust du genau dieses Spiel später selbst, Schritt für Schritt.

Es funktioniert. Aber warum sammelst du die Lichter eigentlich?

VorherEin fertiges kleines Spiel (in Kapitel 1 baust du es selbst).
JetztDasselbe Spiel, noch ohne Geschichte.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Mechanik allein aus Kapitel 1
    Ziel, Regel, Rückmeldung und Zeitdruck kommen aus Kapitel 1 und laufen hier schon (unten bei «Ganzer Code bis hier»). Nichts davon erzählt etwas.
    Ohne: Ohne Mechanik gäbe es kein Spiel. Ohne Story aber schon, nur ein bisschen leerer.
Probier esSpiele eine Runde. Wie fühlt es sich an, wenn die Zeit um ist? Ist es dir wichtig, wie viele Lichter du hattest?
2
Schritt 2 von 6

Eine Story packt dich

Eine Geschichte soll den Spieler packen, auch in einem schnellen Spiel. Dafür reicht ein einziger Satz: Wer braucht Hilfe, und warum?

Jetzt ist es Leuchtturm Lux, der nicht mehr leuchtet. Jedes Licht, das du fängst, macht ihn heller. Gleiche Regeln, gleiche Steuerung, aber plötzlich hat jedes Licht einen Sinn. Genau das macht ein Spiel viel wertvoller.

VorherLichter sammeln, einfach so.
JetztLichter sammeln, damit Leuchtturm Lux wieder leuchtet.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.ziel = 10;   // so viele Lichter braucht Lux
draw · zeichnen
const hell = Math.min(1, S.score / S.ziel);   // 0 = aus, 1 = ganz hell
if (hell > 0) { ctx.globalAlpha = hell * 0.5; circle(160, 50, 26, '#ffe36b'); ctx.globalAlpha = 1; }
rect(154, 58, 12, 50, '#e8e8f0');   // der Turm
rect(154, 70, 12, 7, '#ff4d4d');
rect(154, 90, 12, 7, '#ff4d4d');
circle(160, 52, 6, hell >= 1 ? '#ffe36b' : '#555c70');   // die Lampe
text('Lux ist aus! Sammle ' + S.ziel + ' Lichter.', 160, 30, '#ffe36b', 11, 'center');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Helligkeit hell draw
    Eine einzige Rechnung (Punkte geteilt durch Ziel) verbindet die Story mit der Mechanik: Du siehst deinen Fortschritt als Geschichte, nicht nur als Zahl.
    Ohne: Die Punkte wären wieder nur eine Zahl oben links.
Probier esSpiele nochmal. Willst du jetzt eher die 10 schaffen? Achte darauf, wie sich die Lampe verändert.
3
Schritt 3 von 6

Ein gutes Ende, auch wenn es knapp ist

Eine Geschichte braucht ein Ende. Schaffst du die 10 Lichter, leuchtet Lux und die Schiffe finden heim. Schaffst du es nicht, ist das kein «Verloren!», sondern ein freundliches «Fast! Nochmal?».

So bleibt man dran: Man will die Geschichte gut ausgehen sehen.

VorherNach 20 Sekunden steht nur «Zeit um!».
JetztDie Geschichte geht gut aus oder lädt freundlich zum Nochmal ein.

Neu im Code nur diese Zeilen kommen dazu

update · Regeln
if (S.score >= S.ziel && !S.gerettet) {
  S.gerettet = true;
  beep(880, 0.2);   // Lux leuchtet!
}
draw · zeichnen
if (S.time <= 0) {
  rect(0, 60, W, 56, '#0f1a33');
  if (S.gerettet) text('Lux leuchtet! Die Schiffe finden heim.', 160, 86, '#ffe36b', 12, 'center');
  else text('Fast! Noch ' + (S.ziel - S.score) + ' Lichter. Nochmal?', 160, 86, '#ffffff', 12, 'center');
  text('Tippen = neue Runde', 160, 104, '#8aa0c8', 10, 'center');
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Merker S.gerettet update
    Merkt sich, dass das Ziel der Geschichte erreicht ist, damit der Jubel-Ton nur einmal kommt.
    Ohne: Der Ton käme bei jedem weiteren Licht wieder.
Probier esSpiele einmal absichtlich schlecht und einmal gut. Wie fühlen sich die beiden Enden an?
AchtungEin Ende, das Spieler auslacht, macht keine Lust auf mehr. Freundlich bleiben, auch beim Verlieren.
4
Schritt 4 von 6

Beispiel: Ship Ahoi!!!

Ein echtes Beispiel aus dem Lab: Ship Ahoi!!! und Ship Ahoi!!! 2... x3. Die Geschichte ist super einfach:

  • Käpt'n Krawall ist der Fiesling, der die Meerjungfrauen jagt.
  • Die Meerjungfrau Valeria flieht und bittet die Crews um Hilfe.
  • Moritz die Muräne versteckt sich in Felshöhlen: «Blubb! Mich findet ihr nie!»
  • Bruno Barracuda ist schnell wie der Blitz und schiesst zwei Mal.

Mehr ist es nicht. Und trotzdem spielen Kinder das gern, weil es Emotionen weckt: Man will Valeria retten, man lacht über Moritz, man freut sich, wenn Krawall im Gummiboot davonpaddelt.

VorherEine Geschichte mit einem Satz.
JetztEin Spiel, das mit wenigen Figuren eine ganze Welt baut.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Figuren mit einer Eigenschaft
    Jede Figur hat genau eine Sache, die man sich merkt: Krawall ist laut, Moritz versteckt sich, Bruno ist schnell. Mehr braucht es für den Anfang nicht.
Probier esErfinde eine Figur für «Fang das Licht». Welche eine Eigenschaft soll man sich merken?
5
Schritt 5 von 6

Spielen und dabei denken

Das Schönste: Weil die Geschichte packt, bleiben die Kinder dran, und sind dabei produktiv. Sie überlegen sich Strategien: Wo versteckt sich Moritz als Nächstes? Wie verteilen wir die Schüsse? Wer hilft wem?

Die Story ist also nicht nur Dekoration. Sie ist der Grund, warum man sich anstrengt, nachdenkt und gemeinsam Lösungen findet.

VorherStory weckt Gefühle.
JetztGefühle sorgen dafür, dass man mitdenkt und Strategien entwickelt.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Gefühl und Mechanik zusammen
    In Ship Ahoi!!! ist «Niemand bleibt zurück» beides: eine Regel (wer sein Schiff verliert, fährt mit) und ein Teil der Geschichte (die Crews halten zusammen). Wenn Regel und Story dasselbe sagen, ist es besonders stark.
Probier esSpiele hier noch eine Runde. Hast du dir eine Strategie überlegt, um die 10 Lichter sicher zu schaffen?
6
Schritt 6 von 6

Das nimmst du mit

  • Viele Spiele haben kaum Story. Das geht, aber man verschenkt viel.
  • Schon ein Satz packt: Wer braucht Hilfe, und warum?
  • Verbinde Story und Mechanik: Fortschritt im Spiel = Fortschritt in der Geschichte.
  • Ein gutes Ende ist freundlich, auch wenn es knapp nicht gereicht hat.
  • Einfache Figuren mit einer Eigenschaft reichen, siehe Käpt'n Krawall, Valeria, Moritz und Bruno.
  • Story weckt Emotionen, und wer mitfiebert, denkt mit und entwickelt Strategien.
VorherDu kannst einem Spiel eine Geschichte geben.
JetztWeiter in Kapitel 1: Was ist ein Spiel? Dort baust du «Fang das Licht» selbst.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Deine Story im Ideenblatt
    Schreib beim Ideenblatt in Kapitel 8 auch einen Satz zur Geschichte dazu: Wer braucht Hilfe, und warum?
01

Was ist ein Spiel?

Was macht aus einem Ding ein Spiel? Wir bauen «Fang das Licht» und sehen, was dazukommt.

Teileliste: was du in diesem Kapitel brauchst
  • Ziel: was man erreichen will
  • Regel: was erlaubt ist und was passiert
  • Rückmeldung: wie das Spiel zeigt, was man getan hat
  • Entscheidung: eine Wahl, die etwas kostet
  • Steuerung: Pfeiltasten oder die Knöpfe unter der Vorschau
1
Schritt 1 von 8

Die leere Bühne

Eine gängige Beschreibung: Ein Spiel ist eine freiwillige Aufgabe mit Regeln, einem Ziel und Rückmeldung. Fehlt etwas davon, ist es Spielzeug oder Film. Wir bauen alle vier Zutaten nacheinander ein.

Jetzt gibt es nur die Bühne: einen Boden. Man kann nichts tun, nichts erreichen, nichts verlieren.

VorherNichts.
JetztEin Boden. Noch kein Spiel.

Neu im Code nur diese Zeilen kommen dazu

draw · zeichnen
rect(0, GROUND, W, H - GROUND, '#2a3a55');   // Boden

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Spielschleife loop() in gd101.js
    Läuft 60 Mal pro Sekunde und ruft der Reihe nach immer, input, physics, update und zuletzt draw auf. Das ist das Herz jedes Spiels.
    Ohne: Es gäbe nur ein einziges Standbild.
  • Die Bühne (Canvas) Vorschau-Fläche
    Eine 320 × 180 Punkte grosse Zeichenfläche. rect(x, y, breite, höhe, farbe) malt ein Rechteck. Oben links ist (0, 0).
    Ohne: Du könntest nichts zeichnen.
Probier esTippe in die Vorschau. Passiert etwas? Nein, und das ist der Punkt: Ohne die vier Zutaten reagiert nichts.
2
Schritt 2 von 8

Ein Ziel

Zuerst das Ziel: ein Licht auf dem Boden. Es gibt jetzt etwas, das man haben will, auch wenn man noch nichts tun kann.

Ohne Ziel fragt sich der Spieler: «Und jetzt?»

VorherNur ein Boden.
JetztEin Licht, das man haben möchte.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.star = { x: 250 };
draw · zeichnen
circle(S.star.x, GROUND - 14, 7, '#ffe36b');   // das Licht

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Zustand S Objekt S
    Hier merkt sich das Spiel alles, was sich ändern kann (Position, Punkte, Zeit). setup füllt es einmal beim Start.
    Ohne: Das Spiel vergisst von einem Bild zum nächsten, wo das Licht ist.
Probier esStarte mit «⟲ Neustart» neu. Das Licht steht jedes Mal am selben Ort, denn setup läuft einmal beim Start.
3
Schritt 3 von 8

Eine Aktion

Jetzt braucht der Spieler eine Aktion: eine kleine Figur, die du nach links und rechts bewegst. Die Eingabe (Pfeiltasten, Knöpfe) wird in input gelesen.

VorherDu kannst nichts tun.
JetztDu bewegst die Figur zum Licht.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.p = { x: 40 };
input · Eingaben lesen
S.p.x = clamp(S.p.x + input.dir * P.SPEED, 8, W - 8);
draw · zeichnen
circle(S.p.x, GROUND - 8, 8, '#4de1ff');   // die Figur
Regler (Werte, die du verstellen kannst)
P.SPEED = 2.4;   // Tempo, Bereich 0.5 bis 5

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Eingabe input.dir gd101.js
    Fasst Pfeiltasten, A und D und die Touch-Knöpfe zusammen: -1 links, 0 nichts, 1 rechts. Dein Code muss nicht wissen, ob jemand Tastatur oder Finger benutzt.
    Ohne: Jede Eingabeart müsste einzeln programmiert werden.
  • Die Begrenzung clamp Hilfsfunktion
    Hält den Wert zwischen zwei Grenzen, damit die Figur nicht aus dem Bild läuft.
    Ohne: Die Figur verschwindet links oder rechts.
Probier esSchiebe den Regler «Tempo». Wann fühlt sich die Figur zu träge oder zu hektisch an?
AchtungDie Figur kann das Licht berühren, aber nichts passiert. Eine Aktion ohne Regel ist nur Herumlaufen.
4
Schritt 4 von 8

Eine Regel

Die Regel verbindet Aktion und Ziel: Wenn die Figur beim Licht ist, dann bekommt man einen Punkt, und das Licht springt woanders hin.

Das Spiel prüft das in update, 60 Mal pro Sekunde.

VorherBerühren bringt nichts.
JetztBerühren zählt einen Punkt, das Licht springt.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.score = 0;
update · Regeln
if (Math.abs(S.p.x - S.star.x) < 14) {
  S.score++;
  S.star.x = rnd(30, 290);
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Wenn-dann-Prüfung update
    Der Abstand zwischen Figur und Licht wird jedes Bild gemessen. Unter 14 Punkten gilt als «berührt».
    Ohne: Das Spiel merkt nie, dass du das Ziel erreicht hast.
  • Der Punktestand S.score Zustand
    Er zählt, aber er wird noch nirgends angezeigt.
    Ohne: Es gäbe nichts, was Erfolg messbar macht.
AchtungZählt es jetzt wirklich? Du siehst nichts davon, das Licht springt nur. Genau diese Lücke schliesst der nächste Schritt.
5
Schritt 5 von 8

Rückmeldung

Rückmeldung sagt dem Spieler: «Das hast du gerade geschafft.» Ein Ton, ein Blitz und ein Zähler machen aus der unsichtbaren Regel ein spürbares Erlebnis.

Das Spiel erkennt, dass sich der Punktestand geändert hat, und reagiert darauf.

VorherDas Licht springt, sonst nichts.
JetztTon, Blitz und ein Zähler zeigen jeden Treffer.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.lastScore = 0;
S.flash = 0;
update · Regeln
if (S.score !== S.lastScore) {
  S.lastScore = S.score;
  S.flash = 1;
  beep(660);
}
S.flash = Math.max(0, S.flash - 0.06);
draw · zeichnen
if (S.flash > 0) {
  ctx.globalAlpha = S.flash * 0.35;
  rect(0, 0, W, H, '#ffffff');
  ctx.globalAlpha = 1;
}
text('Licht: ' + S.score, 8, 16, '#ffffff', 13);

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Ton beep(freq)
    Spielt einen kurzen Ton. Browser erlauben Ton erst nach der ersten Berührung, deshalb tippe einmal auf die Vorschau.
    Ohne: Das Spiel bleibt stumm.
  • Das Abklingen S.flash update
    Der Blitz startet bei 1 und wird mit jedem Bild kleiner, bis er weg ist.
    Ohne: Der Bildschirm bliebe weiss.
Probier esSammle ein paar Lichter. Mach den Ton aus (🔊) und achte darauf, wie viel von der Rückmeldung bleibt.
6
Schritt 6 von 8

Eine Herausforderung

Jetzt gibt es Druck: 20 Sekunden Zeit. Das Spiel kann enden, das Ergebnis ist eine Zahl. Erst jetzt will man es besser machen.

Nach dem Ende friert das Spiel ein (stop), nur immer läuft weiter, damit ein Tippen neu startet.

VorherEs läuft ewig.
JetztNach 20 Sekunden ist Schluss, Tippen startet neu.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.time = 20;
immer · läuft auch im Stopp
if (S.time <= 0 && input.tap) restart();
update · Regeln
S.time -= dt;
draw · zeichnen
text('Zeit: ' + Math.ceil(Math.max(S.time, 0)), W - 8, 16, '#ffffff', 13, 'right');
if (S.time <= 0) {
  rect(0, 60, W, 56, 'rgba(0,0,0,0.6)');
  text('Zeit um! ' + S.score + ' Licht', W / 2, 94, '#ffe36b', 20, 'center');
  text('Tippen für Neustart', W / 2, 110, '#ffffff', 11, 'center');
}
stop · solange das wahr ist, steht das Spiel still
S.time <= 0

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Stopp stop Spielschleife
    Solange der Ausdruck wahr ist, überspringt die Schleife input, physics und update. immer und draw laufen weiter.
    Ohne: Die Figur liefe nach «Zeit um» weiter, Punkte kämen dazu.
  • Die Zeitdauer dt Hilfswert
    Ein Bild dauert 1/60 Sekunde. S.time -= dt zieht deshalb genau eine Sekunde pro Sekunde ab.
    Ohne: Die Zeit hinge von der Geschwindigkeit des Handys ab.
Probier esSpiele eine Runde. Wie viele Lichter schaffst du? Versuch dann, deinen eigenen Rekord zu schlagen.
7
Schritt 7 von 8

Eine Entscheidung

Bisher gab es nur einen Weg. Eine Entscheidung entsteht, wenn zwei Dinge etwas kosten: Das orange Licht gibt 3 Punkte, steht aber meist weiter weg und verschwindet nach 4 Sekunden.

Lohnt sich der Weg? Das entscheidest du.

VorherImmer dasselbe Licht, kein Nachdenken.
JetztNah und sicher oder weit und riskant.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.big = { x: 280, life: 4 };
update · Regeln
S.big.life -= dt;
if (S.big.life <= 0) {
  S.big.x = rnd(30, 290);
  S.big.life = 4;
}
if (Math.abs(S.p.x - S.big.x) < 18) {
  S.score += 3;
  S.big.x = rnd(30, 290);
  S.big.life = 4;
}
draw · zeichnen
circle(S.big.x, GROUND - 20, 12, '#ff9d3b');
text('3', S.big.x, GROUND - 16, '#5a2d00', 12, 'center');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Preis Zeit und Weg
    Eine Entscheidung ist nur eine, wenn jede Wahl etwas kostet: hier Zeit und Risiko. Das Spiel muss dafür nichts Besonderes tun, es genügt, die Zahlen richtig zu setzen (3 Punkte, 4 Sekunden).
    Ohne: Es gäbe immer eine beste Antwort, und das Spiel wäre schnell langweilig.
Probier esSpiele zweimal: einmal nur die kleinen Lichter, einmal nur die orangen. Welche Strategie bringt mehr?
8
Schritt 8 von 8

Das nimmst du mit

Ein Spiel besteht aus kleinen Teilen, die sich gegenseitig brauchen:

  • Ziel gibt der Aktion einen Sinn.
  • Regel verbindet Aktion und Ziel.
  • Rückmeldung macht die Regel spürbar.
  • Herausforderung (hier Zeit) gibt dem Ergebnis Gewicht.
  • Entscheidung macht aus Reagieren ein Denken.

In unseren Spielen findest du dasselbe: bei Ship Ahoi!!! ist das Ziel, alle Schiffe zu finden, die Regel «Treffer bringt einen zweiten Schuss» und die Rückmeldung «Blubb!» oder «BOING».

VorherDu hast ein Spiel aus vier Zutaten gebaut.
JetztWeiter im nächsten Kapitel: was die Aktion genau ist.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Alles zusammen
    Die vier Zutaten sind im Code nur wenige Zeilen. Der grosse Teil des Spielens passiert zwischen diesen Zeilen: Das Gehirn des Spielers ist der «unsichtbare» Teil jedes Spiels.
02

Spielmechanik

Aktion, Folge, Rückmeldung: was ist ein Kernloop? Wir bauen den «Sternensammler».

Teileliste: was du in diesem Kapitel brauchst
  • Mechanik: eine Handlung, die das Spiel versteht (springen, einsammeln)
  • Kernloop: die kleine Schleife, die man immer wieder spielt
  • Eingabe, Physik, Regel: die drei Hooks input, physics, update
  • Steuerung: Pfeiltasten und Leertaste oder die Knöpfe
1
Schritt 1 von 7

Die Figur

Eine Mechanik ist eine Handlung, die das Spiel versteht und beantwortet. Wir bauen einen Sternensammler aus fünf Mechaniken: bewegen, fallen, springen, landen, einsammeln.

Zuerst die Figur. Ihre Position y sind die Füsse, das macht die Landung später einfacher.

VorherNichts.
JetztBoden und Figur, noch regungslos.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.p = { x: 40, y: GROUND, vy: 0, onGround: true };
draw · zeichnen
rect(0, GROUND, W, H - GROUND, '#2a3a55');   // Boden
circle(S.p.x, S.p.y - 8, 8, '#ffd24a');   // Figur (y = Füsse)

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Spielschleife loop() in gd101.js
    Läuft 60 Mal pro Sekunde und ruft der Reihe nach immer, input, physics, update und zuletzt draw auf. Das ist das Herz jedes Spiels.
    Ohne: Es gäbe nur ein einziges Standbild.
  • Die Hooks setup, immer, input, physics, update, draw
    Ein Hook ist ein Platz, an dem dein Code eingehängt wird. Die Schleife ruft sie in immer gleicher Reihenfolge auf. So bleibt jedes Stück Code klein.
    Ohne: Alles stünde in einem einzigen Block durcheinander.
2
Schritt 2 von 7

Bewegen

Die erste Mechanik: Eingabe wird Bewegung. input liest, S.p.x ändert sich.

VorherDie Figur steht still.
JetztSie läuft nach links und rechts.

Neu im Code nur diese Zeilen kommen dazu

input · Eingaben lesen
S.p.x += input.dir * P.SPEED;
S.p.x = clamp(S.p.x, 8, W - 8);
Regler (Werte, die du verstellen kannst)
P.SPEED = 2.2;   // Tempo, Bereich 0.5 bis 5

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Eingabe input.dir gd101.js
    Wandelt Tasten und Touch-Knöpfe in -1, 0 oder 1 um.
    Ohne: Deine Figur wüsste nicht, was der Spieler will.
Probier esÄndere das Tempo. Ab wann wird die Figur schwer zu steuern?
3
Schritt 3 von 7

Schwerkraft

Jetzt fällt die Figur. Die Geschwindigkeit vy wächst mit jedem Bild um die Schwerkraft, die Position folgt der Geschwindigkeit. Am Boden bleibt sie stehen.

Die Figur startet in der Luft, damit du den Fall siehst. Neustart zeigt ihn nochmal.

VorherDie Figur schwebt am Boden.
JetztSie fällt und landet.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.p.y = 70;
S.p.onGround = false;
physics · Bewegung
S.p.vy += P.GRAV;
S.p.y += S.p.vy;
S.p.onGround = false;
if (S.p.y >= GROUND) {
  S.p.y = GROUND;
  S.p.vy = 0;
  S.p.onGround = true;
}
Regler (Werte, die du verstellen kannst)
P.GRAV = 0.25;   // Schwerkraft, Bereich 0.05 bis 0.8

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Geschwindigkeit vy S.p.vy
    Ein Zwischenwert: Nicht die Position ändert sich direkt, sondern die Geschwindigkeit, und diese die Position. So entsteht der weiche Fall.
    Ohne: Die Figur würde mit gleichbleibendem Tempo sinken, wie an einem Faden.
  • Die Bodenprüfung physics
    Sobald die Füsse den Boden berühren, wird y auf den Boden gesetzt, die Geschwindigkeit auf 0 und onGround auf wahr.
    Ohne: Die Figur fiele unten aus dem Bild.
Probier esStelle die Schwerkraft auf 0.8 und dann auf 0.05, jeweils mit Neustart. Wie ändert sich der Eindruck vom Gewicht?
4
Schritt 4 von 7

Springen

Eine Mechanik, die Schwerkraft braucht: der Sprung. Er gibt der Figur einen Schub nach oben, aber nur, wenn sie am Boden steht. Sonst könnte man in der Luft endlos weiterspringen.

VorherDie Figur kann nur laufen.
JetztSie springt, solange sie am Boden ist.

Neu im Code nur diese Zeilen kommen dazu

input · Eingaben lesen
if (input.jump && S.p.onGround) {
  S.p.vy = -P.JUMP;
  beep(440);
}
Regler (Werte, die du verstellen kannst)
P.JUMP = 6;   // Sprungkraft, Bereich 3 bis 9

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Merker onGround S.p.onGround
    Ein Ja/Nein-Wert, den die Physik jedes Bild neu setzt. Der Sprung fragt ihn ab.
    Ohne: Die Figur könnte in der Luft immer wieder springen und davonfliegen.
  • Die Reihenfolge Spielschleife
    Erst input (will springen?), dann physics (fällt, landet). Würde die Physik zuerst laufen, würde der Sprung ein Bild zu spät reagieren.
Probier esHalte die Sprungtaste. Springt die Figur nur einmal pro Landung?
AchtungEin häufiger Fehler: Der Sprung wird nicht begrenzt. Dann «fliegt» die Figur, wenn man die Taste hämmert.
5
Schritt 5 von 7

Landen auf Plattformen

Eine Plattform ist ein zweiter Boden, aber nur von oben begehbar. Die Figur landet, wenn sie im letzten Bild über der Plattform war und jetzt darauf oder darunter ist, und sie nach unten fällt.

VorherEs gibt nur den Boden.
JetztEine Plattform, auf der man landen kann.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.plat = { x: 130, y: 108, w: 70 };
physics · Bewegung
if (S.p.vy >= 0 && S.p.x > S.plat.x - 4 && S.p.x < S.plat.x + S.plat.w + 4) {
  const vorher = S.p.y - S.p.vy;   // wo waren die Füsse im letzten Bild?
  if (vorher <= S.plat.y && S.p.y >= S.plat.y) {
    S.p.y = S.plat.y;
    S.p.vy = 0;
    S.p.onGround = true;
  }
}
draw · zeichnen
rect(S.plat.x, S.plat.y, S.plat.w, 6, '#6fa8ff');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Das «letzte Bild» vorher physics
    Die Figur bewegt sich pro Bild mehrere Punkte. Ohne den Blick auf die vorherige Position könnte sie die dünne Plattform «durchspringen».
    Ohne: Die Figur fiele durch die Plattform hindurch (typischer Fehler, genannt «Tunneling»).
  • Nur beim Fallen S.p.vy >= 0
    Von unten springt man durch die Plattform. Erst beim Fallen wird sie fest.
    Ohne: Man stiesse sich den Kopf an der Plattform an.
Probier esSpringe auf die Plattform. Springe von unten dagegen: Du gehst durch, landest aber oben.
6
Schritt 6 von 7

Einsammeln: der Kernloop

Jetzt schliesst sich der Kreis: springen, sammeln, Punkt, weiter. Das ist der Kernloop, die kleine Schleife, die man immer wieder spielt. Sie muss schon allein Spass machen.

Ein Ring zeigt die Folge: Der Stern erscheint nach dem Einsammeln an einem neuen Ort, entweder auf der Plattform oder am Boden.

VorherMan kann springen und landen, aber nichts bewirken.
JetztSterne einsammeln: Aktion, Folge, Rückmeldung.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.star = { x: 165, y: 92 };
S.score = 0;
S.ring = null;
update · Regeln
if (Math.abs(S.p.x - S.star.x) < 12 && Math.abs((S.p.y - 8) - S.star.y) < 14) {
  S.score++;
  beep(660);
  S.ring = { x: S.star.x, y: S.star.y, r: 4 };
  S.star.x = rnd(30, 290);
  S.star.y = (S.star.x > S.plat.x && S.star.x < S.plat.x + S.plat.w) ? 92 : 136;
}
if (S.ring) { S.ring.r += 1.2; if (S.ring.r > 26) S.ring = null; }
draw · zeichnen
circle(S.star.x, S.star.y, 6, '#ffe36b');
if (S.ring) { ctx.strokeStyle = '#ffffff'; ctx.lineWidth = 2; ctx.beginPath(); ctx.arc(S.ring.x, S.ring.y, S.ring.r, 0, 6.2832); ctx.stroke(); }
text('Sterne: ' + S.score, 8, 16, '#ffffff', 13);

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Kernloop-Frage
    Wenn schon dieser kleine Kreis (sehen, springen, treffen, belohnt werden) Spass macht, trägt das Spiel. Wenn nicht, hilft kein Level-Design.
  • Zwei Prüfungen für die Berührung update
    Der Stern zählt nur, wenn Figur und Stern in x und in y nah beieinander sind. Sonst könnte man Sterne oben auf der Plattform vom Boden aus «aufsammeln».
    Ohne: Die Sterne wären nutzlos hoch gehängt.
Probier esJage die Sterne ein paar Minuten lang. Wann ist es zu leicht? Wann zu schwer? Darüber sprechen wir in Kapitel 4.
7
Schritt 7 von 7

Das nimmst du mit

Fünf Mechaniken, ein Kernloop. Das Muster ist immer dasselbe: Aktion → Folge → Rückmeldung.

  • Aktion: Pfeil oder Sprung
  • Folge: Figur bewegt sich, fällt, landet, sammelt
  • Rückmeldung: Ton, Ring, Zähler

Im Lab siehst du dasselbe bei Eis löscht Feuer: Der Ritter läuft, springt, und jede Berührung bringt eine Folge.

VorherDu hast fünf Mechaniken.
JetztAls Nächstes: Wie entscheidet das Spiel? Logik und Regeln.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Weniger ist mehr
    Jede zusätzliche Mechanik muss mit den anderen zusammenspielen. Prüfe immer: Was passiert, wenn der Spieler sie mit einer anderen kombiniert?
03

Logik und Regeln

Wenn dies, dann das: Wie entscheidet das Spiel, was passiert? Wir erweitern den Sternensammler mit Gefahren.

Teileliste: was du in diesem Kapitel brauchst
  • Bedingung: eine Frage, die wahr oder falsch ist
  • Zustand: in welcher Phase das Spiel gerade ist (Menü, Spiel, Ende)
  • Zufall und Können: was das Glück macht und was der Spieler
  • Kollision: wenn sich zwei Dinge berühren
  • Basis: der fertige Sternensammler aus Kapitel 2 (Code unter «Ganzer Code bis hier»)
1
Schritt 1 von 7

Wenn, dann: der Sumpf

Eine Regel hat die Form «wenn Bedingung, dann Folge». Ein Beispiel: Im Sumpf (rechts am Boden) wird die Figur langsamer.

Der Ausdruck S.hit ist wahr oder falsch. Das Spiel fragt in jedem Bild neu.

VorherDer Boden ist überall gleich.
JetztRechts bremst ein Sumpf.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.zone = { x: 230, w: 60 };
update · Regeln
S.hit = S.p.x > S.zone.x && S.p.x < S.zone.x + S.zone.w && S.p.y >= GROUND - 1;
if (S.hit) S.p.x -= input.dir * P.SPEED * 0.6;
draw · zeichnen
rect(S.zone.x, GROUND - 4, S.zone.w, 4, S.hit ? '#e0b030' : '#6a5a2a');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Bedingung S.hit update
    Ein «und»-Ausdruck (&&): Alle Teile müssen stimmen: rechts von der linken Kante, links von der rechten, am Boden.
    Ohne: Der Sumpf würde auch wirken, wenn du darüber hinwegspringst.
  • Die Reihenfolge der Regeln update
    Der Sumpf zieht nach der Bewegung etwas zurück. Die Reihenfolge von Code ist Teil der Regel.
Probier esLaufe in den Sumpf und springe darüber. Was bleibt von der Regel übrig?
2
Schritt 2 von 7

Zustände: Menü, Spiel

Ein Spiel hat Phasen. Das Spiel merkt sich in S.state, in welcher es ist. Im Menü steht alles still, nach einem Tippen beginnt das Spiel.

VorherDas Spiel läuft sofort los.
JetztEin Startbild, danach das Spiel.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.state = 'menu';
immer · läuft auch im Stopp
if (S.state === 'menu' && (input.tap || input.jump)) S.state = 'play';
draw · zeichnen
if (S.state === 'menu') {
  rect(0, 50, W, 70, 'rgba(0,0,0,0.65)');
  text('Sternensammler', W / 2, 82, '#ffe36b', 20, 'center');
  text('Tippen zum Start', W / 2, 104, '#ffffff', 12, 'center');
}
stop · solange das wahr ist, steht das Spiel still
S.state !== 'play'

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Zustandsvariable S.state Zustand
    Ein Wort, das die Phase bestimmt: menu, play, später over. Alle anderen Regeln fragen nur diese Variable.
    Ohne: Du bräuchtest für jede Phase ein eigenes Durcheinander von Ja/Nein-Werten.
  • Der Stopp stop Spielschleife
    Solange nicht play ist, laufen Eingabe, Physik und Regeln nicht.
Probier esStarte neu und tippe aufs Bild. Läuft die Figur schon im Menü herum?
3
Schritt 3 von 7

Zufall gegen Können

Rote Gegner erscheinen zufällig am rechten Rand und rollen nach links. Zufall bestimmt, wann sie kommen, Können bestimmt, ob du ihnen ausweichst (springen).

Ein gutes Spiel mischt beides: nur Zufall frustriert, nur Können wird berechenbar.

VorherNichts bedroht dich.
JetztRote Gegner kommen zufällig und rollen heran.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.gegner = [];
update · Regeln
if (Math.random() < P.SPAWN * dt) S.gegner.push({ x: W + 10 });
for (const g of S.gegner) g.x -= P.GTEMPO;
S.gegner = S.gegner.filter(g => g.x > -10);
draw · zeichnen
for (const g of S.gegner) rect(g.x - 6, GROUND - 12, 12, 12, '#ff5b5b');
Regler (Werte, die du verstellen kannst)
P.SPAWN = 0.6;   // Gegner pro Sekunde, Bereich 0 bis 2
P.GTEMPO = 1.6;   // Tempo der Gegner, Bereich 0.5 bis 5

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Zufall Math.random()
    Liefert eine Zahl zwischen 0 und 1. «Kleiner als P.SPAWN * dt» ist bei 0.6 pro Sekunde in etwa einmal pro 1.7 Sekunden wahr, aber nie genau vorhersehbar.
    Ohne: Die Gegner kämen im Takt, und jeder könnte das Muster auswendig.
  • Die Aufräum-Zeile filter update
    Wirft Gegner weg, die links hinausgelaufen sind.
    Ohne: Die Liste würde endlos wachsen, und das Spiel würde langsam.
Probier esStelle «Gegner pro Sekunde» auf 2 und auf 0.1. Wie verändert sich das Spiel?
4
Schritt 4 von 7

Kollision: Treffer

Jetzt treffen die Gegner. Eine Kollision ist eine einfache Frage: Sind die beiden nah genug beieinander? Wir messen den Abstand in x und prüfen, ob die Figur am Boden ist (also nicht gesprungen).

Ein Treffer kostet ein Leben.

VorherGegner laufen durch dich hindurch.
JetztEin Treffer kostet ein Leben, ein Sprung rettet dich.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.leben = 3;
update · Regeln
for (const g of S.gegner) {
  if (Math.abs(g.x - S.p.x) < P.HIT && S.p.y > GROUND - 12) {
    g.x = -99;   // der Gegner verschwindet
    S.leben--;
    beep(160);
  }
}
draw · zeichnen
text('Leben: ' + S.leben, W - 8, 16, '#ff8f8f', 13, 'right');
Regler (Werte, die du verstellen kannst)
P.HIT = 11;   // Trefferbereich, Bereich 4 bis 20

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Trefferbereich P.HIT update
    Er bestimmt, wie nah ein Gegner kommen muss. Gross ist streng, klein ist nachsichtig. Das Spielgefühl hängt an dieser einen Zahl.
    Ohne: Du würdest geprüft, ohne dass jemand die Grenze festgelegt hätte.
  • Die Höhenprüfung S.p.y > GROUND - 12 update
    Springst du über den Gegner, liegen deine Füsse höher. Der Sprung wird zur Verteidigung.
    Ohne: Springen würde nichts nützen.
Probier esStelle den Trefferbereich auf 20 und auf 4. Wie fühlt es sich an, getroffen zu werden, obwohl man «vorbei» war?
AchtungDie Leben stehen bei 0 oder darunter, aber noch passiert nichts. Das Ende fehlt noch.
5
Schritt 5 von 7

Zustand: das Ende

Wenn die Leben aufgebraucht sind, wechselt das Spiel in den Zustand «Ende»: Alles friert ein, eine Meldung erscheint, ein Tippen startet neu.

Wir erweitern einfach stop: Es hält jetzt auch bei 0 Leben an.

VorherMit 0 Leben läuft das Spiel einfach weiter.
JetztMit 0 Leben ist Schluss, Tippen startet neu.

Neu im Code nur diese Zeilen kommen dazu

immer · läuft auch im Stopp
if (S.leben <= 0 && input.tap) restart();
draw · zeichnen
if (S.leben <= 0) {
  rect(0, 56, W, 64, 'rgba(0,0,0,0.65)');
  text('Geschafft: ' + S.score + ' Sterne', W / 2, 88, '#ffe36b', 18, 'center');
  text('Tippen für Neustart', W / 2, 108, '#ffffff', 11, 'center');
}
stop · solange das wahr ist, steht das Spiel still
S.leben <= 0

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Mehrere Stopp-Bedingungen stop
    Alle stop-Ausdrücke werden mit «oder» verknüpft: Menü oder keine Leben. Jede neue Bedingung kommt einfach dazu.
    Ohne: Du müsstest überall im Code prüfen, ob das Spiel gerade läuft.
Probier esLass dich absichtlich treffen, bis das Ende kommt. Tippe zum Neustart.
6
Schritt 6 von 7

Treffer sichtbar machen

Regeln, die man nicht merkt, fühlen sich zufällig an. Wenn man ein Leben verliert, soll das Bild kurz rot aufblitzen. Wie bei der Rückmeldung in Kapitel 1 erkennt das Spiel die Änderung von S.leben.

VorherEin Leben weg, aber nichts zu sehen.
JetztJeder Treffer blitzt rot auf.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.letzteLeben = 3;
S.blink = 0;
update · Regeln
if (S.leben !== S.letzteLeben) {
  S.letzteLeben = S.leben;
  S.blink = 1;
}
S.blink = Math.max(0, S.blink - 0.05);
draw · zeichnen
if (S.blink > 0) {
  ctx.globalAlpha = S.blink * 0.4;
  rect(0, 0, W, H, '#ff0000');
  ctx.globalAlpha = 1;
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Auf Änderung reagieren update
    Statt in jeder Regel eine Rückmeldung einzubauen, beobachtet ein kleiner Wächter den Wert und löst beim Wechsel die Rückmeldung aus. So bleibt die Regel sauber.
    Ohne: Du müsstest bei jeder Regel, die ein Leben nimmt, den Blitz einzeln auslösen.
Probier esLass dich treffen. Fällt es dir leichter, deine Fehler zu verstehen?
7
Schritt 7 von 7

Das nimmst du mit

Regeln sind meist Wenn-dann-Sätze, die das Spiel 60 Mal pro Sekunde prüft. Dazu kommen:

  • Zustände für die Phasen (menu, play, Ende)
  • Zufall für Überraschung, Können für Verdienst
  • Kollision als Abstandsfrage
  • Rückmeldung für jede Regel, die der Spieler spüren soll

In Ship Ahoi!!! 2 gilt etwa: «Wenn die Crew ihr letztes Schiff verliert, fährt sie bei einer anderen mit.» Das ist eine Regel im Wenn-dann-Format.

VorherDu hast Regeln, Zustände und Zufall.
JetztAls Nächstes: Was davon macht Spass?

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Regeln sind Versprechen
    Was das Spiel einmal vorgibt, muss es immer einhalten. Wenn «Springen rettet dich» gilt, darf es nicht manchmal nicht gelten.
04

Was macht Spass?

Wann fühlt sich ein Spiel gut an: nicht langweilig, nicht frustrierend? Wir drehen an den Reglern.

Teileliste: was du in diesem Kapitel brauchst
  • Herausforderung gegen Können: der Kern von «Flow» (gängiger Fachbegriff: ein Zustand, in dem man in einer Aufgabe aufgeht)
  • Fairness: Fehler soll man als eigene Fehler erleben
  • Belohnung und «Juice» (Fachwort für kleine Effekte, die Treffer gut anfühlen lassen)
  • Basis: der Sternensammler mit Gefahren aus Kapitel 3
1
Schritt 1 von 7

Zu leicht: Langeweile

Wenn kaum Gefahr kommt und alles gelingt, wird es langweilig. Hier gibt es fast keine Gegner. Fühlt sich das nach Spass an?

Meinung statt Beweis: Fast alle Spielregeln über «Spass» sind Erfahrungswerte, keine Gesetze. Probier selbst.

VorherMittlere Schwierigkeit.
JetztFast keine Gegner: Alles geht zu leicht.

Neu im Code nur diese Zeilen kommen dazu

Regler (Werte, die du verstellen kannst)
P.SPAWN = 0.12;   // Gegner pro Sekunde, Bereich 0 bis 2
P.GTEMPO = 1.2;   // Tempo der Gegner, Bereich 0.5 bis 5

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Regler P.SPAWN update (Kapitel 3)
    Eine einzige Zahl bestimmt, wie oft Gegner kommen. Schwierigkeit ist oft nichts anderes als eine Handvoll Zahlen.
Probier esSpiele ein bis zwei Minuten. Wann denkst du zum ersten Mal «ich kann auch aufhören»?
2
Schritt 2 von 7

Zu schwer: Frust

Jetzt das Gegenteil: viele, schnelle Gegner. Wer ständig verliert, ohne zu verstehen warum, gibt auf.

VorherFast nichts passiert.
JetztViele, schnelle Gegner.

Neu im Code nur diese Zeilen kommen dazu

Regler (Werte, die du verstellen kannst)
P.SPAWN = 1.8;   // Gegner pro Sekunde, Bereich 0 bis 2
P.GTEMPO = 4.2;   // Tempo der Gegner, Bereich 0.5 bis 5

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Das Tempo P.GTEMPO
    Schnelle Gegner brauchen kurze Reaktionszeit. Unter etwa einer Viertelsekunde ist Ausweichen Glückssache, und Glück ist kein Können.
Probier esWie lange hältst du durch? Ab wann entscheidest du «Das ist unfair»?
3
Schritt 3 von 7

Die Kurve: leicht, dann schwerer

Gute Spiele beginnen leicht und werden schwerer, so wie der Spieler besser wird. Das hält zwischen Langeweile und Frust. Hier steigt alle 8 Sekunden die Stufe: mehr und schnellere Gegner.

VorherDie Schwierigkeit bleibt gleich.
JetztAlle 8 Sekunden eine Stufe mehr.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.zeit = 0;
S.level = 1;
update · Regeln
S.zeit += dt;
S.level = 1 + Math.floor(S.zeit / 8);
if (Math.random() < S.level * 0.1 * dt) S.gegner.push({ x: W + 10 });
for (const g of S.gegner) g.x -= S.level * 0.2;
draw · zeichnen
text('Stufe ' + S.level, W / 2, 16, '#9fb4d8', 12, 'center');
Regler (Werte, die du verstellen kannst)
P.SPAWN = 0.3;   // Gegner pro Sekunde, Bereich 0 bis 2
P.GTEMPO = 1.3;   // Tempo der Gegner, Bereich 0.5 bis 5

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Stufe S.level update
    Eine Zahl, die mit der Zeit wächst und andere Werte (Anzahl, Tempo) steigert. Der Spieler merkt es nicht als Sprung, sondern als langsames Anziehen.
    Ohne: Das Spiel würde schlagartig leicht oder schwer.
Probier esÜberlebe die ersten drei Stufen. An welcher Stelle fühlst du zum ersten Mal Druck, und ist es noch angenehm?
4
Schritt 4 von 7

Fairness: der Trefferbereich

Spieler ertragen Niederlagen, wenn sie sie selbst verschuldet glauben. Sie ertragen es nicht, wenn sie «eigentlich vorbei» waren. Darum ist der Trefferbereich meist etwas kleiner als das Bild der Figur.

Der weisse Rahmen zeigt deinen wirklichen Trefferbereich.

VorherDer Trefferbereich ist unsichtbar.
JetztDu siehst ihn, und er ist etwas kleiner als die Figur.

Neu im Code nur diese Zeilen kommen dazu

draw · zeichnen
ctx.strokeStyle = 'rgba(255,255,255,0.6)';
ctx.lineWidth = 1;
ctx.strokeRect(S.p.x - P.HIT, S.p.y - 16, P.HIT * 2, 16);
Regler (Werte, die du verstellen kannst)
P.HIT = 7;   // Trefferbereich, Bereich 3 bis 18

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die versteckte Grenze P.HIT
    Spieler sehen nur das Bild, aber das Spiel rechnet mit dem Rahmen. Wenn der Rahmen grösser ist als das Bild, fühlt es sich unfair an.
    Ohne: Du würdest «zu Unrecht» getroffen und wüsstest nicht warum.
Probier esSetze den Trefferbereich auf 18 und lass dich treffen, obwohl du «vorbei» warst. Dann auf 3. Wo liegt die gute Stelle für dich?
5
Schritt 5 von 7

Belohnung und «Juice»

Dieselbe Regel fühlt sich grossartig oder lahm an, je nachdem, wie das Spiel sie feiert. Kleine Effekte («Juice») wie Funken machen aus einem Punkt ein Erlebnis.

Sammle einen Stern: Funken sprühen.

VorherEin Stern verschwindet und der Zähler steigt.
JetztFunken sprühen, der Treffer fühlt sich an.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.teile = [];
S.letztePunkte = 0;
update · Regeln
if (S.score !== S.letztePunkte) {
  S.letztePunkte = S.score;
  for (let i = 0; i < 12; i++) S.teile.push({ x: S.p.x, y: S.p.y - 8, vx: rnd(-2, 2), vy: rnd(-3, -0.5), l: 1 });
}
for (const q of S.teile) { q.x += q.vx; q.y += q.vy; q.vy += 0.1; q.l -= 0.03; }
S.teile = S.teile.filter(q => q.l > 0);
draw · zeichnen
for (const q of S.teile) {
  ctx.globalAlpha = q.l;
  circle(q.x, q.y, 2.5, '#ffe36b');
}
ctx.globalAlpha = 1;

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Teilchenliste S.teile update
    Jeder Funke ist ein kleines Objekt mit Ort, Tempo und Lebensdauer. Das Spiel bewegt sie und wirft die abgelaufenen weg.
    Ohne: Ein Funken-Effekt wäre nur ein einziges Standbild.
  • Die gleiche Regel, anderes Gefühl
    Der Punkt zählt wie vorher. Nur die Rückmeldung ist grösser. Spielgefühl entsteht oft aus Rückmeldung, nicht aus neuen Regeln.
Probier esSpiele mit und ohne Ton (🔊). Was trägt mehr zur Belohnung bei: Ton oder Funken?
AchtungZu viel «Juice» ermüdet oder verdeckt wichtige Gefahren. Weniger, aber gezielt.
6
Schritt 6 von 7

Dein Regler-Set

Jetzt gehört dir die ganze Werkstatt: Tempo, Gegner, Schwerkraft, Trefferbereich. Stelle das Spiel so ein, dass es dir Spass macht.

Es gibt dabei keine richtige Einstellung. Aber es gibt Fragen, die du dir stellen kannst: Weiss ich immer, warum ich verloren habe? Will ich nochmal?

VorherVorgegebene Werte.
JetztAlle Regler in deiner Hand.

Neu im Code nur diese Zeilen kommen dazu

Regler (Werte, die du verstellen kannst)
P.SPEED = 2.2;   // Tempo der Figur, Bereich 0.5 bis 5
P.GRAV = 0.25;   // Schwerkraft, Bereich 0.05 bis 0.8
P.JUMP = 6;   // Sprungkraft, Bereich 3 bis 9
P.SPAWN = 0.5;   // Gegner pro Sekunde, Bereich 0 bis 2
P.GTEMPO = 1.5;   // Tempo der Gegner, Bereich 0.5 bis 5
P.HIT = 8;   // Trefferbereich, Bereich 3 bis 18

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Zahlen statt Gefühl
    Hinter jedem «fühlt sich gut an» stehen ein paar Zahlen. Gute Designer ändern sie in kleinen Schritten und spielen nach jeder Änderung.
Probier esÄndere immer nur einen Regler, spiele eine Runde, ändere den nächsten. So merkst du, was wirkt.
7
Schritt 7 von 7

Das nimmst du mit

Spass ist keine einzelne Zutat, sondern ein Gleichgewicht:

  • Nicht zu leicht (Langeweile), nicht zu schwer (Frust): Die Schwierigkeit wächst mit dem Können.
  • Fairness: Fehler sollen eigene Fehler sein.
  • Rückmeldung und «Juice» feiern jeden Erfolg.
  • Spielgefühl entsteht aus wenigen Zahlen, die man in kleinen Schritten einstellt und selbst ausprobiert.

Das ist Erfahrungswissen von Spieleentwicklern, kein Naturgesetz. Dein eigenes Spielen und das von Kindern ist die beste Messung.

VorherDu kannst Spielgefühl einstellen.
JetztAls Nächstes: Spiele, in denen Denken zählt.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Testen ersetzt Raten
    Niemand kann Spielspass am Schreibtisch sicher vorhersagen. Darum gibt es in Kapitel 8 den Testplan.
05

Denken und Strategie

Wie bringt man Spieler zum Nachdenken? Wir bauen eine kleine Expedition ohne Reflexe, nur mit Entscheidungen.

Teileliste: was du in diesem Kapitel brauchst
  • Karten: Wahlmöglichkeiten, die man vergleichen kann
  • Ressourcen: Dinge, die knapp sind (Gold, Proviant, Runden)
  • Risiko und Erwartungswert: was im Durchschnitt herauskommt
  • Information: Wissen, das etwas kostet
  • Steuerung: Tasten 1 bis 3 oder die Zahlenknöpfe
1
Schritt 1 von 7

Drei Karten

Hier gibt es keine Figur und kein Tempo. Das Spiel zeigt drei Karten, du wählst eine. Alle Spannung entsteht aus dem Nachdenken, nicht aus der Reaktion.

Die Karten stehen als Liste im Zustand, nicht fest im Zeichencode. So kannst du später leicht Karten ändern.

VorherNichts.
JetztDrei Karten, die du anwählst (noch ohne Wirkung).

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.karten = [
  { n: '1 Weitergehen', t: 'Gold suchen' },
  { n: '2 Rasten', t: 'Proviant holen' },
  { n: '3 Spähen', t: 'Vorschau' }
];
S.sel = 0;
S.msg = '';
input · Eingaben lesen
if (input.pick >= 1 && input.pick <= 3) {
  S.sel = input.pick;
  beep(400 + input.pick * 100);
}
draw · zeichnen
S.karten.forEach(function (k, i) {
  const x = 12 + i * 102;
  rect(x, 64, 94, 76, S.sel === i + 1 ? '#3b6bb0' : '#223049');
  text(k.n, x + 47, 94, '#ffffff', 12, 'center');
  text(k.t, x + 47, 116, '#9fb4d8', 10, 'center');
});
text('Wähle 1, 2 oder 3', W / 2, 40, '#ffe36b', 13, 'center');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Spielschleife loop() in gd101.js
    Läuft 60 Mal pro Sekunde und ruft immer, input, physics, update und draw nacheinander auf.
    Ohne: Es gäbe nur ein Standbild.
  • Die Wahl input.pick gd101.js
    Die Tasten 1 bis 3 und die Knöpfe unter der Vorschau setzen diese Zahl für ein Bild. Dein Code fragt nur: «Wurde etwas gewählt?»
    Ohne: Jede Eingabeart bräuchte eigenen Code.
  • Die Kartenliste S.karten Zustand
    Eine Liste von Objekten. forEach zeichnet für jedes Objekt eine Karte. Eine vierte Karte einzufügen wäre eine Zeile.
    Ohne: Du müsstest jede Karte einzeln hinschreiben.
Probier esWähle verschiedene Karten. Es passiert noch nichts, aber das Spiel merkt sich deine Wahl.
2
Schritt 2 von 7

Wahl hat Folgen

Jetzt hat jede Karte eine Folge: Weitergehen bringt 2 Gold und kostet 1 Proviant. Rasten gibt 2 Proviant. Jede Wahl ist ein Zug, danach kommt die nächste Runde.

Die Folgen stehen als Funktionen in S.aktionen. Die Eingabe ruft einfach die passende auf.

VorherWahl ohne Wirkung.
JetztGold, Proviant und Runde ändern sich mit jeder Wahl.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.gold = 0;
S.prov = 7;
S.runde = 1;
S.aktionen = {
  1: function () { S.gold += 2; S.prov -= 1; S.msg = 'Weitergegangen: +2 Gold, -1 Proviant'; },
  2: function () { S.prov += 2; S.msg = 'Gerastet: +2 Proviant'; },
  3: function () { S.msg = 'Gespäht: noch ohne Wirkung'; }
};
input · Eingaben lesen
if (S.aktionen[input.pick]) {
  S.aktionen[input.pick]();
  S.runde++;
}
draw · zeichnen
text('Gold ' + S.gold + '   Proviant ' + S.prov + '   Runde ' + S.runde, 8, 16, '#ffffff', 12);
text(S.msg, W / 2, 172, '#ffe36b', 11, 'center');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Tabelle S.aktionen Zustand
    Ordnet jeder Nummer eine Funktion zu. Die Eingabe muss nicht wissen, was «Rasten» ist, sie ruft nur S.aktionen[2]() auf.
    Ohne: Der Code wäre eine lange Kette aus «wenn Karte 1 … wenn Karte 2 …».
  • Spätere Schritte
    In den nächsten Schritten ersetzen wir einzelne Funktionen in der Tabelle. Der Rest bleibt unverändert.
Probier esSpiele ein paar Züge. Gibt es eine beste Karte? (Ja: Weitergehen ist immer besser. Das ändern wir.)
AchtungWenn eine Karte immer die beste ist, gibt es keine Entscheidung. Das ist die Lektion aus Kapitel 1.
3
Schritt 3 von 7

Ziel und knappe Mittel

Jetzt braucht es ein Ziel und eine Grenze: 12 Gold in höchstens 8 Runden, und der Proviant darf nicht ausgehen. Aus «Weitergehen» wird eine echte Abwägung, weil alles knapp ist.

VorherDas Spiel läuft endlos.
Jetzt12 Gold in 8 Runden, sonst ist Schluss.

Neu im Code nur diese Zeilen kommen dazu

immer · läuft auch im Stopp
if ((S.prov <= 0 || S.runde > 8 || S.gold >= 12) && (input.tap || input.pick)) restart();
draw · zeichnen
rect(0, 56, W, 64, 'rgba(0,0,0,0.65)');
if (S.gold >= 12) {
  text('Geschafft! ' + S.gold + ' Gold', W / 2, 94, '#9bff9b', 18, 'center');
} else if (S.prov <= 0 || S.runde > 8) {
  text('Ziel verfehlt: ' + S.gold + ' Gold', W / 2, 94, '#ff9d9d', 18, 'center');
}
stop · solange das wahr ist, steht das Spiel still
S.prov <= 0 || S.runde > 8 || S.gold >= 12

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Grenzen stop
    Drei Bedingungen beenden das Spiel. Knappheit (Runden, Proviant) ist das, was aus Wahlmöglichkeiten wirkliche Entscheidungen macht.
    Ohne: Du könntest jede Karte beliebig oft spielen, ohne Folgen.
Probier esGewinne die Runde nur mit «Weitergehen». Geht es? Und wenn du einmal rastest?
4
Schritt 4 von 7

Risiko und Durchschnitt

Jetzt wird «Weitergehen» unsicher: Mit einer Chance findest du viel Gold, sonst verlierst du Proviant. Der Durchschnitt (Erwartungswert) bleibt etwa gleich, aber das Ergebnis schwankt stark.

Mit den Reglern findest du heraus, wann sich das Wagnis lohnt.

VorherWeitergehen ist sicher: immer 2 Gold.
JetztWeitergehen ist ein Wurf: Fund oder Verlust.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.aktionen[1] = function () {
  if (Math.random() < P.CHANCE) { S.gold += P.GEWINN; S.msg = 'Fund! +' + P.GEWINN + ' Gold'; }
  else { S.prov -= P.VERLUST; S.msg = 'Nichts gefunden, -' + P.VERLUST + ' Proviant'; }
  S.prov -= 1;
};
draw · zeichnen
text('Ø Gold pro Weitergehen: ' + (P.CHANCE * P.GEWINN).toFixed(1), 8, 32, '#9fb4d8', 10);
Regler (Werte, die du verstellen kannst)
P.CHANCE = 0.5;   // Chance auf Fund, Bereich 0 bis 1
P.GEWINN = 4;   // Gold bei Fund, Bereich 1 bis 8
P.VERLUST = 1;   // Proviantverlust ohne Fund, Bereich 0 bis 4

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Erwartungswert Chance × Gewinn
    Was du im Durchschnitt pro Zug bekommst. Bei 50 % und 4 Gold sind es 2.0, so viel wie vorher. Aber manchmal 4, manchmal 0: das ist Risiko.
    Ohne: Du könntest nicht beurteilen, ob eine Karte «im Schnitt» gut ist.
  • Ersetzte Funktion S.aktionen[1]
    Die alte Funktion wird einfach überschrieben. Der Rest des Spiels merkt nichts davon.
Probier esSetze die Chance auf 0.2 und den Gewinn auf 8, dann auf 0.9 und 2. Welche Variante fühlt sich nach Glück an, welche nach Planung?
5
Schritt 5 von 7

Information hat einen Preis

Jetzt bekommt die dritte Karte einen Sinn: Spähen kostet 1 Proviant und verrät, ob der nächste Zug ein Fund wird. Wissen gegen Ressource: eine der schönsten Entscheidungen im Spieldesign.

Dafür wird der Wurf vorab gemacht und im Zustand gespeichert.

VorherWeitergehen ist ein Blindflug.
JetztSpähen zeigt, ob sich der nächste Zug lohnt.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.naechste = Math.random() < P.CHANCE;
S.weiss = false;
S.aktionen[1] = function () {
  if (S.naechste) { S.gold += P.GEWINN; S.msg = 'Fund! +' + P.GEWINN + ' Gold'; }
  else { S.prov -= P.VERLUST; S.msg = 'Nichts gefunden, -' + P.VERLUST + ' Proviant'; }
  S.prov -= 1;
  S.naechste = Math.random() < P.CHANCE;
  S.weiss = false;
};
S.aktionen[3] = function () {
  S.prov -= 1;
  S.weiss = true;
  S.msg = 'Späher: der nächste Zug ' + (S.naechste ? 'lohnt sich' : 'ist leer');
};
draw · zeichnen
if (S.weiss) text(S.naechste ? '★ Fund sicher' : '✖ leer', W / 2, 56, S.naechste ? '#9bff9b' : '#ff9d9d', 14, 'center');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Vorab-Wurf S.naechste Zustand
    Das Spiel würfelt, bevor du ziehst, und merkt sich das Ergebnis. Spähen zeigt es nur an. Ohne diesen Trick könnte der Späher nicht die Wahrheit sagen.
    Ohne: Der Späher wäre eine Lüge oder müsste raten.
Probier esWann lohnt sich der Späher? Rechne: Er kostet 1 Proviant. Ab welcher Chance sparst du dadurch mehr, als du zahlst?
6
Schritt 6 von 7

Vorausdenken

Gute Strategie heisst: nicht nur den nächsten Zug sehen, sondern den Weg zum Ziel. Das Spiel kann helfen, indem es das Ziel in eine Zahl übersetzt: Wie viel Gold musst du ab jetzt pro Runde schaffen?

VorherDu musst im Kopf rechnen.
JetztDas Spiel zeigt dir das nötige Tempo.

Neu im Code nur diese Zeilen kommen dazu

draw · zeichnen
if (S.gold < 12 && S.runde <= 8) {
  text('Nötig: ' + ((12 - S.gold) / Math.max(1, 9 - S.runde)).toFixed(1) + ' Gold pro Runde', W / 2, 52 + (S.weiss ? 18 : 0), '#9fb4d8', 11, 'center');
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Rechnung draw
    Verbleibendes Gold geteilt durch verbleibende Runden. Eine Hilfe fürs Planen, die nichts am Regelwerk ändert.
    Ohne: Der Spieler müsste jede Runde selbst nachrechnen oder raten.
  • Hilfe oder Bevormundung?
    Zeigt man zu viel, nimmt man das Denken ab. Zeigt man nichts, frustriert es. Das richtige Mass findest du nur im Test.
Probier esBeginne mit dem Zahlenhinweis und spiele zweimal: einmal mit, einmal ohne darauf zu achten. Spielst du anders?
7
Schritt 7 von 7

Das nimmst du mit

Denkspiele entstehen aus:

  • Wahl mit Folgen, die sich unterscheiden (keine Karte ist immer die beste)
  • Knappheit: Ressourcen, Runden, Zeit
  • Risiko: gleicher Durchschnitt, anderes Gefühl
  • Information gegen Ressource
  • Ein Ziel, das Vorausplanen belohnt

Im Lab findest du dasselbe bei Map und Mythen und im Hafen von Ship Ahoi!!!: wo setze ich meine nächste Aktion?

VorherDu hast ein Denkspiel gebaut.
JetztAls Nächstes: Lernen im Spiel.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Spielplan im Kopf
    Das Wichtigste in einem Denkspiel passiert im Kopf des Spielers. Dein Code liefert nur die Zahlen, an denen er sich abarbeitet.
06

Lernen und Produktivität

Wie baut man ein Spiel, in dem man nebenbei etwas lernt, ohne dass es nach Schule riecht? Wir bauen die «Zahlenbrücke».

Teileliste: was du in diesem Kapitel brauchst
  • Aufgabe: eine Frage mit einer klaren Antwort
  • Rückmeldung: warum falsch oder richtig
  • Passende Schwierigkeit: nicht zu leicht, nicht zu schwer
  • Wiederholung: Fehler kommen wieder
  • Produktivität: kommt am Ende etwas heraus?
  • Steuerung: Tasten 1 bis 3 oder die Zahlenknöpfe
1
Schritt 1 von 8

Eine Aufgabe, drei Antworten

Die Grundform jedes Lernspiels: eine Frage, mehrere Antworten, eine ist richtig. Hier eine Rechenaufgabe mit drei Karten.

VorherNichts.
JetztAufgabe mit drei Antworten, richtig gibt eine neue.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.baue = function (a, b) {
  S.a = a;
  S.b = b;
  const r = a + b;
  S.opt = [r, r + 1, r - 1].sort(function () { return Math.random() - 0.5; });
  S.richtig = S.opt.indexOf(r) + 1;
  S.fehler = 0;
};
S.neu = function () { S.baue(Math.floor(rnd(2, 9)), Math.floor(rnd(2, 9))); };
S.pruefe = function (n) {
  if (n === S.richtig) { beep(660); S.neu(); } else { beep(180); }
};
S.neu();
input · Eingaben lesen
if (input.pick) S.pruefe(input.pick);
draw · zeichnen
text(S.a + ' + ' + S.b + ' = ?', W / 2, 52, '#ffffff', 26, 'center');
S.opt.forEach(function (o, i) {
  rect(14 + i * 102, 84, 92, 50, '#223049');
  text((i + 1) + ': ' + o, 60 + i * 102, 116, '#ffffff', 16, 'center');
});

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Wahl input.pick gd101.js
    Die Tasten 1 bis 3 und die Knöpfe unter der Vorschau setzen diese Zahl für ein Bild. Dein Code fragt nur: «Wurde etwas gewählt?»
    Ohne: Jede Eingabeart bräuchte eigenen Code.
  • Die falschen Antworten S.baue
    Sie liegen knapp neben der richtigen (r±1). Wären sie weit weg, könnte man ohne Rechnen raten.
    Ohne: Die Aufgabe prüft nichts.
  • Die Funktion S.pruefe Zustand
    Eine Funktion, die wir in späteren Schritten ersetzen. Die Eingabe ruft sie nur auf.
Probier esLöse fünf Aufgaben. Merkst du, dass du wegen der falschen Antworten genauer rechnest?
2
Schritt 2 von 8

Rückmeldung mit Erklärung

«Falsch» sagt wenig. Besser: zeigen, was richtig gewesen wäre. Das Spiel schreibt die Lösung hin. Fehler werden so zur Lernchance.

VorherEin Ton sagt «falsch», sonst nichts.
JetztDas Spiel zeigt die Lösung und zählt mit.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.msg = 'Wähle 1, 2 oder 3';
S.ok = 0;
S.nok = 0;
S.pruefe = function (n) {
  if (n === S.richtig) {
    S.ok++; S.msg = 'Richtig!'; beep(660); S.neu();
  } else {
    S.nok++; S.msg = 'Nicht ganz. ' + S.a + ' + ' + S.b + ' = ' + (S.a + S.b); beep(180);
  }
};
draw · zeichnen
text(S.msg, W / 2, 172, '#ffe36b', 11, 'center');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Zählen im Hintergrund S.ok, S.nok
    Richtig und falsch werden mitgezählt. Wir brauchen die Zahlen später für den Lernstand.
    Ohne: Das Spiel könnte nie sagen, ob du besser wirst.
Probier esWähle absichtlich falsch. Was macht der Text mit dir: ärgert er oder hilft er?
3
Schritt 3 von 8

Hilfe zur rechten Zeit

Wer zweimal an derselben Aufgabe scheitert, braucht einen Anstoss. Das Spiel zählt die Fehler dieser Aufgabe und färbt nach dem zweiten die richtige Karte gelb.

VorherMan kann endlos raten.
JetztNach zwei Fehlern zeigt eine gelbe Karte den Weg.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.pruefe = function (n) {
  if (n === S.richtig) { S.ok++; S.msg = 'Richtig!'; beep(660); S.neu(); }
  else { S.nok++; S.fehler++; S.msg = S.fehler >= 2 ? 'Tipp: die gelbe Karte' : 'Nicht ganz, versuch es nochmal'; beep(180); }
};
draw · zeichnen
if (S.fehler >= 2) {
  rect(14 + (S.richtig - 1) * 102, 84, 92, 50, 'rgba(255,227,107,0.4)');
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Fehlerzähler S.fehler S.baue
    Er wird bei jeder neuen Aufgabe auf 0 gesetzt und bei jedem Fehler erhöht. Der Tipp erscheint erst bei 2, damit man es erst selbst probiert.
    Ohne: Der Tipp käme sofort, und man würde nie nachdenken.
Probier esWähle zweimal falsch. Erscheint die gelbe Karte? Und bei der nächsten Aufgabe nicht mehr?
4
Schritt 4 von 8

Fortschritt sichtbar machen

Lernen ist unsichtbar. Ein Spiel macht den Fortschritt sichtbar: Jede richtige Antwort legt eine Brückenplatte. Bei acht Platten ist die Brücke fertig. Fehler kosten nichts, sie bremsen nur.

VorherMan weiss nicht, wie weit man ist.
JetztAcht Platten bilden eine Brücke, Ziel erreicht.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.platten = 0;
S.pruefe = function (n) {
  if (n === S.richtig) { S.ok++; S.platten++; S.msg = 'Richtig!'; beep(660); S.neu(); }
  else { S.nok++; S.fehler++; S.msg = S.fehler >= 2 ? 'Tipp: die gelbe Karte' : 'Nicht ganz, versuch es nochmal'; beep(180); }
};
immer · läuft auch im Stopp
if (S.platten >= 8 && (input.tap || input.pick)) restart();
draw · zeichnen
for (let i = 0; i < 8; i++) rect(24 + i * 34, 146, 30, 8, i < S.platten ? '#c9a062' : '#33415c');
text('Brücke: ' + S.platten + ' / 8', 8, 16, '#ffffff', 12);
if (S.platten >= 8) {
  rect(0, 56, W, 64, 'rgba(0,0,0,0.65)');
  text('Brücke fertig!', W / 2, 94, '#9bff9b', 20, 'center');
}
stop · solange das wahr ist, steht das Spiel still
S.platten >= 8

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Fehler bestrafen oder nicht?
    Hier verliert man bei einem Fehler nichts. Das ist eine Designentscheidung: Wer Angst vor Fehlern hat, lernt schlechter.
  • Die Brückenplatten S.platten
    Eine einzige Zahl. Das Bild macht daraus ein Gefühl von Fortschritt.
    Ohne: Der Zähler wäre nur eine Zahl am Rand.
Probier esBaue die Brücke fertig. Wie fühlt sich die letzte Platte an im Vergleich zur ersten?
5
Schritt 5 von 8

Passende Schwierigkeit

Wer immer dasselbe löst, lernt nichts mehr. Wer nur scheitert, gibt auf. Das Spiel passt die Zahlen an: Nach drei richtigen Antworten in Folge steigt die Stufe, nach zwei Fehlern bei einer Aufgabe sinkt sie.

VorherImmer dieselbe Zahlengrösse.
JetztDie Zahlen wachsen mit deinem Können.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.stufe = 1;
S.serie = 0;
S.neu = function () {
  const m = 3 + S.stufe * 4;
  S.baue(Math.floor(rnd(2, m)), Math.floor(rnd(2, m)));
};
S.neu();
S.pruefe = function (n) {
  if (n === S.richtig) {
    S.ok++; S.platten++; S.serie++; S.msg = 'Richtig!'; beep(660);
    if (S.serie >= 3 && S.stufe < 4) { S.stufe++; S.serie = 0; S.msg = 'Stufe hoch!'; }
    S.neu();
  } else {
    S.nok++; S.fehler++; S.serie = 0;
    if (S.fehler === 2 && S.stufe > 1) S.stufe--;
    S.msg = S.fehler >= 2 ? 'Tipp: die gelbe Karte' : 'Nicht ganz, versuch es nochmal'; beep(180);
  }
};
draw · zeichnen
text('Stufe ' + S.stufe, W - 8, 16, '#9fb4d8', 12, 'right');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Serie S.serie Zustand
    Zählt richtige Antworten in Folge. Ein Fehler setzt sie auf 0. So reagiert das Spiel auf das, was du gerade kannst, nicht auf Raten.
    Ohne: Das Spiel würde nach Glückstreffern zu schwer.
  • Die Zahlengrösse m S.neu
    Die Obergrenze der Zahlen wächst mit der Stufe. Eine einzige Formel steuert die Schwierigkeit.
Probier esBeantworte drei Aufgaben richtig hintereinander. Siehst du die Zahlen grösser werden?
6
Schritt 6 von 8

Wiederholung

Wer einen Fehler macht, soll dieselbe Aufgabe später nochmal sehen. Das Gehirn lernt am besten, wenn Schwieriges wiederkommt. Das Spiel merkt sich die verpassten Aufgaben und mischt sie unter die neuen.

VorherEine verpasste Aufgabe ist weg.
JetztVerpasste Aufgaben kommen wieder.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.wieder = [];
S.neu = function () {
  if (S.wieder.length && Math.random() < 0.4) {
    const t = S.wieder.shift();
    S.baue(t.a, t.b);
  } else {
    const m = 3 + S.stufe * 4;
    S.baue(Math.floor(rnd(2, m)), Math.floor(rnd(2, m)));
  }
};
S.pruefeBasis = S.pruefe;
S.pruefe = function (n) {
  if (n !== S.richtig && S.fehler === 0) S.wieder.push({ a: S.a, b: S.b });
  S.pruefeBasis(n);
};
draw · zeichnen
text('Zum Wiederholen: ' + S.wieder.length, 8, 32, '#ff9d8a', 10);

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Merkliste S.wieder Zustand
    Beim ersten Fehler einer Aufgabe wird sie vorgemerkt. S.neu nimmt mit 40 % Wahrscheinlichkeit eine von dort.
    Ohne: Das Spiel vergisst jeden Fehler sofort.
  • Funktion einwickeln S.pruefeBasis
    Die alte Funktion bleibt erhalten und wird von der neuen aufgerufen. So erweitert man, ohne den alten Code umzuschreiben.
Probier esMache einen Fehler. Kommt die Aufgabe nach einigen anderen wieder?
7
Schritt 7 von 8

Lernstand zeigen

Am Ende zählt, ob etwas hängen geblieben ist. Zeige Spielern, wie gut sie sind, und zwar ehrlich: Richtige und falsche Antworten. Das ist die Messung, die jedes Lernspiel braucht.

VorherDu spürst vage, ob es gut läuft.
JetztEine Zahl zeigt die Treffer.

Neu im Code nur diese Zeilen kommen dazu

draw · zeichnen
text('Richtig ' + S.ok + ' · Fehler ' + S.nok + (S.ok + S.nok > 0 ? ' · ' + Math.round(100 * S.ok / (S.ok + S.nok)) + ' %' : ''), W / 2, 172 - 0, '#9fb4d8', 10, 'center');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Quote draw
    Richtige geteilt durch alle Antworten, als Prozent. Wenn die Quote steigt, wirkt das Lernen. Wenn nicht, ist das Spiel nur Zeitvertreib.
    Ohne: Du hättest keinen Beweis, dass etwas gelernt wird.
Probier esSpiele zwei Runden und vergleiche die Quote. Wird sie besser?
8
Schritt 8 von 8

Das nimmst du mit

Wann wird ein Lernspiel gut, und wann wird es Arbeit mit Verpackung?

  • Spiel: Ich will weiter, weil es sich gut anfühlt, besser zu werden.
  • Arbeit: Ich mache weiter, weil ich muss oder weil Belohnungen locken, die nichts mit der Sache zu tun haben.

Hilfreich sind: sofortige Rückmeldung, passende Schwierigkeit, Wiederholung, sichtbarer Fortschritt und keine Angst vor Fehlern.

Produktiv ist ein Spiel, wenn am Ende etwas herauskommt: ein Können, eine Brücke, ein Ergebnis. Prüfe es mit der Quote.

VorherDu hast ein Lernspiel gebaut.
JetztAls Nächstes: Spielen mit anderen.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Allgemeines Wissen, kein Beweis
    Das sind gängige Erfahrungswerte aus Spiel- und Lernforschung. Ob dein Spiel wirkt, zeigt nur ein Test mit echten Lernenden.
07

Zusammen spielen

Was ändert sich, wenn jemand mitspielt? Wir setzen eine «Möwe» als Mitspielerin zum Licht-Spiel.

Teileliste: was du in diesem Kapitel brauchst
  • Mitspieler: eine zweite Figur mit eigenen Zielen
  • Wettbewerb gegen Zusammenspiel: dieselbe Welt, anderes Gefühl
  • Gummiband: Hilfe für den, der hinten liegt
  • Signale: sich ohne Worte verständigen
  • Basis: «Fang das Licht» aus Kapitel 1 bis Schritt 5
1
Schritt 1 von 6

Eine zweite Figur

Wir nehmen das Spiel aus Kapitel 1 und setzen eine Möwe dazu. Zuerst steht sie nur da. Eine zweite Figur verändert ein Spiel noch nicht, erst das, was sie tut.

VorherDu bist allein.
JetztEine Möwe steht rechts.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.bot = { x: 280, score: 0 };
draw · zeichnen
rect(S.bot.x - 8, GROUND - 14, 16, 14, '#ff9d8a');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Spielschleife loop() in gd101.js
    Läuft 60 Mal pro Sekunde und ruft immer, input, physics, update und draw nacheinander auf.
    Ohne: Es gäbe nur ein Standbild.
  • Der Mitspieler S.bot Zustand
    Ein Objekt wie die Figur, nur ohne Eingabe. Im Mehrspielerspiel steht an dieser Stelle ein anderer Mensch, dessen Zug über ein Gerät kommt.
    Ohne: Es gäbe keinen zweiten Akteur.
2
Schritt 2 von 6

Die Möwe sammelt mit

Jetzt handelt die Möwe: Sie fliegt zum Licht und sammelt es, wenn sie schneller ist als du. Sofort entsteht Spannung, denn jedes Licht kann ihr gehören.

VorherDie Möwe steht still.
JetztDie Möwe jagt das Licht mit.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.botZiel = function () { return S.star.x; };
update · Regeln
const d = S.botZiel() - S.bot.x;
S.bot.x += sign(d) * Math.min(P.BTEMPO * (S.bremse || 1), Math.abs(d));
if (Math.abs(S.bot.x - S.star.x) < 14) {
  S.bot.score++;
  S.star.x = rnd(30, 290);
}
draw · zeichnen
text('Möwe: ' + S.bot.score, W - 8, 16, '#ff9d8a', 13, 'right');
Regler (Werte, die du verstellen kannst)
P.BTEMPO = 1.8;   // Tempo der Möwe, Bereich 0.5 bis 4

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Das Ziel der Möwe S.botZiel() Zustand
    Eine Funktion, die sagt, wohin die Möwe will. Später ersetzen wir sie.
    Ohne: Du müsstest die Bewegung der Möwe umschreiben, wenn sich ihr Ziel ändert.
  • Das Vorzeichen sign Hilfsfunktion
    Liefert -1, 0 oder 1. So fliegt die Möwe in Richtung des Ziels, ohne darüber hinaus zu schiessen (Math.min).
Probier esStelle das Tempo der Möwe auf 0.5 und auf 4. Wann macht das Spiel Spass, wann nicht?
3
Schritt 3 von 6

Gegeneinander oder zusammen?

Das ist die wichtigste Entscheidung eines Mehrspielerspiels: Gegeneinander oder zusammen? Dieselbe Welt, dieselben Lichter, aber ein ganz anderes Gefühl. Wähle unten eine Variante und probiere beide.

VorherZwei Figuren jagen dasselbe Licht.
JetztDu wählst, ob es ein Wettlauf oder ein Teamspiel ist.

Neu im Code nur diese Zeilen kommen dazu

immer · läuft auch im Stopp
if (Math.max(S.score, S.bot.score) >= 10 && (input.tap || input.jump)) restart();
draw · zeichnen
if (S.score > S.bot.score) text('♛ du führst', W / 2, 16, '#ffe36b', 11, 'center');
if (S.score < S.bot.score) text('♛ Möwe führt', W / 2, 16, '#ff9d8a', 11, 'center');
if (Math.max(S.score, S.bot.score) >= 10) {
  rect(0, 56, W, 64, 'rgba(0,0,0,0.65)');
  text(S.score > S.bot.score ? 'Du gewinnst!' : 'Die Möwe gewinnt', W / 2, 94, S.score > S.bot.score ? '#9bff9b' : '#ff9d9d', 20, 'center');
}
stop · solange das wahr ist, steht das Spiel still
Math.max(S.score, S.bot.score) >= 10

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Dieselbe Regel, anderes Ziel stop und draw
    Die Bewegung und die Lichter sind gleich geblieben. Nur die Frage «Wann ist Schluss, und wer hat gewonnen?» ist anders. Ziele prägen das Gefühl stärker als die Mechanik.
    Ohne: Es wäre egal, ob die Möwe mitspielt.
Probier esSpiele beide Varianten. Wann fühlst du dich unter Druck, wann freust du dich über den Mitspieler?
AchtungBeim Wettbewerb kann der Rückstand frustrieren. Der nächste Schritt hilft dagegen.
4
Schritt 4 von 6

Das Gummiband

Wer weit hinten liegt, verliert die Lust. Ein Gummiband hilft: Liegt die Möwe mehr als ein paar Lichter vorn, bremst sie. Liegt sie zurück, gibt sie Gas. Das Spiel bleibt bis zum Schluss offen.

VorherWer vorn liegt, gewinnt meist.
JetztDas Spiel hält das Feld eng zusammen.

Neu im Code nur diese Zeilen kommen dazu

physics · Bewegung
const d = S.bot.score - S.score;
S.bremse = d > P.BAND ? 0.4 : (d < -P.BAND ? 1.5 : 1);
draw · zeichnen
if (S.bremse !== 1) text(S.bremse < 1 ? 'Möwe bremst' : 'Möwe gibt Gas', W - 8, 30, '#ff9d8a', 10, 'right');
Regler (Werte, die du verstellen kannst)
P.BAND = 3;   // Abstand fürs Gummiband, Bereich 1 bis 8

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Faktor S.bremse physics → update
    Wird vor der Bewegung der Möwe berechnet (physics läuft vor update) und beim Fliegen mit dem Tempo malgenommen.
    Ohne: Die Möwe wüsste nicht, dass sie zu weit vorn ist.
  • Faire Hilfe
    Spieler dürfen das Gummiband nicht merken oder sollten wenigstens nicht verärgert sein. Der Hinweis im Bild macht es offen. Offenheit ist eine Designentscheidung.
Probier esStelle den Abstand auf 1 und auf 8. Bei welchem Wert bleibt es spannend, ohne dass es sich geschenkt anfühlt?
5
Schritt 5 von 6

Signale ohne Worte

Wer zusammenspielt, muss sich verständigen. Oft nicht mit Text, sondern mit kleinen Zeichen. Hier: Tippe ins Bild, und die Möwe fliegt dorthin. Im Zusammenspiel wird das zu einem Teamwerkzeug.

VorherDie Möwe tut, was sie will.
JetztMit einem Tipp rufst du die Möwe herbei.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.ping = null;
S.botZiel = function () { return S.ping ? S.ping.x : S.star.x; };
update · Regeln
if (input.tap) S.ping = { x: input.tap.x, t: 1.5 };
if (S.ping) {
  S.ping.t -= dt;
  if (S.ping.t <= 0) S.ping = null;
}
draw · zeichnen
if (S.ping) {
  circle(S.ping.x, GROUND - 20, 6, 'rgba(255,157,138,0.6)');
  text('hierher!', S.ping.x, GROUND - 30, '#ffd0c4', 10, 'center');
}

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die ersetzte Funktion S.botZiel Zustand
    Das ist die Stelle aus Schritt 2: Die Möwe fragt nach ihrem Ziel und bekommt jetzt manchmal einen anderen Ort. Die Bewegung selbst blieb unverändert.
    Ohne: Du müsstest die Bewegung neu schreiben.
  • Die Ablaufzeit S.ping.t
    Das Zeichen gilt nur 1.5 Sekunden. Sonst bliebe die Möwe ewig dort stehen.
Probier esWähle «Zusammen» und tippe, damit die Möwe zum Licht fliegt, das du nicht erreichst. Wann hilft das, wann stört es?
6
Schritt 6 von 6

Das nimmst du mit

Mehrspieler heisst: andere Menschen entscheiden. Das verändert alles:

  • Ziele bestimmen das Gefühl: Wettbewerb oder Team.
  • Fairness hilft (Gummiband), kann aber auch nerven.
  • Verständigung braucht einfache Zeichen.

In Ship Ahoi!!! 2 sollen zwei Handys ohne Netz über Hotspot und QR-Codes zusammenspielen. Das ist noch nicht auf zwei Geräten getestet; der Test steht aus.

VorherDu hast ein Spiel mit Mitspieler.
JetztAls Nächstes: wie aus einem Einfall ein Prototyp wird.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Möwe ist ein Platzhalter
    Ein Computer-Mitspieler zeigt dir, wie sich ein zweiter Akteur anfühlt. Menschen sind unberechenbarer. Teste darum immer mit echten Menschen.
08

Vom Einfall zum Prototyp

Wie wird aus einer Idee ein Spiel, das du anderen zeigen kannst? Du füllst dein eigenes Ideenblatt aus.

Teileliste: was du in diesem Kapitel brauchst
  • Einfall: ein Satz genügt
  • Prototyp: die kleinste Version, die man spielen kann
  • Kernloop: der Teil, der Spass machen muss
  • Test: anderen zuschauen, ohne zu erklären
  • Die Eingaben bleiben in deinem Browser (localStorage), nichts wird gesendet
1
Schritt 1 von 7

Der Einfall in einem Satz

Jedes Spiel beginnt mit einem Satz. Wenn du ihn nicht in einem Satz sagen kannst, ist die Idee noch zu gross. Schreibe deinen Einfall ins Feld.

VorherEin Gedanke im Kopf.
JetztEin Satz auf dem Blatt.

So sieht es aus Beispiel, nicht deine Antwort

Idee: Ein kleiner Vogel muss Sterne aus dem Wald holen, bevor die Nacht kommt.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Das Ideenblatt localStorage im Browser
    Was du tippst, wird auf diesem Gerät gespeichert, damit es nach dem Schliessen noch da ist. Es verlässt dein Gerät nicht.
    Ohne: Beim Neuladen wäre alles weg.
Probier esSchreibe einen Satz zu einem Spiel, das du gerne bauen würdest. Das Beispiel rechts ist nur eines.
2
Schritt 2 von 7

Das Ziel

Was will der Spieler erreichen? Ein klares Ziel in einer Zeile. Fehlt es, fehlt der Grund zum Weiterspielen (Kapitel 1).

VorherEine Idee ohne Richtung.
JetztEin Ziel, das man messen kann.

So sieht es aus Beispiel, nicht deine Antwort

Ziel: Zehn Sterne sammeln, bevor die Sonne untergeht.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Messbar
    Ein gutes Ziel kann man zählen oder sehen: Sterne, Zeit, Ziel erreicht. «Spass haben» ist kein Ziel.
Probier esKannst du am Ende sagen, ob jemand das Ziel geschafft hat? Wenn nicht, schärfe es.
3
Schritt 3 von 7

Die Regeln

Zwei bis drei Regeln genügen. Mehr ist für einen ersten Prototyp zu viel (Kapitel 3: Wenn dies, dann das).

VorherEin Ziel, aber noch kein Weg.
JetztWenige klare Regeln.

So sieht es aus Beispiel, nicht deine Antwort

Regeln: Pfeile bewegen, Sprung auf Äste. Dornen werfen mich zurück zum Start.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Weniger ist mehr
    Jede Regel muss gebaut, getestet und erklärt werden. Starte mit so wenig wie möglich.
Probier esStreiche eine Regel. Funktioniert die Idee immer noch?
AchtungViele Ideen scheitern, weil sie mit zehn Regeln beginnen, die nie zusammen getestet wurden.
4
Schritt 4 von 7

Die Rückmeldung

Wie merkt der Spieler, dass er etwas richtig oder falsch gemacht hat? Ton, Licht, Bewegung, Zahl (Kapitel 1 und 4).

VorherRegeln ohne Gefühl.
JetztDu weisst, wie man sie spürt.

So sieht es aus Beispiel, nicht deine Antwort

Rückmeldung: Ton und Funken bei jedem Stern, der Himmel wird dunkler.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Gefühl aus Rückmeldung
    Dieselbe Regel kann sich lahm oder grossartig anfühlen, je nach Rückmeldung. Plane sie von Anfang an mit.
Probier esWähle für jede Regel eine Rückmeldung, die man sieht und hört.
5
Schritt 5 von 7

Der Kernloop

Was macht man im Spiel immer wieder? Das ist der Teil, der allein Spass machen muss (Kapitel 2). Baue und teste zuerst nur diesen.

VorherEine Liste von Teilen.
JetztEine Schleife, die man bauen kann.

So sieht es aus Beispiel, nicht deine Antwort

Kernloop: Springen, zum Stern fliegen, einsammeln, neues Ziel.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der kleinste Prototyp
    Eine Figur, ein Ziel, ein Hindernis: Mehr braucht ein erster Test nicht. Fehlt hier Spass, hilft mehr Inhalt nicht.
Probier esBeschreibe deine Schleife in vier Wörtern, zum Beispiel: springen, sammeln, Punkt, neues Ziel.
6
Schritt 6 von 7

Der Testplan

Zeige den Prototyp anderen. Erkläre nichts, sage nichts, schau zu. Wo zögern sie, wo lachen sie, wo geben sie auf? Das sind deine besten Hinweise.

VorherEin Plan, den nur du kennst.
JetztEin Test, der dir echte Antworten gibt.

So sieht es aus Beispiel, nicht deine Antwort

Test: Drei Personen je fünf Minuten spielen lassen, nichts erklären, nur zuschauen.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Zuschauen statt fragen
    Menschen sagen oft nicht, was sie wirklich gestört hat. Ihr Verhalten verrät mehr als ihre Antworten.
Probier esPlane drei Personen, je fünf Minuten. Notiere nur, was sie tun, nicht was sie sagen.
7
Schritt 7 von 7

Dein Blatt

Hier ist dein ganzes Ideenblatt. Kopiere es und speichere es dort, wo du deine Ideen sammelst (Notizen, Chat, Mail an dich selbst). Das Blatt bleibt zusätzlich in diesem Browser.

Der nächste Schritt gehört dir: bauen, testen, ändern. Erst nach dem Test weisst du, was wirklich wichtig ist.

VorherSechs Felder.
JetztEin Blatt zum Mitnehmen.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Datenschutz
    Kopieren geht in die Zwischenablage deines Geräts. Es wird nichts hochgeladen.
09

Übung und Glossar

Jetzt baust du selbst: Wähle Ziel, Hindernis und Rückmeldung und siehst sofort das Ergebnis.

Teileliste: was du in diesem Kapitel brauchst
  • Baukasten: wähle pro Schritt eine Variante
  • Beurteilung: eine Checkliste für dein Spiel
  • Glossar: alle Fachwörter zum Nachschlagen
  • Basis: die Figur aus Kapitel 2 (laufen, fallen, springen)
1
Schritt 1 von 6

Wähle ein Ziel

Du hast eine Figur, die läuft und springt (Kapitel 2). Was soll sie erreichen? Wähle unten. Das Ziel gibt allem anderen den Sinn.

VorherEine Figur ohne Aufgabe.
JetztEin Spiel mit Ziel. Wähle und probiere.

Neu im Code nur diese Zeilen kommen dazu

setup · einmal beim Start
S.score = 0;
S.ev = 0;
S.star = { x: 250, y: 136 };
immer · läuft auch im Stopp
if (S.score >= 8 && (input.tap || input.jump)) restart();
update · Regeln
if (Math.abs(S.p.x - S.star.x) < 14 / (P.SCHWER || 1) && Math.abs((S.p.y - 8) - S.star.y) < 16) {
  S.score++;
  S.ev = 1;
  S.star.x = rnd(30, 290);
  S.star.y = Math.random() < 0.5 ? 136 : 100;
}
draw · zeichnen
circle(S.star.x, S.star.y, 6, '#ffe36b');
text('Sterne: ' + S.score + ' / 8', 8, 16, '#ffffff', 12);
if (S.score >= 8) {
  rect(0, 56, W, 64, 'rgba(0,0,0,0.65)');
  text('Geschafft!', W / 2, 94, '#9bff9b', 20, 'center');
}
stop · solange das wahr ist, steht das Spiel still
S.score >= 8

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Spielschleife loop() in gd101.js
    Läuft 60 Mal pro Sekunde und ruft immer, input, physics, update und draw nacheinander auf.
    Ohne: Es gäbe nur ein Standbild.
  • Das Ereignis S.ev Zustand
    Jedes Ziel setzt S.ev = 1, wenn etwas Erfreuliches passiert. Der Schritt «Rückmeldung» reagiert darauf, ohne zu wissen, welches Ziel gewählt wurde.
    Ohne: Du müsstest die Rückmeldung für jedes Ziel einzeln schreiben.
Probier esWechsle zwischen den drei Zielen. Dieselbe Figur, aber drei verschiedene Spiele. Welches fühlt sich am meisten nach Spiel an?
2
Schritt 2 von 6

Wähle ein Hindernis

Eine Zone auf dem Boden macht den Weg interessant. Drei Arten, drei Gefühle: Sumpf bremst, Dornen werfen zurück, ein Trampolin hilft. Alle sind eine Regel «wenn in der Zone, dann …».

VorherDer Weg ist leer.
JetztEine Zone in der Mitte verändert das Spiel.

Neu im Code nur diese Zeilen kommen dazu

update · Regeln
if (S.p.x > 130 && S.p.x < 190 && S.p.y >= GROUND - 1) S.p.x -= input.dir * P.SPEED * 0.6;
draw · zeichnen
rect(130, GROUND - 4, 60, 4, '#7a6a2a');

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Eine Zone ist nur ein Bereich update
    Die Bedingung «x zwischen 130 und 190» gilt für alle drei. Nur die Folge unterscheidet sich. Aus der gleichen Zone werden dadurch ganz verschiedene Spielgefühle.
    Ohne: Du müsstest drei Zonen getrennt bauen.
Probier esTeste jedes Hindernis mit jedem Ziel. Beim Wettlauf mit Dornen: Wie wird der Weg schwer?
AchtungDornen mit dem Ziel «Sterne» können unfair sein, wenn der Stern in der Zone liegt. Prüfe immer die Kombination.
3
Schritt 3 von 6

Wähle die Rückmeldung

Das Ereignis aus Schritt 1 ist da, aber das Spiel schweigt. Wähle, wie es das feiert. Vergleiche besonders «Keine» mit den anderen.

VorherErfolg ohne Reaktion.
JetztTon, Blitz oder Funken markieren jeden Erfolg.

Neu im Code nur diese Zeilen kommen dazu

update · Regeln
if (S.ev) beep(660);
S.ev = 0;

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Nutzen des Ereignisses S.ev
    Alle Varianten lesen dasselbe Flag. Du kannst die Rückmeldung wechseln, ohne am Ziel etwas zu ändern. So bleiben Regeln und Gefühl getrennt.
    Ohne: Jede Änderung der Rückmeldung wäre ein Umbau der Regeln.
Probier esVergleiche «Keine» mit «Funken». Das Ziel ist gleich. Was ändert sich im Gefühl?
4
Schritt 4 von 6

Stelle die Schwierigkeit ein

Ein einziger Regler wirkt auf dein Spiel: Beim Sterne-Spiel wird die Berührzone kleiner, beim Überleben fallen mehr Steine, beim Wettlauf bleibt weniger Zeit. Starte nach dem Verstellen neu (⟲), damit alle Werte gelten.

VorherEine feste Schwierigkeit.
JetztEin Regler dreht das Spiel leichter oder schwerer.

Neu im Code nur diese Zeilen kommen dazu

draw · zeichnen
text('Schwierigkeit ×' + P.SCHWER, W / 2, 172, '#9fb4d8', 10, 'center');
Regler (Werte, die du verstellen kannst)
P.SCHWER = 1;   // Schwierigkeit, Bereich 0.5 bis 1.8

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Der Regler P.SCHWER Ziel-Code aus Schritt 1
    Der Code in Schritt 1 las ihn schon die ganze Zeit mit (P.SCHWER || 1). Fehlte der Regler, galt der Standardwert 1. Daher kann man Regler nachträglich einbauen.
    Ohne: Jede Zahl wäre fest im Code.
Probier esFinde zu jeder Kombination die Einstellung, bei der du etwa jedes zweite Mal gewinnst. Das ist eine gute Schwierigkeit.
5
Schritt 5 von 6

Die Checkliste

Prüfe dein Spiel mit sechs Fragen:

  1. Ziel: Weiss ich in fünf Sekunden, was ich tun soll?
  2. Regeln: Sind sie klar und halten sie, was sie versprechen?
  3. Rückmeldung: Merke ich jeden Erfolg und jeden Fehler?
  4. Entscheidung: Gibt es eine Wahl, bei der keine Antwort immer die beste ist?
  5. Herausforderung: Ist es weder zu leicht noch zu schwer?
  6. Fairness: Verliere ich durch eigene Fehler?

Drei Fragen mit «Ja» genügen für einen ersten Prototyp. Alles andere kommt mit dem Test (Kapitel 8).

VorherDu hast ein Spiel gebaut.
JetztDu kannst es beurteilen.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Keine Wahrheit, ein Werkzeug
    Die Checkliste fasst dieses Tutorial zusammen. Sie ersetzt keinen Test mit echten Spielern.
6
Schritt 6 von 6

Glossar

Alle Fachwörter aus dem Tutorial zum Nachschlagen. Tippe in die Suche, um zu filtern.

VorherViele neue Wörter.
JetztEin Nachschlagewerk.

Unsichtbar, aber verantwortlich das siehst du nicht, ohne geht nichts

  • Die Begriffe
    Das sind gängige Fachwörter der Spielentwicklung. Verschiedene Bücher verwenden sie leicht unterschiedlich.

Neu auf mykeyz.ch, auf echten Handys noch nicht getestet. Der Inhalt ist allgemeines Game-Design-Wissen, Fachbegriffe sind gängige Begriffe. Code: eigener Code, MIT, © Michaelangelo Zünd.