Projekt:2020/EscapeRoom: Unterschied zwischen den Versionen
Jneug (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Kategorie:Projekte:2020/21“) |
Jneug (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| (Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
[[Kategorie:Projekte:2020/21]] | Seite zum Projekt "EscapeRoom" des Informatik LK Q1 im [[:Kategorie:Projekte:2020/21|Schuljahr 2020/21]][[Kategorie:Projekte:2020/21]]. | ||
{{Aufgabe:Start}} | |||
Implementiere über die Herbstferien einen "Raum" im EscapeRoom-Projekt. | |||
{{Aufgabe:End}} | |||
Ihr arbeitet gemeinsam in [https://git.ngb.schule/IF-LK-2020/escaperoom einem Repository] am EscapeRoom-Projekt. Jeder von euch erstellt sich eine eigene Unterklasse der Klasse <code>Room</code> und implementiert dort seine Spiellogik. Gleichzeitig könnt ihr die Räume der anderen einsehen, um Hilfestellungen zu geben oder Inspiration für euren eigenen Raum zu bekommen. Als Beispiel befindet sich der <code>NumberlockRoom</code> im Projekt. | |||
Ihr könnt eure eigene Unterklasse mit dieser Vorlage beginnen: | |||
<syntaxhighlight lang="java" line="1"> | |||
public class MyOwnRoom extends Room { | |||
// Objektvariablen z.B. für Items | |||
public NumberlockRoom() { | |||
super(1); // Anzahl der "Locks" im Raum; Zugriff über locks[0] ... locks[n] | |||
// Initialisierung der "Locks" | |||
// locks[0] = new ...; | |||
// Initialisierung anderer Objektvariablen | |||
} | |||
public void play(Player pPlayer) { | |||
// "Begrüßung" im Raum | |||
EscapeRoom.println("Du betrittst einen " | |||
+ EscapeRoom.randElement(new String[]{ | |||
"dunklen", | |||
"schummrigen", | |||
"verwinkelten" | |||
}) + ", unheimlichen Raum!"); | |||
EscapeRoom.wait(1000); | |||
// Spielschleife | |||
String s; | |||
do { | |||
// Eingabe des Spielers (wird in Kleinbuchstaben umgewandelt) | |||
s = EscapeRoom.askForString("Was möchtest du machen?").toLowerCase(); | |||
// Hier die Spiellogik implementieren (Siehe dazu NumberlockRoom) | |||
// Zum Beispiel: | |||
if( EscapeRoom.containsAny(s, new String[]{"schau", "such", "seh", "forsch"}) ) { | |||
EscapeRoom.println("Du erkundest den Raum, aber findest nichts besonderes."); | |||
EscapeRoom.println("Vor dir ist eine dunkle Tür."); | |||
EscapeRoom.wait(500); | |||
} else if( EscapeRoom.containsAny(s, new String[]{"nach Hause", "fliehen", "weglaufen", "verschwinden", "verlassen"}) ) { | |||
EscapeRoom.println("Du drückst die Klinke herunter. Die Tür öffnet sich!"); | |||
} else { | |||
EscapeRoom.println("Nichts passiert."); | |||
} | |||
EscapeRoom.wait(500); | |||
} while( !isUnlocked() ); // Wiederhole, bis alle Locks offen sind. | |||
EscapeRoom.println("Du hast es geschafft, die Tür öffnet sich mit einem lauten Schleifen!"); | |||
} | |||
} | |||
</syntaxhighlight> | |||
Jeder Raum hat mindestens ein <code>Lock</code>, das geöffnet werden muss. Dafür muss es im Raum ein <code>Item</code> geben, mit dem das Schloss geöffnet werden kann. "Schlösser" und "Gegenstände" sind hier lose verwendet und können auch andere Konzepte sein. (Zum Beispiel kann ein "Schloss" auch ein Rätsel sein und der "Schlüssel"/"Gegenstand" dazu das Lösungswort.) | |||
Du kannst beliebig viele Unterklassen von <code>Lock</code> und <code>Item</code> erstellen. ''Evtl. hast aber auch schon jemand anders eine Klasse erstellt, die du nutzen kannst.'' | |||
Das Spiel wird gestartet in der Klasse <code>EscapeRoom</code> mit der main-Klassenmethode. Um deinen eigenen Raum zu testen kannst du eine eigene statische Methode anlegen, die nur deinen Raum initialisiert: | |||
<syntaxhighlight lang="java"> | |||
public static void testMyOwnRoom() { | |||
EscapeRoom er = new EscapeRoom(new Player("Tester")); | |||
er.addRoom(new MyOwnRoom()); | |||
er.play(); | |||
} | |||
</syntaxhighlight> | |||
Die Klasse enthält außerdem eine Reihe von statischen Hilfsmethoden, die für dei Implementierung genutzt werden können. Die Dokumentation der einzelnen Methoden findest du in der Klasse (wechsele am besten im Editor von {{BlueJ}} oben rechts von "Quelltext" zu "Dokumentation"). | |||
* '''Ausgaben''' | |||
** <code>void print(String text)</code>: Ausgabe ohne Zeilenumbruch | |||
** <code>void println(String text)</code>: Ausgabe mit Zeilenumbruch | |||
* '''Eingaben des Spielers''' | |||
** <code>int askForInt(String question)</code>: Zahl vom Nutzer abfragen | |||
** <code>boolean askForBool(String question)</code>: Wahrheitswert vom Nutzer abfragen | |||
** <code>String askForString(String question)</code>: Text vom Nutzer abfragen | |||
* '''Zufallswerte''' | |||
** <code>int randInt(int max)</code>: Zufallszahl von 0 bis <code>max</code> | |||
** <code>int randInt(int min, int max)</code>: Zufallszahl von <code>min</code> bis <code>max</code> | |||
** <code>boolean randBool()</code>: Zufälliger Wahrheitswert (50% <code>true</code>) | |||
** <code>boolean randBool(int percentTrue)</code>: Zufälliger Wahrheitswert (zu <code>percentTrue</code> Prozent <code>true</code>) | |||
** <code>T randElement(T[] elements)</code>: Wählt einen zufälligen Wert aus dem Array <code>elements</code> aus. Es handelt sich um eine ''generische Methode'', die den Typ zurückgibt, der auch im Array vorhanden ist.<br>Beispiel: <code>String s = EscapeRoom.randElement(new String[]{"A","B","C"});</code>. | |||
* '''Strings überprüfen''' | |||
** <code>boolean inArray(T element, T[] elements)</code>: Prüft, ob <code>element</code> im Array <code>elements</code> vorkommt. Die Typen des Elements und des Arrays sind beliebig, müssen aber zueinander passen (z.B. beides <code>String</code>). | |||
** <code>boolean containsAny(String text, String[] words)</code>: Prüft, ob <code>text</code> mindestens einen der Strings in <code>words</code> enthält. | |||
** <code>boolean containsAll(String text, String[] words)</code>: Prüft, ob <code>text</code> alle der Strings in <code>words</code> enthält. | |||
* '''Flußsteuerung''' | |||
** <code>void wait(int milliseconds)</code>: Pausiert die Ausführung für die angegebene Anzahl Millisekunden. | |||
Aktuelle Version vom 12. April 2021, 23:25 Uhr
Seite zum Projekt "EscapeRoom" des Informatik LK Q1 im Schuljahr 2020/21.
Implementiere über die Herbstferien einen "Raum" im EscapeRoom-Projekt.
Ihr arbeitet gemeinsam in einem Repository am EscapeRoom-Projekt. Jeder von euch erstellt sich eine eigene Unterklasse der Klasse Room und implementiert dort seine Spiellogik. Gleichzeitig könnt ihr die Räume der anderen einsehen, um Hilfestellungen zu geben oder Inspiration für euren eigenen Raum zu bekommen. Als Beispiel befindet sich der NumberlockRoom im Projekt.
Ihr könnt eure eigene Unterklasse mit dieser Vorlage beginnen:
public class MyOwnRoom extends Room {
// Objektvariablen z.B. für Items
public NumberlockRoom() {
super(1); // Anzahl der "Locks" im Raum; Zugriff über locks[0] ... locks[n]
// Initialisierung der "Locks"
// locks[0] = new ...;
// Initialisierung anderer Objektvariablen
}
public void play(Player pPlayer) {
// "Begrüßung" im Raum
EscapeRoom.println("Du betrittst einen "
+ EscapeRoom.randElement(new String[]{
"dunklen",
"schummrigen",
"verwinkelten"
}) + ", unheimlichen Raum!");
EscapeRoom.wait(1000);
// Spielschleife
String s;
do {
// Eingabe des Spielers (wird in Kleinbuchstaben umgewandelt)
s = EscapeRoom.askForString("Was möchtest du machen?").toLowerCase();
// Hier die Spiellogik implementieren (Siehe dazu NumberlockRoom)
// Zum Beispiel:
if( EscapeRoom.containsAny(s, new String[]{"schau", "such", "seh", "forsch"}) ) {
EscapeRoom.println("Du erkundest den Raum, aber findest nichts besonderes.");
EscapeRoom.println("Vor dir ist eine dunkle Tür.");
EscapeRoom.wait(500);
} else if( EscapeRoom.containsAny(s, new String[]{"nach Hause", "fliehen", "weglaufen", "verschwinden", "verlassen"}) ) {
EscapeRoom.println("Du drückst die Klinke herunter. Die Tür öffnet sich!");
} else {
EscapeRoom.println("Nichts passiert.");
}
EscapeRoom.wait(500);
} while( !isUnlocked() ); // Wiederhole, bis alle Locks offen sind.
EscapeRoom.println("Du hast es geschafft, die Tür öffnet sich mit einem lauten Schleifen!");
}
}
Jeder Raum hat mindestens ein Lock, das geöffnet werden muss. Dafür muss es im Raum ein Item geben, mit dem das Schloss geöffnet werden kann. "Schlösser" und "Gegenstände" sind hier lose verwendet und können auch andere Konzepte sein. (Zum Beispiel kann ein "Schloss" auch ein Rätsel sein und der "Schlüssel"/"Gegenstand" dazu das Lösungswort.)
Du kannst beliebig viele Unterklassen von Lock und Item erstellen. Evtl. hast aber auch schon jemand anders eine Klasse erstellt, die du nutzen kannst.
Das Spiel wird gestartet in der Klasse EscapeRoom mit der main-Klassenmethode. Um deinen eigenen Raum zu testen kannst du eine eigene statische Methode anlegen, die nur deinen Raum initialisiert:
public static void testMyOwnRoom() {
EscapeRoom er = new EscapeRoom(new Player("Tester"));
er.addRoom(new MyOwnRoom());
er.play();
}
Die Klasse enthält außerdem eine Reihe von statischen Hilfsmethoden, die für dei Implementierung genutzt werden können. Die Dokumentation der einzelnen Methoden findest du in der Klasse (wechsele am besten im Editor von BlueJ oben rechts von "Quelltext" zu "Dokumentation").
- Ausgaben
void print(String text): Ausgabe ohne Zeilenumbruchvoid println(String text): Ausgabe mit Zeilenumbruch
- Eingaben des Spielers
int askForInt(String question): Zahl vom Nutzer abfragenboolean askForBool(String question): Wahrheitswert vom Nutzer abfragenString askForString(String question): Text vom Nutzer abfragen
- Zufallswerte
int randInt(int max): Zufallszahl von 0 bismaxint randInt(int min, int max): Zufallszahl vonminbismaxboolean randBool(): Zufälliger Wahrheitswert (50%true)boolean randBool(int percentTrue): Zufälliger Wahrheitswert (zupercentTrueProzenttrue)T randElement(T[] elements): Wählt einen zufälligen Wert aus dem Arrayelementsaus. Es handelt sich um eine generische Methode, die den Typ zurückgibt, der auch im Array vorhanden ist.
Beispiel:String s = EscapeRoom.randElement(new String[]{"A","B","C"});.
- Strings überprüfen
boolean inArray(T element, T[] elements): Prüft, obelementim Arrayelementsvorkommt. Die Typen des Elements und des Arrays sind beliebig, müssen aber zueinander passen (z.B. beidesString).boolean containsAny(String text, String[] words): Prüft, obtextmindestens einen der Strings inwordsenthält.boolean containsAll(String text, String[] words): Prüft, obtextalle der Strings inwordsenthält.
- Flußsteuerung
void wait(int milliseconds): Pausiert die Ausführung für die angegebene Anzahl Millisekunden.