commit bf703e51bf641482f3e6b5a76ee3c6a4aad50829 Author: janpfeifer Date: Tue Apr 15 23:58:21 2025 +0200 Initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..6d7254c Binary files /dev/null and b/.DS_Store differ diff --git a/Aufgabenstellung.pages b/Aufgabenstellung.pages new file mode 100644 index 0000000..5c847b4 Binary files /dev/null and b/Aufgabenstellung.pages differ diff --git a/Musterlösung/.DS_Store b/Musterlösung/.DS_Store new file mode 100644 index 0000000..bb3bf89 Binary files /dev/null and b/Musterlösung/.DS_Store differ diff --git a/Musterlösung/src/UI/Main.java b/Musterlösung/src/UI/Main.java new file mode 100644 index 0000000..0f15938 --- /dev/null +++ b/Musterlösung/src/UI/Main.java @@ -0,0 +1,15 @@ +package UI; + +import java.util.Scanner; + +public class Main { + + static Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + UI ui = new UI(); + + ui.run(); + } + +} diff --git a/Musterlösung/src/UI/UI.java b/Musterlösung/src/UI/UI.java new file mode 100644 index 0000000..870d864 --- /dev/null +++ b/Musterlösung/src/UI/UI.java @@ -0,0 +1,105 @@ +package UI; + +import exceptions.WesenExistiertNichtException; +import facade.Teamkampf; + +public class UI { + + private Teamkampf teamkampfSpiel; + private boolean siegbedingung = false; + private static final int SIMULATIONSGESCHWINDIGKEIT = 500; + private int defaultAnzahlTeams = 2; + + + public UI() { + teamkampfSpiel = new Teamkampf(); + + System.out.printf("\n\nWillkommen bei Teamkampf!\n\nBitte Vergrößern Sie das Terminal für ein besseres Spielerlebnis!\n\n"); + } + + public void run() { + + System.out.printf("Wieviele Teams möchten Sie simulieren? (Zahl > 1)\n"); + + int anzahlTeams = defaultAnzahlTeams; + boolean eingabeGueltig = false; + + while (!eingabeGueltig) { + try { + anzahlTeams = Main.scanner.nextInt(); + Main.scanner.nextLine(); // "Schluckt" den Zeilenumbruch + if (anzahlTeams > 1) { + eingabeGueltig = true; + } else { + System.out.printf("\n\nEingabe Ungültig! Bitte nur eine Zahl > 1 eingeben!\n\n"); + } + } catch (java.util.InputMismatchException e) { + System.out.printf("\n\nEingabe Ungültig! Bitte nur eine Zahl eingeben!\n\n"); + Main.scanner.nextLine(); // Schluckt die Ausgabe + } + } + + for(int i = 1; i <= anzahlTeams; i++) { + String teamName = "Team " + i; + teamkampfSpiel.erstelleTeam(teamName);//Der Einfachheit halber alle Teams durchnummerieren + + while(true) { + System.out.printf("\n\n\n\n\nWelches Mitglied möchten Sie %s hinzufügen? Sie haben Maximal %d Lagerplatz für ihre Truppen!", teamName, Teamkampf.MAXIMALLAGERPLATZ); + System.out.printf("\nDrücken Sie \"W\" um die Teammitglieder für das nächste Team auszuwählen bzw. mit der Simulation zu beginnen!\n\n"); + System.out.printf("Auswahl:\nKobold: K, %d Lagerplatz\nRitter: R, %d Lagerplatz\n", teamkampfSpiel.getLagerPlatzVonWesen("K"), teamkampfSpiel.getLagerPlatzVonWesen("R")); //Hier neue Wesen zur UI hinzufügen + + String neuesMitglied = Main.scanner.nextLine().toUpperCase(); + + try { + if (neuesMitglied.equals("W")) { + break; + } + else if (!teamkampfSpiel.addWesenToTeam(teamName, neuesMitglied)) { + System.out.printf("\nDas hat nicht geklappt! Dieses Teammitglied braucht zu viel Platz!"); + } + } catch (WesenExistiertNichtException e) { + System.out.printf("\nDas hat nicht geklappt! Das ausgewählte Wesen existiert nicht!"); + continue; + } + + System.out.printf("\n\n\nIhre Truppen brauchen momentan %d Lagerplatz!", teamkampfSpiel.getDerzeitigerLagerPlatzVonTeam(teamName)); + + } + + } + + System.out.printf("\n\n\n\nDie Teams:\n\n"); + System.out.printf(teamkampfSpiel.teamsToString() + "\n\n"); + + System.out.printf("Beliebige Taste, dann ENTER drücken um die Simulation zu starten."); + Main.scanner.next().toUpperCase(); + System.out.printf("\n\n\n"); + + + int runde = 1; + while(!siegbedingung) { + System.out.printf("\n\nRunde %d\n\n", runde); + + teamkampfSpiel.triggerRound(); + + System.out.printf(teamkampfSpiel.teamsToString() + "\n\n"); + + try { + Thread.sleep(SIMULATIONSGESCHWINDIGKEIT); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if(teamkampfSpiel.checkGewinner()){ + System.out.printf("\n\n\n\nHerlichen Glückwunsch!\n\n"); + System.out.printf("Der Sieger ist: " + teamkampfSpiel.teamsToString() + "\n\n"); + + teamkampfSpiel.gewinnerToString(); + siegbedingung = true; + } + runde++; + } + } + +} diff --git a/Musterlösung/src/domain/LagerPlaetze.java b/Musterlösung/src/domain/LagerPlaetze.java new file mode 100644 index 0000000..900b76c --- /dev/null +++ b/Musterlösung/src/domain/LagerPlaetze.java @@ -0,0 +1,17 @@ +package domain; + +public enum LagerPlaetze { + + KOBOLD(10), + RITTER(5); + + private final int lagerPlatz; + + LagerPlaetze(int lagerPlatz) { + this.lagerPlatz = lagerPlatz; + } + + public int getLagerPlatz() { + return lagerPlatz; + } +} diff --git a/Musterlösung/src/domain/SpezialEffekt.java b/Musterlösung/src/domain/SpezialEffekt.java new file mode 100644 index 0000000..a278972 --- /dev/null +++ b/Musterlösung/src/domain/SpezialEffekt.java @@ -0,0 +1,9 @@ +package domain; + +import domain.Wesen.Wesen; + +@FunctionalInterface +public interface SpezialEffekt { + void apply(Wesen ziel); // Wesen ist das Ziel des Effekts +} + diff --git a/Musterlösung/src/domain/Team.java b/Musterlösung/src/domain/Team.java new file mode 100644 index 0000000..d96e25e --- /dev/null +++ b/Musterlösung/src/domain/Team.java @@ -0,0 +1,59 @@ +package domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import domain.Wesen.Wesen; +import domain.Wesen.WesenFactory; +import exceptions.WesenExistiertNichtException; + +public class Team{ + + private final String TEAMNAME; + private List mitglieder = new ArrayList<>(); + + public Team (String teamName) { + TEAMNAME = teamName; + } + + public void addWesen(String wesen) { + switch(wesen) { + case "K": + mitglieder.add(WesenFactory.getInstance().createKobold()); + break; + case "R": + mitglieder.add(WesenFactory.getInstance().createRitter()); + break; + default: + throw new WesenExistiertNichtException(); + } + } + + public int getDerzeitigerLagerPlatz() { + int derzeitigerLagerplatz = 0; + for(Wesen w : mitglieder) { + derzeitigerLagerplatz += w.getLagerPlatz(); + } + return derzeitigerLagerplatz; + } + + public String getTeamName() { + return TEAMNAME; + } + + public List getMitglieder(){ + return mitglieder; + } + + //Returnt die Statistiken über das Team + public String toString() { + Collections.sort(mitglieder); + String mitgliederString = getTeamName() + "\n"; + for(Wesen w: mitglieder){ + mitgliederString += w.toString() + "\n"; + } + return mitgliederString; + } + +} diff --git a/Musterlösung/src/domain/Wesen/Menschen/Ritter.java b/Musterlösung/src/domain/Wesen/Menschen/Ritter.java new file mode 100644 index 0000000..a7c9095 --- /dev/null +++ b/Musterlösung/src/domain/Wesen/Menschen/Ritter.java @@ -0,0 +1,29 @@ +package domain.Wesen.Menschen; + +import domain.LagerPlaetze; +import domain.Wesen.Wesen; + +public class Ritter extends Wesen { + + public static final String ABKUERZUNG = "R"; + private static int anzahlRitter = 0; + + public Ritter() { + super( "Ritter " + ++anzahlRitter, + LagerPlaetze.RITTER.getLagerPlatz(), + 1000, + 0.4, + 120, + 0); + setSpezialEffekt((ziel) -> { + ziel.setRuestung(0.5); // Spezialfähigkeit eines Ritters. Rüstung halbieren. + System.out.println("\nRüstung von " + ziel.getName() + " heruntergesetzt.\n"); //Debug */ + }); + } + + @Override + public String getAbkuerzung() { + return ABKUERZUNG; + } + +} diff --git a/Musterlösung/src/domain/Wesen/Monster/Kobold.java b/Musterlösung/src/domain/Wesen/Monster/Kobold.java new file mode 100644 index 0000000..183426d --- /dev/null +++ b/Musterlösung/src/domain/Wesen/Monster/Kobold.java @@ -0,0 +1,30 @@ +package domain.Wesen.Monster; + +import domain.LagerPlaetze; +import domain.Wesen.Wesen; + +public class Kobold extends Wesen{ + + public static final String ABKUERZUNG = "K"; + private static int anzahlKobolde = 0; + + + public Kobold() { + super( "Kobold " + ++anzahlKobolde, + LagerPlaetze.KOBOLD.getLagerPlatz(), + 200, + 0.2, + 50, + 0.4); + setSpezialEffekt((ziel) -> { + setTrefferpunkte(2); //Spezialfähigkeit eines Kobolds. Leben verdoppeln. + System.out.println("\nLeben von " + getName() + " verdoppelt.\n"); //Debug */ + }); + } + + @Override + public String getAbkuerzung() { + return ABKUERZUNG; + } + +} diff --git a/Musterlösung/src/domain/Wesen/Wesen.java b/Musterlösung/src/domain/Wesen/Wesen.java new file mode 100644 index 0000000..6d4d614 --- /dev/null +++ b/Musterlösung/src/domain/Wesen/Wesen.java @@ -0,0 +1,90 @@ +package domain.Wesen; + +import domain.SpezialEffekt; + +abstract public class Wesen implements Comparable{ + + private final int LAGERPLATZ; + private String name; + private double trefferpunkte; + private double ruestung; + private int angriffspunkte; + private double ausweichwahrscheinlichkeit; + private SpezialEffekt spezialEffekt = null; + private boolean spezialeffektVerbraucht = false; + + protected Wesen (String name, int lagerPlatz, double trefferpunkte, double ruestung, int angriffspunkte, double ausweichwahrscheinlichkeit) { + this.name = name; + this.LAGERPLATZ = lagerPlatz; + this.trefferpunkte = trefferpunkte; + this.ruestung = ruestung; + this.angriffspunkte = angriffspunkte; + this.ausweichwahrscheinlichkeit = ausweichwahrscheinlichkeit; + } + + public void angreifen(Wesen ziel) { + double schaden = angriffspunkte; + ziel.verteidigen(this, schaden); + } + + public void verteidigen(Wesen angreifer, double schadensPunkte) { + if (Math.random() < ausweichwahrscheinlichkeit) { + return; + } + double erlittenerSchaden = schadensPunkte * (1 - ruestung); + trefferpunkte -= erlittenerSchaden; + if (trefferpunkte < 0) { + trefferpunkte = 0; + } + } + + public void ausloesenSpezial(Wesen ziel) { + if (spezialEffekt != null && !spezialeffektVerbraucht) { + spezialEffekt.apply(ziel); + spezialeffektVerbraucht = true; + } + } + + public int getLagerPlatz() { + return LAGERPLATZ; + } + + public String toString() { + String spezialeffektstatus = hasSpezialEffekt() ? "Ja" : "Nein"; + return name + ", TP: " + trefferpunkte + ", Spezialeffekt aktiv?: " + spezialeffektstatus; + } + + @Override + public int compareTo(Wesen other) { + return (int) ((int) other.getTrefferpunkte() - this.trefferpunkte); + } + + public double getTrefferpunkte() { + return trefferpunkte; + } + + public void setRuestung(double faktor) { + ruestung = ruestung * faktor; + } + + public void setTrefferpunkte(double faktor) { + trefferpunkte = trefferpunkte * faktor; + } + + public String getName(){ + return name; + } + + abstract public String getAbkuerzung(); + + protected void setSpezialEffekt(SpezialEffekt effekt) { + spezialEffekt = effekt; + } + + public boolean hasSpezialEffekt() { + return spezialEffekt != null && !spezialeffektVerbraucht; + } + + + +} \ No newline at end of file diff --git a/Musterlösung/src/domain/Wesen/WesenFactory.java b/Musterlösung/src/domain/Wesen/WesenFactory.java new file mode 100644 index 0000000..2c4184b --- /dev/null +++ b/Musterlösung/src/domain/Wesen/WesenFactory.java @@ -0,0 +1,27 @@ +package domain.Wesen; + +import domain.Wesen.Menschen.Ritter; +import domain.Wesen.Monster.Kobold; + +public class WesenFactory { + + private static WesenFactory instance; + + private WesenFactory() {} + + public static WesenFactory getInstance() { + if (instance == null) { + instance = new WesenFactory(); + } + return instance; + } + + public Wesen createRitter() { + return new Ritter(); + } + + public Wesen createKobold() { + return new Kobold(); + } +} + diff --git a/Musterlösung/src/exceptions/WesenExistiertNichtException.java b/Musterlösung/src/exceptions/WesenExistiertNichtException.java new file mode 100644 index 0000000..c812863 --- /dev/null +++ b/Musterlösung/src/exceptions/WesenExistiertNichtException.java @@ -0,0 +1,20 @@ +package exceptions; + +public class WesenExistiertNichtException extends RuntimeException { + + public WesenExistiertNichtException() { + super("Das angegebene Wesen existiert nicht."); + } + + public WesenExistiertNichtException(String message) { + super(message); + } + + public WesenExistiertNichtException(String message, Throwable cause) { + super(message, cause); + } + + public WesenExistiertNichtException(Throwable cause) { + super(cause); + } +} diff --git a/Musterlösung/src/facade/Teamkampf.java b/Musterlösung/src/facade/Teamkampf.java new file mode 100644 index 0000000..c238776 --- /dev/null +++ b/Musterlösung/src/facade/Teamkampf.java @@ -0,0 +1,156 @@ +package facade; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import domain.LagerPlaetze; +import domain.Team; +import domain.Wesen.Wesen; +import domain.Wesen.Menschen.Ritter; +import domain.Wesen.Monster.Kobold; +import exceptions.WesenExistiertNichtException; + +public class Teamkampf { + + List teams = new ArrayList<>(); + private int teamAmZugIndex = 0; + private Team gewinnerTeam = null; + public static final int MAXIMALLAGERPLATZ = 50; // gilt für alle Teams + public static final double SPEZIALFFAEHIGKEITAUSLOESEWAHRSCHEINLICHKEIT = 0.1; + + public void erstelleTeam(String teamName) { + teams.add(new Team(teamName)); + } + + public void triggerRound() { + Random random = new Random(); + + //Bestimmung Angreiferteam + Team angreiferTeam = teams.get(teamAmZugIndex % teams.size()); + while (checkGanzesTeamTot(angreiferTeam)) { + teamAmZugIndex++; + angreiferTeam = teams.get(teamAmZugIndex % teams.size()); + } + + //Bestimmung angreiferWesen + Wesen angreiferWesen = getRandomLebendesWesen(angreiferTeam, random); + + // Bestimmung Verteidigerteam (Nicht Tot, Nicht angreiferteam) + Team verteidigerTeam; + do { + int aktuell = teams.indexOf(angreiferTeam); + int offset = random.nextInt(teams.size() - 1) + 1; + int andererIndex = (aktuell + offset) % teams.size(); + verteidigerTeam = teams.get(andererIndex); + } while (checkGanzesTeamTot(verteidigerTeam)); + + //Bestimmung des verteidigerwesens + Wesen verteidigerWesen = getRandomLebendesWesen(verteidigerTeam, random); + + if (Math.random() < SPEZIALFFAEHIGKEITAUSLOESEWAHRSCHEINLICHKEIT) { + angreiferWesen.ausloesenSpezial(verteidigerWesen); + } + + angreiferWesen.angreifen(verteidigerWesen); + + teamAmZugIndex++; + + } + + public boolean checkGewinner() { + gewinnerTeam = null; + Team kandidat = null; + + for (Team team : teams) { + boolean ganzesTeamTot = checkGanzesTeamTot(team); + + if (!ganzesTeamTot) { + if (kandidat != null) { + return false; + } + kandidat = team; + } + } + + // Wenn es nur ein Gewinner Team gibt wird dieses gespeichert + if (kandidat != null) { + gewinnerTeam = kandidat; + return true; + } + + return false; + } + + private boolean checkGanzesTeamTot(Team team){ + for (Wesen wesen : team.getMitglieder()) { + if (wesen.getTrefferpunkte() > 0) { + return false; + } + } + return true; + + } + + private Wesen getRandomLebendesWesen(Team team, Random random) { + Wesen wesen; + do { + int index = random.nextInt(team.getMitglieder().size()); + wesen = team.getMitglieder().get(index); + } while (wesen.getTrefferpunkte() <= 0); + return wesen; + } + + public String gewinnerToString(){ + return gewinnerTeam.toString(); + } + + //returnt false wenn das Lager voll ist. Sonst true + public boolean addWesenToTeam(String teamName, String wesen) throws WesenExistiertNichtException{ + int zusaetzlicherLagerplatz = getLagerPlatzVonWesen(wesen); + + if(getDerzeitigerLagerPlatzVonTeam(teamName) + zusaetzlicherLagerplatz <= MAXIMALLAGERPLATZ) { + getTeam(teamName).addWesen(wesen); + return true; + } else { + return false; + } + } + + public int getDerzeitigerLagerPlatzVonTeam(String teamName){ + return getTeam(teamName).getDerzeitigerLagerPlatz(); + } + + // Achtung Nullpointer + private Team getTeam(String teamName) { + Team gefunden = null; + for (Team t : teams) { + if(t.getTeamName().equals(teamName)) { + gefunden = t; + break; + } + } + return gefunden; + } + + public int getLagerPlatzVonWesen (String wesen) throws WesenExistiertNichtException{ + switch (wesen) { + case (Ritter.ABKUERZUNG): + return LagerPlaetze.RITTER.getLagerPlatz(); + case (Kobold.ABKUERZUNG): + return LagerPlaetze.KOBOLD.getLagerPlatz(); + default: + throw new WesenExistiertNichtException(); + } + } + + public String teamsToString() { + String teamsString = ""; + for(Team t: teams){ + teamsString += t.toString() + "\n"; + } + return teamsString; + } + + +} diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..870499a Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/UI/Main.java b/src/UI/Main.java new file mode 100644 index 0000000..7ba44a5 --- /dev/null +++ b/src/UI/Main.java @@ -0,0 +1,15 @@ +package UI; + +import java.util.Scanner; + +public class Main { + + static Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + UI ui = new UI(); + + /* ? */ + } + +} diff --git a/src/UI/UI.java b/src/UI/UI.java new file mode 100644 index 0000000..2ac6ee3 --- /dev/null +++ b/src/UI/UI.java @@ -0,0 +1,96 @@ +package UI; + +import exceptions.WesenExistiertNichtException; +import facade.Teamkampf; + +public class UI { + + private Teamkampf teamkampfSpiel; + private boolean siegbedingung = false; + private static final int SIMULATIONSGESCHWINDIGKEIT = 500; + private int defaultAnzahlTeams = 2; + + + public UI() { + teamkampfSpiel = new Teamkampf(); + + System.out.printf("\n\nWillkommen bei Teamkampf!\n\nBitte Vergrößern Sie das Terminal für ein besseres Spielerlebnis!\n\n"); + } + + public void run() { + + System.out.printf("Wieviele Teams möchten Sie simulieren? (Zahl > 1)\n"); + + int anzahlTeams = defaultAnzahlTeams; + boolean eingabeGueltig = false; + + while (!eingabeGueltig) { + /* ? "Nur eine Zahl >1 annehmen ohne das Programm Terminiert / Exception wirft" + * In anzahlTeams speichern + */ + } + + for(int i = 1; i <= anzahlTeams; i++) { + String teamName = "Team " + i; + teamkampfSpiel.erstelleTeam(teamName);//Der Einfachheit halber alle Teams durchnummerieren + + while(true) { + System.out.printf("\n\n\n\n\nWelches Mitglied möchten Sie %s hinzufügen? Sie haben Maximal %d Lagerplatz für ihre Truppen!", teamName, Teamkampf.MAXIMALLAGERPLATZ); + System.out.printf("\nDrücken Sie \"W\" um die Teammitglieder für das nächste Team auszuwählen bzw. mit der Simulation zu beginnen!\n\n"); + System.out.printf("Auswahl:\nKobold: K, %d Lagerplatz\nRitter: R, %d Lagerplatz\n", teamkampfSpiel.getLagerPlatzVonWesen("K"), teamkampfSpiel.getLagerPlatzVonWesen("R")); //Hier neue Wesen zur UI hinzufügen + + String neuesMitglied = Main.scanner.nextLine().toUpperCase(); + + try { + if (neuesMitglied.equals("W")) { + break; + } + else if (!teamkampfSpiel.addWesenToTeam(teamName, neuesMitglied)) { + System.out.printf("\nDas hat nicht geklappt! Dieses Teammitglied braucht zu viel Platz!"); + } + } catch (WesenExistiertNichtException e) { + System.out.printf("\nDas hat nicht geklappt! Das ausgewählte Wesen existiert nicht!"); + continue; + } + + System.out.printf("\n\n\nIhre Truppen brauchen momentan %d Lagerplatz!", teamkampfSpiel.getDerzeitigerLagerPlatzVonTeam(teamName)); + + } + + } + + System.out.printf("\n\n\n\nDie Teams:\n\n"); + System.out.printf(teamkampfSpiel.teamsToString() + "\n\n"); + + System.out.printf("Beliebige Taste, dann ENTER drücken um die Simulation zu starten."); + Main.scanner.next().toUpperCase(); + System.out.printf("\n\n\n"); + + + int runde = 1; + while(!siegbedingung) { + System.out.printf("\n\nRunde %d\n\n", runde); + + teamkampfSpiel.triggerRound(); + + System.out.printf(teamkampfSpiel.teamsToString() + "\n\n"); + + try { + Thread.sleep(SIMULATIONSGESCHWINDIGKEIT); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if(teamkampfSpiel.checkGewinner()){ + System.out.printf("\n\n\n\nHerlichen Glückwunsch!\n\n"); + System.out.printf("Der Sieger ist: " + teamkampfSpiel.teamsToString() + "\n\n"); + + teamkampfSpiel.gewinnerToString(); + siegbedingung = true; + } + runde++; + } + } + +} diff --git a/src/domain/LagerPlaetze.java b/src/domain/LagerPlaetze.java new file mode 100644 index 0000000..190585d --- /dev/null +++ b/src/domain/LagerPlaetze.java @@ -0,0 +1,11 @@ +package domain; + +public enum LagerPlaetze { + + KOBOLD(10), + RITTER(5); + + /* ? "Enum vervollständigen" + * 1. Konstruktor hinzufügen für eine variable "lagerPlatz" + */ +} diff --git a/src/domain/SpezialEffekt.java b/src/domain/SpezialEffekt.java new file mode 100644 index 0000000..a278972 --- /dev/null +++ b/src/domain/SpezialEffekt.java @@ -0,0 +1,9 @@ +package domain; + +import domain.Wesen.Wesen; + +@FunctionalInterface +public interface SpezialEffekt { + void apply(Wesen ziel); // Wesen ist das Ziel des Effekts +} + diff --git a/src/domain/Team.java b/src/domain/Team.java new file mode 100644 index 0000000..56c501b --- /dev/null +++ b/src/domain/Team.java @@ -0,0 +1,58 @@ +package domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import domain.Wesen.Wesen; +import domain.Wesen.WesenFactory; + +public class Team{ + + private final String TEAMNAME; + private List mitglieder = new ArrayList<>(); + + public Team (String teamName) { + TEAMNAME = teamName; + } + + public void addWesen(String wesen) { + switch(wesen) { + case "K": + mitglieder.add(/* ? "Kobold adden" */); + break; + case "R": + mitglieder.add(/* ? "Ritter adden" */); + break; + default: + /* ? "exception" */ + } + } + + public int getDerzeitigerLagerPlatz() { + int derzeitigerLagerplatz = 0; + for(Wesen w : mitglieder) { + derzeitigerLagerplatz += w.getLagerPlatz(); + } + return derzeitigerLagerplatz; + } + + public String getTeamName() { + return TEAMNAME; + } + + public List getMitglieder(){ + return mitglieder; + } + + //Returnt die Statistiken über das Team + public String toString() { + Collections.sort(mitglieder); + String mitgliederString = getTeamName() + "\n"; + for(Wesen w: mitglieder){ + mitgliederString += w.toString() + "\n"; + } + return mitgliederString; + } + +} diff --git a/src/domain/Wesen/Menschen/Ritter.java b/src/domain/Wesen/Menschen/Ritter.java new file mode 100644 index 0000000..dbaeabb --- /dev/null +++ b/src/domain/Wesen/Menschen/Ritter.java @@ -0,0 +1,21 @@ +package domain.Wesen.Menschen; + +import domain.LagerPlaetze; +import domain.Wesen.Wesen; + +public class Ritter{ + + public static final String ABKUERZUNG = "R"; + private static int anzahlRitter = 0; + + public Ritter() { + super( "Ritter " + ++anzahlRitter, + LagerPlaetze.RITTER.getLagerPlatz(), + 1000, + 0.4, + 120, + 0); + setSpezialEffekt((ziel) -> { /* ? "Spezialeffekt" */}); + } + +} diff --git a/src/domain/Wesen/Monster/Kobold.java b/src/domain/Wesen/Monster/Kobold.java new file mode 100644 index 0000000..0930f55 --- /dev/null +++ b/src/domain/Wesen/Monster/Kobold.java @@ -0,0 +1,22 @@ +package domain.Wesen.Monster; + +import domain.LagerPlaetze; +import domain.Wesen.Wesen; + +public class Kobold { + + public static final String ABKUERZUNG = "K"; + private static int anzahlKobolde = 0; + + + public Kobold() { + super( "Kobold " + ++anzahlKobolde, + LagerPlaetze.KOBOLD.getLagerPlatz(), + 200, + 0.2, + 50, + 0.4); + setSpezialEffekt((ziel) -> {/* ? "SpezialEffekt" */}); + } + +} diff --git a/src/domain/Wesen/Wesen.java b/src/domain/Wesen/Wesen.java new file mode 100644 index 0000000..d898ccf --- /dev/null +++ b/src/domain/Wesen/Wesen.java @@ -0,0 +1,78 @@ +package domain.Wesen; + +import domain.SpezialEffekt; + +abstract public class Wesen /* ? "comparable*/{ + + private final int LAGERPLATZ; + private String name; + private double trefferpunkte; + private double ruestung; + private int angriffspunkte; + private double ausweichwahrscheinlichkeit; + private SpezialEffekt spezialEffekt = null; + private boolean spezialeffektVerbraucht = false; + + protected Wesen (String name, int lagerPlatz, double trefferpunkte, double ruestung, int angriffspunkte, double ausweichwahrscheinlichkeit) { + this.name = name; + this.LAGERPLATZ = lagerPlatz; + this.trefferpunkte = trefferpunkte; + this.ruestung = ruestung; + this.angriffspunkte = angriffspunkte; + this.ausweichwahrscheinlichkeit = ausweichwahrscheinlichkeit; + } + + public void angreifen(Wesen ziel) { + double schaden = angriffspunkte; + ziel.verteidigen(this, schaden); + } + + public void verteidigen(Wesen angreifer, double schadensPunkte) { + if (Math.random() < ausweichwahrscheinlichkeit) { + return; + } + double erlittenerSchaden = schadensPunkte * (1 - ruestung); + trefferpunkte -= erlittenerSchaden; + if (trefferpunkte < 0) { + trefferpunkte = 0; + } + } + + public void ausloesenSpezial(Wesen ziel) { + if (spezialEffekt != null && !spezialeffektVerbraucht) { + /* ? "Spezialeffekt aufs Ziel auslösen Logik VOLLSTÄNDIG ergänzen" */ + } + } + + public int getLagerPlatz() { + /* ? "Methodenlogik Implementieren" */ + } + + public String toString() { + String spezialeffektstatus = hasSpezialEffekt() ? "Ja" : "Nein"; + return name + ", TP: " + trefferpunkte + ", Spezialeffekt aktiv?: " + spezialeffektstatus; + } + + public double getTrefferpunkte() { + return trefferpunkte; + } + + public String getName(){ + return name; + } + + /* ? "Methoden fehlen?" */ + + abstract public String getAbkuerzung(); + + protected void setSpezialEffekt(SpezialEffekt effekt) { + spezialEffekt = effekt; + } + + public boolean hasSpezialEffekt() { + /* ? "Methodenlogik Implementieren" */ + } + + + +} \ No newline at end of file diff --git a/src/domain/Wesen/WesenFactory.java b/src/domain/Wesen/WesenFactory.java new file mode 100644 index 0000000..0edc01b --- /dev/null +++ b/src/domain/Wesen/WesenFactory.java @@ -0,0 +1,10 @@ +package domain.Wesen; + +public class WesenFactory { + + /* ? "Singleton Factory" + * 1. WesenFactory zu einem Singleton machen + * 2. Factory getter methoden für Ritter und Kobolde + */ +} + diff --git a/src/facade/Teamkampf.java b/src/facade/Teamkampf.java new file mode 100644 index 0000000..2bc068d --- /dev/null +++ b/src/facade/Teamkampf.java @@ -0,0 +1,117 @@ +package facade; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import domain.LagerPlaetze; +import domain.Team; +import domain.Wesen.Wesen; +import domain.Wesen.Menschen.Ritter; +import domain.Wesen.Monster.Kobold; + +public class Teamkampf { + + List teams = new ArrayList<>(); + private Team gewinnerTeam = null; + public static final int MAXIMALLAGERPLATZ = 50; // gilt für alle Teams + public static final double SPEZIALFFAEHIGKEITAUSLOESEWAHRSCHEINLICHKEIT = 0.1; + + public void erstelleTeam(String teamName) { + /* ? "team erstellen" */ + } + + public void triggerRound() { + /* ? "Spiellogik" */ + /* + * 1. Angreiferteam ermitteln (Teamlist eins nach dem anderen durchgehen pro triggerRound() aufruf) + * 2. Angreiferwesen ermitteln (zufall) + * 3. Verteidigerteam ermitteln (zufall) + * 4. Verteidigerwesen ermitteln (zufall) + * VORSICHT ausgewählte teams / wesen dürfen nicht tot sein. + * + * 5. Mit 10% wahrscheinlichkeit wird die spezialfähigkeit vom angreiferwesen auf verteidgerwesen ausgelöst + * 6. Angreiferwesen greift verteidgerwesen an + */ + + } + + public boolean checkGewinner() { + /* ? "checkgewinner Logik implementieren" + * 1. Gibt true zurück wenn nurnoch ein Team Lebendige mitglieder hat sonst false + * 2. Falls 1. true ist, setzt die globale-variable "gewinnerTeam" auf das verbleibende team. Sonst nicht. + */ + } + + private boolean checkGanzesTeamTot(Team team){ + for (Wesen wesen : team.getMitglieder()) { + if (wesen.getTrefferpunkte() > 0) { + return false; + } + } + return true; + + } + + private Wesen getRandomLebendesWesen(Team team, Random random) { + Wesen wesen; + do { + int index = random.nextInt(team.getMitglieder().size()); + wesen = team.getMitglieder().get(index); + } while (wesen.getTrefferpunkte() <= 0); + return wesen; + } + + public String gewinnerToString(){ + return gewinnerTeam.toString(); + } + + //returnt false wenn das Lager voll ist. Sonst true + public boolean addWesenToTeam(String teamName, String wesen) /* ? "Throws" */ { + int zusaetzlicherLagerplatz = getLagerPlatzVonWesen(wesen); + + if(getDerzeitigerLagerPlatzVonTeam(teamName) + zusaetzlicherLagerplatz <= MAXIMALLAGERPLATZ) { + getTeam(teamName).addWesen(wesen); + return true; + } else { + return false; + } + } + + public int getDerzeitigerLagerPlatzVonTeam(String teamName){ + return getTeam(teamName).getDerzeitigerLagerPlatz(); + } + + // Achtung Nullpointer + private Team getTeam(String teamName) { + Team gefunden = null; + for (Team t : teams) { + if(t.getTeamName().equals(teamName)) { + gefunden = t; + break; + } + } + return gefunden; + } + + public int getLagerPlatzVonWesen (String wesen) /* ? "Throws" */{ + switch (wesen) { + case (Ritter.ABKUERZUNG): + return LagerPlaetze.RITTER.getLagerPlatz(); + case (Kobold.ABKUERZUNG): + return LagerPlaetze.KOBOLD.getLagerPlatz(); + default: + /* ? "exception" */ + } + } + + public String teamsToString() { + String teamsString = ""; + for(Team t: teams){ + teamsString += t.toString() + "\n"; + } + return teamsString; + } + + +}