Update of exercises

main
Thomas Smits 2026-04-29 14:00:12 +02:00
parent 10a781fe11
commit e3131a4f59
19 changed files with 619 additions and 22 deletions

View File

@ -60,7 +60,7 @@ Hierzu gehen Sie wie folgt vor:
5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen.
6. Überprüfen Sie über das Web-Frontend, ob alles so im Repository liegt, wie Sie es erwarten.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **JavaDoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **Javadoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.
Wenn beim Bauen des Programms durch Maven Fehler auftreten, dann lesen Sie die Fehlermeldungen sorgfältig **von oben nach unten**. **Sie müssen immer den ersten Fehler (von oben gesehen) zuerst beheben.**

View File

@ -59,4 +59,4 @@ Hierzu gehen Sie wie folgt vor:
5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen.
6. Überprüfen Sie über das Web-Frontend, ob alles so im Repository liegt, wie Sie es erwarten.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **JavaDoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **Javadoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.

View File

@ -92,4 +92,4 @@ Hierzu gehen Sie wie folgt vor:
5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen.
6. Überprüfen Sie über das Web-Frontend, ob alles so im Repository liegt, wie Sie es erwarten.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **JavaDoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **Javadoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.

View File

@ -34,18 +34,16 @@ Jedes Passwort wird in eine von drei Kategorien eingeordnet:
Diese Bewertung wird als Zahl (siehe Konstanten in der Klasse `Rule`) repräsentiert.
Wenn mehrere Regeln kombiniert werden, gilt immer die schlechteste Bewertung.
Implementieren Sie Password-Prüfungen für folgende Tests, die alle von der abstrakten Klasse `Rule` abgeleitet sind:
* **Zeichensatz** (`RuleChars`): Das Password muss mindestens einen Großbuchstaben, einen Kleinbuchstaben, eine Zahl und ein Sonderzeichen enthalten, um gut zu sein (`GOOD`). Fehlt eine der Kategorien, ist es noch akzeptabel (`FAIR`), ansonsten schlecht (`BAD`).
* **Wörterbuch** (`RuleDictionary`): Das Password darf kein Wort aus einem Wörterbuch enthalten. Das Wörterbuch ist der Einfachheit halber als „mutti“, „papi“, „dackel“ und „password“ festgelegt. Groß- und Kleinschreibung haben keine Relevanz, d.h. „Mutti“ und „mutti“ sind beide verbotene Wörter.
* **Länge** (`RuleLength`): Das Passwort muss eine Mindestlänge von 8 Zeichen haben (`BAD`), oberhalb einer optimalen Länge von 12 ist es gut (`GOOD`), darunter `FAIR`.
* **Länge** (`RuleLength`): Das Passwort muss eine Mindestlänge von 8 Zeichen haben, darunter ist es schlecht (`BAD`). Oberhalb einer optimalen Länge von 12 ist es gut (`GOOD`), darunter `FAIR`.
* **Entropie** (`RuleEntropy`): Die Shannon Entropie des Passwortes muss in einem bestimmten Bereich liegen:
- `< 1.0`: Schlecht (`BAD`)
- `< 2.0`: Akzeptabel (`FAIR`)
- `>= 2.0`: Gut (`GOOD`)
* **Kombination** (`RuleCombined`): Beliebige Regeln können zu einer komplexeren Regel kombiniert werden. Für den Anfang werden einfach alle Regeln benutzt, um die Kombination zu realisieren.
* **Kombination** (`RuleCombined`): Beliebige Regeln können zu einer komplexeren Regel kombiniert werden. Für den Anfang werden einfach alle Regeln benutzt, um die Kombination zu realisieren. Wenn mehrere Regeln kombiniert werden, gilt immer die schlechteste Bewertung.
*Achtung:* Die Klassen liegen in einem eigenen Paket und sind nicht von außerhalb des Paketes sichtbar.
@ -78,4 +76,4 @@ Hierzu gehen Sie wie folgt vor:
5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen.
6. Überprüfen Sie über das Web-Frontend, ob alles so im Repository liegt, wie Sie es erwarten.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **JavaDoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **Javadoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.

View File

