Initial commit

main
janpfeifer 2025-04-16 00:16:42 +02:00
commit 05fad9676c
12 changed files with 557 additions and 0 deletions

BIN
Musterlösung/.DS_Store vendored 100644

Binary file not shown.

View File

@ -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();
}
}

View File

@ -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++;
}
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,9 @@
package domain;
import domain.Wesen.Wesen;
@FunctionalInterface
public interface SpezialEffekt {
void apply(Wesen ziel); // Wesen ist das Ziel des Effekts
}

View File

@ -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<Wesen> 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<Wesen> 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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,90 @@
package domain.Wesen;
import domain.SpezialEffekt;
abstract public class Wesen implements Comparable<Wesen>{
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;
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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<Team> 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;
}
}