@ -542,4 +542,4 @@ Hierzu gehen Sie wie folgt vor:
5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen.
6. Überprüfen Sie über das Web-Frontend, ob alles so im Repository liegt, wie Sie es erwarten.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **JavaDoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **Javadoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,90 @@
# Ein Traum in Zucker oder kann ich dem Zufallsgenerator trauen?
Ihr Auftritt in der Spieleindustrie war ein voller Erfolg: Racewars hat die Steam-Charts gestürmt und der Einfluss ist so groß, dass Rockstar Games den Launch von GTA VI um sechs Monate verschoben hat, um nicht in Konkurrenz zu Ihrem Spiel zu treten.
Während einer Promo-Tour für Ihr Spiel reisen Sie auch durch die USA und stellen in San Francisco dessen tolle Features vor. Dort werden Sie von Mark Zuckerberg angesprochen und zu einer Party am Abend eingeladen. Natürlich nehmen Sie die Einladung an und feiern dort heftig ab.
<img src="img/zuck.jpg" width="150" alt="Mark Zuckerberg">
Plötzlich wird Ihnen schwindelig und Sie brechen noch auf der Party vor den Augen von Mark zusammen. War da etwas in Ihrem Moscow Mule? Hätten Sie den vielleicht besser nicht unbeaufsichtigt von Mark Zuckerberg halten lassen, während Sie auf der Tanzfläche waren?
Als Sie wieder aufwachen, befinden Sie sich in einer dunklen Höhle, wahrscheinlich viele Meter unter der Erdoberfläche. Es ist feucht und tropft von der Decke, es stinkt nach Meta-Schimmel. Vor Ihnen stehen zwei Echsen, wahrscheinliche Reptiolide oder andere Außerirdische, die sich in den Höhlen unter der Erdoberfläche verstecken. Sie hatten schon immer das Gefühl, das mit Mark Zuckerberg etwas nicht stimmt; jetzt haben Sie den Beweis.
<img src="img/reptilien.png" width="260" alt="Reptiloide (KI-generiert)">
Die Echsen haben Sie nicht ohne Grund entführt; sie wollen Ihre hervorragenden Programmierkenntnisse nutzen. Das war ja klar! Die Echsen wollen in Zukunft ihre Daten besser verschlüsseln und haben zu diesem Zweck von der Firma Nahtlose Sicherheitsapplikationen (NSA) zwei Zufallszahlengeneratoren gekauft, die diese per Vibe Coding mit ChatGPT erstellt haben. Die Echsen haben allerdings den Verdacht, dass da etwas nicht stimmen könnte und da Sie so gut programmieren können, sollen Sie jetzt helfen.
Eigentlich hätten das Entwickler:innen bei Meta machen sollen, aber Mark Zuckerberg hat gerade wieder 10 % seiner Belegschaft entlassen, sodass er keine Kompetenzen mehr in der Firma hat. Er will alle seine Leute geschniegelt durch LLMs ersetzen.
Sie bekommen von den Echsen zwei Zufallszahlengeneratoren mit den Namen `SecRandomGenerator` und `SuperSecRandomGenerator`.
* [SecRandomGenerator](../sources/src/main/java/pr2/algorithmen/rnd/SecRandomGenerator.java)
* [SuperSecRandomGenerator](../sources/src/main/java/pr2/algorithmen/rnd/SuperSecRandomGenerator.java)
Die Firma NSA hat auch bereits eine Implementierung der Lösung dieser Aufgabe für einen der Generatoren (`StandardRandomGenerator`) geliefert.
* [DrawRandom](../sources/src/main/java/pr2/algorithmen/rnd/DrawRandom.java)
Diese Implementierung ist aber so kompliziert, dass wirklich niemand sie versteht und ganz offensichtlich enthält sie auch einen Fehler, denn es kommen immer nur schwarze Bilder heraus.
**Ziel**: Diese Aufgabe ist darauf ausgelegt, dass Sie ein **Large Language Model** nutzen. Sie soll dazu dienen, einen sinvollen Umgang mit LLMs einzuüben.
## Paket
Gehen Sie in das Paket [pr2.algorithmen.rnd](../sources/src/main/java/pr2/algorithmen/rnd).
## Programm verstehen
Nehmen Sie den vorhandenden Code von `DrawRandom` und versuchen Sie ihn mithilfe eines LLMs (z.B. ChatGPt) zu verstehen. Gehen Sie hierzu schrittweise vor und lassen Sie sich einzelne Konstrukte erklären. Versuchen Sie nicht, das gesamte Programm auf einmal zu analysieren, das wird Sie wahrscheinlich überfordern.
Sammeln Sie die Prompts und die Antworten des LLMs in einer Datei. Diese Datei checken Sie als `log.txt` mit in Ihre Abgabe ein.
## Programm vereinfachen
Vereinfachen Sie das Programm so, dass keine Konstrukte mehr vorkommen, die wir in der Vorlesung noch nicht behandelt haben. Nach der Vereinfachung sollte es nur noch Dinge enthalten, die Sie verstehen und erklären können. Sie können sich bei der Vereinfachung ebenfalls von einem LLM helfen lassen.
Dokumentieren Sie die Schritte, die Sie zum Verständnis des Programms und zur Vereinfachung unter Verwendung eines LLMs gemacht haben.
Hierzu gehen Sie wie folgt vor:
* Jede Vereinfachung führen Sie in einem **einzelnen commit** in Git durch.
* In die Commit-Message schreiben Sie den Prompt an das LLM, die Ausgabe des LLMs und Ihre Erkenntnisse. Verwenden Sie Markdown, damit man das ganze gut lesen kann.
Beachten Sie bei der Verwendung des LLMs die [Regeln/Guidelines](https://moodle.hs-mannheim.de/pluginfile.php/514165/mod_resource/content/2/ki_guideline_pr2.pdf), die am Anfang der Lehrveranstaltung vorgestellt wurden.
## Fehler finden
Nachdem das Programm vereinfacht wurde, suchen Sie nach dem Fehler, der sich im Programm versteck und beheben Sie ihn.
Diese Korrektur bringen Sie dann wieder mit einem getrennten Commit in Git.
## Programm ausführen
Nachdem Sie ein korrektes Bild mit Javas Zufallszahlengenerator erzeugt haben, erzeugen Sie ein weiteres Bild mit dem Generator `SecRandomGenerator`, der Ihnen von den Reptiloiden gegeben wurde. Speichern Sie dieses Bild in einer Datei `secure_random.png` ab.
Jetzt führen Sie denselben Vorgang noch einmal mit dem gegebenen `SuperSecRandomGenerator` durch und speichern das Bild als `super_secure_random.png` ab.
Vergleichen Sie die drei Bilder. Was fällt Ihnen auf?
## Abgabe
Alle Abgaben für die Vorlesung erfolgen über `git` und das Ihnen zugeordnete Repository.
Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Rufen Sie mit `bin/submit.sh` das Skript auf, das die Lösungen testet und kompiliert. Wenn Maven eine Fehlermeldung zeigt, beheben Sie diese zuerst, bevor Sie mit dem nächsten Schritt fortfahren.
4. Wenn Sie Meldung "✅ Projekt gebaut" bekommen, checken Sie Ihre Änderungen in `git` **auf der Kommandozeile** ein (comitten), d.h. mit `git add` und `git commit`. Verwenden Sie **nicht** Eclipse für diesen Schritt.
5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen.
6. Überprüfen Sie über das Web-Frontend, ob alles so im Repository liegt, wie Sie es erwarten.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **Javadoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.

View File

@ -16,7 +16,7 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat
Wichtige Einstellungen für Eclipse sind [hier](help/eclipse.md) beschrieben.
| # | Ausgabe | Thema | Fällig am 📆 |
|-----|------------|---------------------------------------------------------------------|----------------|
|-----|------------|---------------------------------------------------------------------------------------------|----------------|
| 1. | 17.03.2026 | [Umgebung aufsetzen](Assignment_001/readme.md) | **24.03.2026** |
| 2. | 17.03.2026 | [Erster Commit](Assignment_002/readme.md) | **25.03.2026** |
| 3. | 25.03.2026 | [Stein, Papier, Schere (, Echse, Spock)](Assignment_003/readme.md) | **31.03.2026** |
@ -24,6 +24,7 @@ Wichtige Einstellungen für Eclipse sind [hier](help/eclipse.md) beschrieben.
| 5. | 08.04.2026 | [Password-Qualität](Assignment_005/readme.md) | **14.04.2026** |
| 6. | 15.04.2026 | [Racewars](Assignment_006/readme.md) | **28.04.2026** |
| 7. | 22.04.2026 | [Live-Testat](Assignment_007/readme.md) | **22.04.2026** |
| 8. | 29.04.2026 | [Ein Traum in Zucker oder kann ich dem Zufallsgenerator trauen?](Assignment_008/readme.md) | |
## 🏛️ Aufbau der Veranstaltung
@ -32,7 +33,7 @@ Die folgende Tabelle zeigt Ihnen die Themen der Woche und welche Kapitel Sie bis
| # | 📢 Motto | 🎓 Themen | 📚 Kapitel | Übungen | 📆 bis |
|----|--------------------------------------------|-------------------------------------------------------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|
| 1 | Auffrischen, einchecken und loslegen | Auffrischung | [1][1] | [1][au_001], [2][au_002], [3][au_003], [4][au_004], [5][au_005], [6][au_006] | ¹ |
| 2 | Wie Julius Caesar programmieren | JUnit, JavaDoc, Programmierstil, Pakete, Module, JARs | [2][2], [3][3] | [1][ei_001], [2][ei_002], [3][ei_003], [4][st_001], [5][st_002] | **23.03** |
| 2 | Wie Julius Caesar programmieren | JUnit, Javadoc, Programmierstil, Pakete, Module, JARs | [2][2], [3][3] | [1][ei_001], [2][ei_002], [3][ei_003], [4][st_001], [5][st_002] | **23.03** |
| 3 | Erben und vererben | Vererbung, Überladen, Verdecken, Konstruktoren | [4][4] | [1][ve_001], [2][ve_002], [3][ve_003], [4][ve_004], [5][ve_005] | **30.03** |
| 4 | Verhaltenstherapie für Klassen | Überschreiben, Polymorphie, static, final | [4][4] | [6][ve_006], [7][ve_007], [8][ve_008], [9][ve_009], [10][ve_010], [11][ve_011], [12][ve_012] | **06.04** |
| 5 | Mit Interfaces geht es noch abstrakter | Interfaces, abstrakte Klassen, SOLID, STUPID | [5][5] | [1][ab_001], [2][ab_002], [3][in_001], [4][in_002], [5][in_003], [6][in_004] | **13.04** |

View File

@ -0,0 +1,82 @@
package pr2.algorithmen.rnd;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.stream.IntStream;
import javax.imageio.ImageIO;
/**
* Testet die verschiedenen Zufallszahlengeneratoren dadurch,
* dass ihre Verteilung geplottet wird.
*/
public class DrawRandom {
private static final int W = 100;
private static final int H = 100;
private static final int I = 5_000_000;
private static void generate(RandomGeneratorFactory factory,
String fn) throws IOException {
int n = W * H;
int p = Runtime.getRuntime().availableProcessors();
int b = I / p;
int r = I % p;
int[][] pr = IntStream.range(0, p)
.parallel()
.mapToObj(x -> {
int[] local = new int[n];
RandomGenerator generator = factory.create();
int it = b + (x < r ? 1 : 0);
for (int i = 0; i < it; i++) {
int value = generator.nextInt(n);
local[value]++;
}
return local;
})
.toArray(int[][]::new);
// Reduce
int[] c = new int[n];
for (int[] l : pr) {
for (int i = 0; i < n; i++) {
c[i] += l[i];
}
}
draw(fn, c, n);
}
private static void draw(String fn, int[] c, int n) throws IOException {
int max = Arrays.stream(c).max().orElse(1);
BufferedImage image = new BufferedImage(W, H, BufferedImage.TYPE_INT_RGB);
IntStream.range(0, n).forEach(i -> {
int x = i % W;
int y = i / W;
int gray = (int) ((c[i] / (double) max));
int rgb = gray * 65536 + gray * 256 + gray;
image.setRGB(x, y, rgb);
});
ImageIO.write(image, "png", new File(fn));
}
public static void main(String[] args) throws Exception {
generate(StandardRandomGenerator::new, "standard_random.png");
System.out.println("Alle Bilder erfolgreich erzeugt.");
}
}

View File

@ -0,0 +1,15 @@
package pr2.algorithmen.rnd;
/**
* Interface for all random number generators.
*/
public interface RandomGenerator {
/**
* Generate a new random number between 0 and max (excluded).
*
* @param max the maximum value (excluding) to be generated
* @return a random number between 0 and max (exclusive)
*/
int nextInt(int max);
}

View File

@ -0,0 +1,14 @@
package pr2.algorithmen.rnd;
/**
* Factory für die Zufallsgeneratoren.
*/
@FunctionalInterface
public interface RandomGeneratorFactory {
/**
* Erzeugt einen neuen Generator.
* @return der Generator.
*/
RandomGenerator create();
}

View File

@ -0,0 +1,33 @@
package pr2.algorithmen.rnd;
import java.util.Random;
/**
* Psst...
* Super secure and mathematically correct random number generator
*
* @author NSA
*/
public class SecRandomGenerator implements RandomGenerator {
private final Random rnd;
/**
* Create a new instance.
*/
public SecRandomGenerator() {
rnd = new Random();
}
/**
* @see RandomGenerator#nextInt(int)
*/
@Override
public int nextInt(int max) {
// increase randomness by taking two random numbers
// and calculating the average
int a = rnd.nextInt(max);
int b = rnd.nextInt(max);
return (a + b) / 2;
}
}

View File

@ -0,0 +1,16 @@
package pr2.algorithmen.rnd;
import java.util.Random;
public class StandardRandomGenerator {
private final Random rnd = new Random();
/**
* @see RandomGenerator#nextInt(int)
*/
@Override
public int nextInt(int max) {
return rnd.nextInt(max);
}
}

View File

@ -0,0 +1,302 @@
package pr2.algorithmen.rnd;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Psst...
* Even better super secure and mathematically correct random number generator
*
* @author NSA
*/
public class SuperSecRandomGenerator implements RandomGenerator {
private static final String SEED = """
3333442547696=GAF8578AE;33689?DGECDDDA;:
8852222212135466:BK\\djhaQJHF?>DEHHHHHHHH
IJKKMNLMLLLLMNNNNOOO343222275>9986FGBA94
38@@<5269;=@DEEFHGCA<865422365333458@FRd
ijiicSOJ?=<DJJKKKKJJJJKKKJKLKLKLLMNNOONN
333344699A>9849IDA?8648<;:;:668:99<?>=98
8967547;2223479@GO[gkjkijeXSG;7<DJLKKMLL
KKKKKKJKKLKLLMNNOOON3533337:@BE?:55>FE?;
7517<779997688879987<?A@=>>@443358?GL]ck
jkijihbXM>8BFJMLLMLKLLLLLLKLKKLLMNNNOOON
4563435:CHJGA578DBG<66433589:75567;@<?AF
HLDFGDH?54567;EPXgjnljljjjhaSA:BJJKLKLLL
MMMMMMLLLMLMMNOONOOO33762326=KNIC=65@?>B
@:644455689;=>=AFLOTREOKJCO<657:>CM`glol
mjjkjije[D69IJKKKKLLMMMMMMMMMMMMMNNNNOOO
343<52346JLKB==2@??;;??=;;>@AC?88ALLMNQK
LSNRGOI5558?DJXiopqmnmjjhijhcN=5EJKKKLLL
MMMMMMMMMMMMNNNNNOOO433773422ALLF:<86C;;
758:==<<;9=@CDDHLNIPTRUOGS;457:DKTfmqqpm
llijjikifV>:@JKKLLLLMMMMMMMMMMMMNONNNOOO
8:34433348DNKC9848B88553369:;<=@?@EHIELO
MQPFOC5459=IS_mmqqpnmljjijjkh_A8@JJJKKLM
MMNMMMMMMMMMNNNOOOOO4;;5244438@DMI?88588
655788:;<?@>;?FHGHHDFJJD=;467=AP[hnoqppn
nkjjjjjjjfG8@JJJJKLMNNNMMNNNNNMNOOOOOOOO
4279344545?AEGH@5424467877::::89;CEBFDB?
AHA>8:8:=BIZelnooooonljjijijjhZ6@KKJKKLM
NNNMMNNOONNNOOOOOOOO3529774554:DAAEIB;40
2245689;;===A>?BA=<=@A;:>:AADISdlomlmnoo
mjhhhjjjjhd?ELLKKKLMMMMMMNNOONNNOOOOOOOO
34247886666AB??BFE>73212333588:?>>?=5;?<
A=;BCBFHNQailnnmklnnmlkjijjjjjeUELLLLKKL
LLLMMMNNONNOOONOOPOO333348987679A>A::=95
4433445669===<;8:><A@@CFJLMPVZfknonnmmll
mlllikkkjiiaGLKKLJGDA?=ADIJJLKJJGEFIFFLO
334334898676>D@?=785443334469<=<99;;?>CC
FJMPSVUY\\`imnnnoonmnnmmllljjjjhf\\FCA><
??889<>???@>>??AA@@?AF3333442987666;AA;=86
44444568;:8667:=@DJKRXZ]^``adgjknooponmm
mllmlljijjhfdA8::=?@9356=?>?@>@C@>?>?>?@
433334349;77459==;976655566;9777:;AGHOVX
Y\\abddeehijllnlnoommnnnmkkljhjhihS9::???
;356;>>?@AA<A?=B>=994333334458986558;<96
65456777778=AEKORUXZ]bddefghjkjjlmlmnnno
pppnmkkjiijiicA9<=?B<5349;>@><<=?<;>=98;
44433333446896557898766776678;@DHMPSUW[^
adfgghjkkkkjllmnooooppomlkjiifhfb_L;AA@D
;634;==@>=:;;9;=>8:;33444444545798665567
6555678:<AFILORUUX]`befhijkkkijillnnpopp
onmlkkihgda]YZSAB;??;7348;?<;::9789;<9::
43334455554458786567666789;=AFIKOQSTVY]_
cdffhjjjkklmnmnnmlmnlmllkjhhd]TUV]^HA?@@
;62469=99737588<9;9;34444445544346588656
6889:;>BFKNNOQRRUX[]bdgfgijlmmnonmlllkkk
klkkigfaXQSW^ceZ<=A>;83689=986487988:>;;
34455555554554466779:<=>>ADGJMOQPQQQVX\\`
deeeghknnnnoomkjiihhjjhgfecYOOX_`bfgD<A=
=52579;9864768:8<><=4445556555555444569=
>ABDEGJMNPPQQQRRVX^ceffgghkmoooonmkihgfg
hhfec\\PJNWZTU^hkU;>:<6356:6666345679:>>?
4455566654444455568<?DFHIJLOPQRQQPRUW\\a
bdffgfhijnnnnmmjhgfeffdc_SJGKNB@IP[ikh?;<
;7345;433435768;9=;?5444656665454444369;
@FHIJJMNQRRRQQTUX[`bdeffhhjjlmmmmljigfde
fd`ULLM?8>NOYdjjmQ8::764475565356568::>?
7455446666555444467;AFHJJJLOPQSSSQTTX\\ab
deffhijiklllkjiigfcccbZOLG766?_`ckmnmb:;
7565355676665689<;;A@866466777655545545;
AFIJLLLNOQRSSRRUX\\accdeghiihihhihhghggd
aa^TNMG?>FKjcimnollA;824445466556566<:;A@
FI=6666777655554455:?EHKMMMMOPQSSRTVWY^`
bdefghgfggggeffgegeb_ZQNJUWJRjhhkmnnnlU8
725533446556688;;??;HJL88678876645465569
?DIMMMNNNOQSSSSUWZ]`cccdeffeeebabcefece`
\\VRNKS_dggiilonnmn^782474444544667<;>?;
=JJS@;678877666465678?EIMLMNOMNPSTUUVX[^a
ccbbaba`_]\\YY\\^adbdc_[VSS[bdefjklnnnnm
f86546445443487;>=?=B@IKQM:767777666554467
?EHLLMMONNPRTVWXYZ^_`cba_]\\\\XTSRRTTX_a
eheb^cda`ddhlnmnnnnmj?7646554466677<CB><?<
JLRV@976787665555669@CFJLMMNONOQRTVXZ[\\
\\]^\\YYXTQOLKJLOQSX`flmkefgeefgjknnnmnnlkM
965565457788:;<A==;9LKSWK:6867766655456:
=@CIKKMLMNNOQSTVXZYXXYWROMIEGGGIJJLNS_el
pmjijkhfhghlnnnnlkiY5756644787998@?B@=;6
MLPXV=76687666566568:>CHJMMMMNNNPQSTVWTR
SQLHEDEGJLJHHGIJMWcjpqjjillklllmnnmlkjj]
87865668779:?ACAA;8;LLPVYE86889776676667
9<BFIMMNMMMMOORSUSNMNIFIKJQNLIJLIECEIO\\
elqljhiijmooooomllkja=<<:767767>??=B=;:;;
KJNUZR;86687888866667;AFJMMNONMMMNOQQIFJ
LLNQUUF=@BDLSOEEGJSaflpkihhjmnoppmlllkic
?=>=87969;<<;=<==?>EJIOTWI:7667878887775
68@GJMMMMNNMMLMIHGIOPVVTM>8GWICMSNKJJJQ[
chomiihikmnmmmlmljjdCA?;:79::==?<;<=?@??
JMOSA96777677777886559@HLMMMMMLKJJGHGINR
UVR@637HYOUWSNQQMLOU]flqmihiikmmlkmlkjif
EC==9::9;;8:;=A@>?@@JQR?8676656666788764
59AHKLOMMMKJHEEHKOQRTM@<;A=NV]VXSUWTPLMQ
XbhopliiijjjkkkkjjijMBB@;88?><=@?<;>>:73
KM;8687666666678667459@FJMMMLLLHEBGMNORR
K?CSM@J[\\^^]Z\\[VSOMNS\\elrojijighijjkjiij
R8;=>:=?;<8=;=;73479C7667676665767766764
68>CJMLMKKMJGFKMOPPK@?LSSTZ\\`^b`a_\\XTQPN
PWbhopljjhdfhjjjjjjk[346779=;9;=84456657
7565666666667:76666568;@HMMMLJKKJKNOOQOG
CIMQUX\\aabccba]YURPOQS\\cippjijgeggijjj
jjc434457;9:715665444345555666655659977655
779>EKMNNLLLMNOOOPNMNNOTX^^_dedccc_[VSQQ
QSX^djlkjjjgfeijjjjif5244446436875555444
34555667655?IIHC?::9;88<AHMNONNNOPQOPPOQ
RSTWY[`effeceda]XSPOPSVZcelqkihhgdehjjjj
h82433235674853465454444567766<NNMMKJDDA
>;88>GLNONNNOPRSPQQSTUZ\\]befggffffc_YQLM
ORU[beinnieeiifgijhig;243344677644656553
4444566675BONMLMLMMKE?88=CHLNNNOPQRSRSTU
XZ]aceegfgijige`YMLOPSTW^cfijiedljjiiiij
g<2432467877656676544445566686IKFEKOJILO
MH>8=AGJMNNOQQRSSTWZ^`accefhiiikjifbYILO
NPQQTYaceeekmllljijjg?243235786776464654
4445666576FHBEKOOMONOMH;9AFJMNOPQQRSUVY]
`bdeefhhhhjkjjgcXGJMLMMKLMTYYWbnlmlljjjj
h@2332225777678856544456666565=ICBHOOPLB
MMMH;>FKNOOPQPQSVWY\\^aceedfgghhiiifcWFIJ
KKKLLKMPSYflnmlkjjiji?132222546666648654
34555566556FEAFMONFBFHJPHAFKMNOOPPPRSVXZ
[\\abddeegghhiiecVFFJKOH@@DJPVcimllkjijj
kh>233223345755555744344444554549FDDONIEA
EGHPMJHJLMMNOOPQRSUVWWZ\\^beeeefhhhebUDB
HKG<EEIMQZeilkihieehhi=232222345634684657
344444554553:EDHOFB@DGFOMLJIJMNMNOOQQQRS
USUX[_cdeeefhgeaRD@ABA@BFMOS\\djljijjZ\\eh
f813222234475656676;44444455565647CHMGA@
?BAKNNIHIKLLMMMOOOQQSSTUXZ]_bdedfed`SHDA
B@BFJOTZ^bhkkijcS`ehb52423323336666677M_
334555555555446CKIA??ACFMOLIIIJKLLMNNOPQ
PPRSUUY\\^aacddc_ULIIHIKLMPWab`ejifaZehh
hX224223334576866:Vgf3455555555555555EKHF
FJKGBGOKFGHJJJMLMOPPPOQRSSVXZ]^``aaaZOMN
NNOMNQZcfeee]TM`hiifJ33533243315AMOD]hig
44456666665566457DJIIMQOLJMMIFFHIILLMNNN
OOOPQQSSVZ\\`aaaa[ROPPOOMNQ\\ejieXMKXdhjig
?335334448OetsrZXiii445566566666655445AH
HINQSPNLHEDEHHJKLMNNOONOPPQQSWXZ]_^`ZTRQ
PNNNOS\\adcVJMY\\bhhhe62353358MhswuwmUdf
jj4556666777755555544;GIKMOPNJHA@CEHIJIKMM
NNNNNNOOQTTV\\\\`^YUROPMMOPTSONIFR``\\ag
hga4352336cvuknsrgLehkk44566667777655555453
4;GIIIIHHA<?CDGIHJKLMNNMMMNNQRRTWY\\[XUT
POONNPJGDADLX]YZbfgg\\242633auxwuga`HOhjjl
44566667676666555424437=BDDDA>=>@ADHHHIJ
KMNNNMMNPQQRUWYXWURMMMMICA?@HNTWVV\\cfhiV
22444CrqqkbMC>IFgjnm44566677676666555443
34444557;>>>>?@DFGIKKLLMMMMNOQQQSTVUTRQK
IE?;?AFJPSSQSZcfiihF3428URW^\\T?=?=?FWok
m44556667776666554444334323325:>=><=ADFHI
ILKLLLLMPOPQRRSSRPG<9:<ACFJOPPOQVagijie9
22C__JMPXH;=<9AJIinj44455666776666554444
3344233335:;<;;<@EGGGIHJKKKMOOPQQQQQQMFD
FDBCEGILMNOT_gklkia1>Zdec\\TQNI9:@@BDHWlj
4445666666666555544444432233326:;;;;<ADE
FGHIJKKKMNOOOQOOPNMKJJIIJKLNOQRZfjkkih_[
hgijiijkd_D:D???@Afh44566676667555554444
343333222248;;<:9;?ACDFGHIIJMNNNMOOOOOML
KJKKKMMOPQXcjkjjjhefjkkjjjjhhl`E8@5969Tg
444566766675555444433333322222269;:::8:=
@ADDFGHIJLMMMMOOONNMKKKLNNOPQXcfgggggaim
mklljljjilkL966356Aa44455666665555543442
222222222223599:9887;@@@CDEFIJLLLLMMMMLL
LLLMNMOOUaeggeddcknmjjlmlllkkklc;543445O
3444556666555544432222222222222225888876
67:=>@ABFFHIIJKKKKLLLKKMLNPV^`dedbc]hnmk
mnlnllmkjjjkM242234>44444566665555445422
2222222222222256666543447;=>BCDEEHHIIIJJ
KKKMMNSV\\^__b^Wemmknolnmlmmlkjjjb<12236
64445556666544555442333222222222331145544
33322247;=@@@BACDEGIJJHIMNQTVWXYVShnmlnn
mmmnmlmmjggheQ12677544456666665555555432
22222333223332223444332221112468;==>?ABC
FGHHIJKNOONOakmnnmnoonnnoonllhehd]>23443
4545666666555544443333222223222332222333
322321112111244689<=BDEEDCCBMXclnnonmnnn
opoqqqqnmjecb\\H022434545656666555544434
44332233322232222222222222111100000112344
9<==>CUehmnmmlllnpopppqqrqqqojg^\\TJ4424
64445666666555555433333222332322222223322
2222211111221121116@JPSV]gkjlmmnmmmmnpqq
rqqqqqppnjg^TPH5233156556666566678543222
222222222234132231222122211220120015<FMR
W[chhijkkllmllnooqrrqrqpqoolkjg\\SJD82333
5655666666765454432222222222223232224412
2222201033126=HRX\\[]^bggkkmnmlklmnooopqq
oopoonkiiieaPG<6432256866766897556443332
232222232223222632222468<==@DHLSZaggghee
cbeiikmnmlklmnnonmnmllmmlifggdaVM=232468
4666666:;57753443333233322232222224>QWZX
Y\\`bbcehjkjikjikjifc^dhiiklmnnmnnllmlkj
hghhecba`_\\TO?658<CED45665587795444444323
34433223132238Qehhijihiijjmmnnnnmmkkjfc[
_ehjjkmnnnnnnkjjhgfcaa_\\YZXVTNP[f`OEFMKO
36568776966666543323334332234242Hdjjllli
hijklnoonnllkkjhdc[\\fhjklllklnmmljhedb^Z
WVSUSRNS^jlqmlaKMSZZ44687575476666644323
3333223142>]kjmmlljjkkkkjjkjjhfedaba_`^e
ikkllkjihhhhghd^[XTRQPNOT\\elppookaSTXXR
Q57877864766655654333333323354Yllmnnkllml
mljihggeeb]YTSX_cdgjjlljiihgeddc`\\ZUROM
MOP`koonlonk]YVWUXSVQ75676466566555665325
3333324Fdnmonmkkmnnljhheca`^[WSOKINVdhjl
llkhdcaaa\\YVTQNJHJQ\\ejnmlmig`VQPYWWTSTPO
57544665555554565352433424Kflnonlkkmnmmj
hb^YXYXWVQMJEFE]hjlmlif`\\[ZVTOMLGFJR]dfi
jkigd_WMOSQQQWSLHNNQ56484655444544454435
3334>Xjjlnlkjknmmkge\\SQOPQQNKE?:<<\\fhkmm
hc`URQSQLDJPX`fkjjkjea`\\QHJVQPTVVIJW^RQ
Q54466755454544464544448Ughklkjhjilmlid\\U
QLD@><;621248Wfgikkic\\RJMHLU\\gmmmlkiii
fd^WKCJTQJQSPNZZ\\ZZR^Z44555455554443455664
4B_ekkjkfgijjjhd^YSO?432354778:>Pbdilkhd
]REHO_kmnpomlihhgd^UH@GRMIKLMMU\\\\XYRUYZZ
4568664455544435565?Tiahljkkeghife^WWOA7
5787;>?BJSZ_QU\\ehhe_SMZgmnponkjkjhd^YPB?
FOMKKOSUS_]^WMQVY[YW445878754554445267Rl
mlgijjmlfghd_XTNE>?ABCEGKR\\gihgbRSX`ecaW
RdnnnnmjghgheQRI=;EMOLHOQLRSTXQLOQPTVVSJ
44356865565555468Vfllhhcgkjgfc\\ZUPGDHJLO
T[`eilkjjjj\\ORS\\_]VVhnmonkjkljib[J<:AH
KJMONQOQMQVUSVSQSTQJA=3325565655656666>`ef
dc[Ybefd]YVRLHLQX^chjmnnnmkkhjgTZ^^[XTTg
llmlkkiiifdZH<DFIHINSSMRPSMTXWUWVSSJ?<:8
1343455556678666;SZ^YWUUYZ[YTROT\\bgkmnn
ooonnmlkjih]R\\a_[UR_iijljhigc^XM?@JIFFJLN
LQRMTQORVWWTMIA@A:<833334546878999;BDHRV
]eZOMOQPWajmoonpoopppnnnmlkjhdTQYaa\\TXfg
fgff``XSNB=FMLJLIMLLKPROUVNQTSJB=:89<894
42455656<CNV^dhjjjinnmebacflooooononmnno
nnmmmljhe]OQX`b^T]bc_`\\[UOJA9;FGHOLPKKO
RQSVUSULMBC<876689646355;GPYafmmnllmlmnnn
pnmoopomnnmmlllmmmmllmlklkhdaUQWX_`ZSXYV
TRNHD<75;EIOHOMKNQTSTWWRON=6665868:<8778
TYahllmnmonnmlnoonnnonoppommmjkjkjkjlkjj
iihhhgfaZORYZ_ZSMOOLD=6555:AGKQONMNOQSSU
UVRI>:765678678<8745imjmlnqnnnlnnnppoqpp
nnpoomnkjljjjiijgiiihggedbb\\SLMST[XNJE=6
3266=AIMMMLOSRQQRSRQJD968776677788:;6643
mmooopnrnonnqpochrnmjgYJK?IQWZbdbeegehhf
gcab_ZXRMFJNPSV@5358<??HMMKIHJMOUXTPMMF=
76978788887868;94445RGJXacailpjTMD=7HLE?
?A3351:2B;8:5<7;68MFHPSVWUPJCCHJOPN9:999
;=::78:=@BDGILHFB<7767788778767767843689
""".replace("\n", "").replace(" ", "");
private final int[] seed;
private final Random rnd;
/**
* Create a new instance.
*/
public SuperSecRandomGenerator() {
rnd = new Random();
List<Integer> ns = new ArrayList<>();
char[] ca = SEED.toCharArray();
for (int i = 0; i < ca.length; i++) {
int value = ca[i] - '0';
for (int k = 0; k < value; k++) {
ns.add(i);
}
}
seed = new int[ns.size()];
for (int i = 0; i < ns.size(); i++) {
seed[i] = ns.get(i);
}
}
/**
* @see RandomGenerator#nextInt(int)
*/
@Override
public int nextInt(int max) {
if (max == SEED.length()) {
return seed[rnd.nextInt(seed.length)];
}
else {
return rnd.nextInt(max);
}
}
}

View File

@ -0,0 +1,29 @@
package pr2.vererbung.racewars.model;
/**
* Interface für Entitäten die von anderen Entitäten
* angegriffen werden können.
*/
public interface Angegriffener {
/**
* Reduziert die Lebenspunkte des Wesens um die Damage.
* @param dmg Schaden.
*/
void reduziereLebenspunkte(double dmg);
/**
* Beschränkt den Schaden.
*
* @param dmg Schaden.
* @return Verbleibender Schaden nach der Beschränkung.
*/
double beschraenkeSchaden(double dmg);
/**
* Liefert die Rüstung des Wesens.
* @return Rüstung.
*/
int getRuestung();
}

View File

@ -0,0 +1,17 @@
package pr2.vererbung.racewars.model;
/**
* Interface für Entitäten die anderen Entitäten angreifen
* können.
*/
public interface Angreifer {
/**
* Greife das andere Wesen an. Der Schaden wird berechnet und beim
* gegnerischen Wesen abgezogen.
*
* @param gegner Wesen, das angegriffen werden soll.
* @return Zugefügter Schaden.
*/
double attacke(Angegriffener gegner);
}

View File

@ -3,7 +3,7 @@ package pr2.vererbung.racewars.model;
/**
* Basisklasse für alle Wesen im Spiel.
*/
public abstract class Wesen {
public abstract class Wesen implements Angreifer, Angegriffener {
/**
@ -13,6 +13,6 @@ public abstract class Wesen {
* @param gegner Wesen, das angegriffen werden soll.
* @return Zugefügter Schaden.
*/
public abstract double attacke(Wesen gegner);
public abstract double attacke(Angegriffener gegner);
}

View File

@ -12,7 +12,7 @@ public final class WesenFactory {
* immer der Anführer, die folgenden dann entsprechend die Wesen der Art.
* Reicht das Geld nicht, wird ein leeres Array zurückgegeben. Reicht
* das Geld nicht für den Anführer, sondern nur für normale Wesen,
* wird der Anführer übersprungen.
* wird ebenfalls ein leeres Array zurückgegeben.
* Die Art der erzeugten Wesen wählt man über einen passenden Parameter aus.
*
* @param rasse Rasse, von der man Wesen erzeugen möchte