2023-10-05 23:32:29 +02:00
|
|
|
/*
|
|
|
|
============================================================
|
|
|
|
This is the "Spiel" file from Author: Philipp Kotte
|
|
|
|
written on: 05 / 10 / 2023 at: 23:25
|
|
|
|
============================================================
|
|
|
|
*/
|
|
|
|
package Facade;
|
|
|
|
|
2023-10-10 17:44:25 +02:00
|
|
|
import java.io.Serializable;
|
2023-10-26 17:22:29 +02:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Collection;
|
2023-10-10 12:38:27 +02:00
|
|
|
import java.util.HashMap;
|
2023-10-26 17:22:29 +02:00
|
|
|
import java.util.Scanner;
|
2023-10-10 12:38:27 +02:00
|
|
|
|
2023-10-11 11:06:39 +02:00
|
|
|
import Domain.Kartenstapel;
|
2023-10-10 12:38:27 +02:00
|
|
|
import Domain.Spieler;
|
2023-10-12 08:51:24 +02:00
|
|
|
import Domain.Stich;
|
2023-10-11 11:06:39 +02:00
|
|
|
import Domain.Block.Block;
|
2023-10-10 12:38:27 +02:00
|
|
|
import Domain.Enums.Geschlecht;
|
2023-10-26 17:22:29 +02:00
|
|
|
import Domain.Enums.Kartenfarbe;
|
2023-10-19 16:44:03 +02:00
|
|
|
import Domain.Exceptions.EmptyListException;
|
2023-10-26 17:22:29 +02:00
|
|
|
import Domain.Exceptions.MagierTrumpfException;
|
|
|
|
import Domain.Exceptions.NarrenTrumpfException;
|
2023-10-19 16:44:03 +02:00
|
|
|
import Domain.Exceptions.SpielerNotFoundException;
|
2023-10-12 08:51:24 +02:00
|
|
|
import Domain.Karten.Karte;
|
2023-10-26 17:22:29 +02:00
|
|
|
import Domain.Karten.Magierkarte;
|
|
|
|
import Domain.Karten.Narrenkarte;
|
|
|
|
import Domain.Karten.Zahlenkarte;
|
2023-10-10 12:38:27 +02:00
|
|
|
|
2023-10-10 17:44:25 +02:00
|
|
|
public class Spiel implements Serializable {
|
2023-10-05 23:32:29 +02:00
|
|
|
|
2023-10-11 11:04:46 +02:00
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
// statische Konstanten
|
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
|
2023-10-19 16:44:03 +02:00
|
|
|
private static final String ANSI_RESET = "\u001B[0m";
|
|
|
|
private static final String ANSI_GREEN = "\u001B[32m";
|
|
|
|
private static final String ANSI_RED = "\u001B[31m";
|
|
|
|
public static final String ANSI_BLUE = "\u001B[34m";
|
|
|
|
|
2023-10-11 11:04:46 +02:00
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
// statische Attribute(zB. zähler)
|
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
|
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
// Attribute jedes Objektes
|
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
|
2023-10-10 12:38:27 +02:00
|
|
|
private boolean istGestartet;
|
|
|
|
private boolean istBeendet;
|
|
|
|
private Spieler spielerAmZug;
|
|
|
|
private int runde;
|
2023-10-26 17:22:29 +02:00
|
|
|
private ArrayList<Spieler> spieler = new ArrayList<>();
|
|
|
|
private ArrayList<Stich> stiche = new ArrayList<>();
|
2023-10-10 14:09:27 +02:00
|
|
|
private boolean[] id_check = { false, false, false, false, false, false };
|
2023-10-11 11:06:39 +02:00
|
|
|
private Kartenstapel kartenstapel;
|
|
|
|
private Block block;
|
2023-10-10 12:38:27 +02:00
|
|
|
|
2023-10-11 11:04:46 +02:00
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
// Konstruktoren (default und spezifische)
|
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
|
2023-10-10 12:38:27 +02:00
|
|
|
public Spiel() {
|
|
|
|
this.istGestartet = false;
|
|
|
|
this.istBeendet = false;
|
|
|
|
this.spielerAmZug = null;
|
2023-10-26 17:22:29 +02:00
|
|
|
this.runde = 1;
|
2023-10-20 08:52:29 +02:00
|
|
|
this.kartenstapel = new Kartenstapel();
|
2023-10-10 12:38:27 +02:00
|
|
|
};
|
2023-10-26 17:22:29 +02:00
|
|
|
/*--------------------------------------------------------
|
|
|
|
statische Methoden
|
|
|
|
--------------------------------------------------------*/
|
|
|
|
/*--------------------------------------------------------
|
|
|
|
Getter und Setter
|
|
|
|
--------------------------------------------------------*/
|
2023-10-11 11:04:46 +02:00
|
|
|
|
|
|
|
public void setSpielGestartet(boolean gestarted) {
|
|
|
|
this.istGestartet = gestarted;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setSpielBeendet(boolean beendet) {
|
|
|
|
this.istBeendet = beendet;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setRunde(int runde) {
|
|
|
|
this.runde = runde;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setSpielerAmZug(Spieler spieler) {
|
|
|
|
this.spielerAmZug = spieler;
|
|
|
|
}
|
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
/*--------------------------------------------------------
|
|
|
|
@Overrides
|
|
|
|
--------------------------------------------------------*/
|
2023-10-11 11:04:46 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
2023-10-14 19:15:04 +02:00
|
|
|
String text = "\n";
|
|
|
|
String header = "Systemausgabe--------------------------------\n";
|
|
|
|
String footer = "---------------------------------------------\n";
|
|
|
|
text += header;
|
|
|
|
text += "Runde: " + getRunde() + "\n";
|
|
|
|
text += "Gestartet : " + (istSpielGestartet() ? "Ja " : "Nein ") + "\n";
|
|
|
|
text += "Beendet: " + (istSpielBeendet() ? "Ja" : "Nein") + "\n";
|
|
|
|
text += "Spieler am Zug: "
|
|
|
|
+ (this.spielerAmZug == null ? "Noch keine Spieler vorhanden" : this.spielerAmZug.getName()) + "\n";
|
|
|
|
if (this.spieler.size() == 0) {
|
|
|
|
text += "Noch keine Spieler vorhanden \n";
|
|
|
|
} else {
|
2023-10-26 17:22:29 +02:00
|
|
|
for (Spieler s : this.spieler) {
|
2023-10-19 16:44:03 +02:00
|
|
|
text += "[" + s.getId() + "] " + s.getName() + " ("
|
|
|
|
+ s.getGeschlecht() + ")" + "\n";
|
|
|
|
|
2023-10-14 19:15:04 +02:00
|
|
|
}
|
|
|
|
}
|
2023-10-19 16:44:03 +02:00
|
|
|
for (int i = 0; i < this.id_check.length; i++) {
|
|
|
|
if (this.id_check[i]) {
|
|
|
|
text += "idcheck" + ANSI_BLUE + " [" + i + "] " + ANSI_GREEN + this.id_check[i] + ANSI_RESET + " \n";
|
|
|
|
} else {
|
|
|
|
text += "idcheck" + ANSI_BLUE + " [" + i + "] " + ANSI_RED + this.id_check[i] + ANSI_RESET + " \n";
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2023-10-14 19:15:04 +02:00
|
|
|
text += footer;
|
|
|
|
return text;
|
2023-10-11 11:04:46 +02:00
|
|
|
}
|
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
/*--------------------------------------------------------
|
|
|
|
öffentliche Methodes
|
|
|
|
--------------------------------------------------------*/
|
2023-10-10 12:38:27 +02:00
|
|
|
|
|
|
|
public void addSpieler(String name, Geschlecht geschlecht) {
|
2023-10-10 14:09:27 +02:00
|
|
|
int id = 1;
|
|
|
|
while (id_check[id - 1]) {
|
|
|
|
id++;
|
|
|
|
}
|
2023-10-14 19:15:04 +02:00
|
|
|
id_check[id - 1] = true;
|
2023-10-10 14:09:27 +02:00
|
|
|
Spieler temp = new Spieler(id, name, geschlecht);
|
2023-10-26 17:22:29 +02:00
|
|
|
this.spieler.add(temp);
|
2023-10-19 16:44:03 +02:00
|
|
|
updateSpielerAmZug();
|
2023-10-10 14:09:27 +02:00
|
|
|
}
|
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
public void removeSpieler(int index) throws SpielerNotFoundException, EmptyListException, RuntimeException {
|
|
|
|
if (this.spieler.size() >= index) {
|
|
|
|
this.spieler.remove(index);
|
|
|
|
this.id_check[index - 1] = false;
|
|
|
|
} else if (this.spieler.size() < index) {
|
2023-10-19 16:44:03 +02:00
|
|
|
throw new SpielerNotFoundException("Dieser Spieler existiert nicht");
|
2023-10-26 17:22:29 +02:00
|
|
|
} else if (this.spieler.size() == 0) {
|
2023-10-19 16:44:03 +02:00
|
|
|
throw new EmptyListException("Dise Liste ist Leer.");
|
|
|
|
} else {
|
|
|
|
throw new RuntimeException("Unkown Error");
|
|
|
|
}
|
|
|
|
updateSpielerAmZug();
|
2023-10-10 14:09:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public String[] getAlleSpieler() {
|
2023-10-10 15:22:09 +02:00
|
|
|
String[] spieler_text = new String[this.spieler.size()];
|
2023-10-19 16:44:03 +02:00
|
|
|
int zähler = 0;
|
2023-10-26 17:22:29 +02:00
|
|
|
for (Spieler s : this.spieler) {
|
2023-10-19 16:44:03 +02:00
|
|
|
spieler_text[zähler] = s.toString();
|
|
|
|
zähler++;
|
2023-10-10 14:09:27 +02:00
|
|
|
}
|
2023-10-10 15:22:09 +02:00
|
|
|
return spieler_text;
|
2023-10-10 12:38:27 +02:00
|
|
|
}
|
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
public void starteSpiel() throws MagierTrumpfException, NarrenTrumpfException {
|
2023-10-12 08:51:24 +02:00
|
|
|
// sing genügend Spieler angelegt?
|
|
|
|
if (this.spieler.size() >= 3 && this.spieler.size() <= 6) {
|
|
|
|
this.istGestartet = true;
|
2023-10-26 17:22:29 +02:00
|
|
|
erstelleStiche(this.runde);
|
|
|
|
austeilen();
|
|
|
|
// Karte k = this.kartenstapel.getObersteKarte();
|
|
|
|
Karte k = new Magierkarte(0);
|
|
|
|
if (k instanceof Magierkarte) {
|
|
|
|
throw new MagierTrumpfException("Es wurde ein Magier als Trumpf gezogen");
|
|
|
|
} else if (k instanceof Narrenkarte) {
|
|
|
|
setTrumpf(null);
|
|
|
|
throw new NarrenTrumpfException("Es wurde ein Narr als Trumpf gezogen");
|
|
|
|
} else {
|
|
|
|
Zahlenkarte zk = (Zahlenkarte) k;
|
|
|
|
setTrumpf(zk.getFarbe());
|
|
|
|
}
|
|
|
|
// While loop mit der länge der anzahl Stiche für die jeweilige Runde
|
2023-10-20 08:52:29 +02:00
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
// Für jeden Durchgang des Loops wird der Stich ermittelt
|
2023-10-20 08:52:29 +02:00
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
// Wer gewonnen hat wird dann der Stich zugeordnet
|
2023-10-20 08:52:29 +02:00
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
// prüfen ob das Spiel zuende ist
|
2023-10-20 08:52:29 +02:00
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
// Der Spieler der jetzt am Zug ist, ist der der den letzten Stich gewonne hat
|
2023-10-20 08:52:29 +02:00
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
// Runde erhöhen
|
2023-10-20 08:52:29 +02:00
|
|
|
|
2023-10-25 11:57:48 +02:00
|
|
|
} else {
|
|
|
|
System.out.println("Es fehlen " + (3 - this.spieler.size()) + " spieler");
|
|
|
|
}
|
2023-10-20 08:52:29 +02:00
|
|
|
|
2023-10-10 14:16:24 +02:00
|
|
|
}
|
2023-10-10 14:09:27 +02:00
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
/**
|
|
|
|
* Gibt den Spieler zurück, der am Zug ist.
|
|
|
|
*
|
|
|
|
* @return String[] -> name, id, geschlecht, vorhersage
|
|
|
|
*/
|
2023-10-10 15:30:47 +02:00
|
|
|
public String[] getSpielerAmZug() {
|
2023-10-26 17:22:29 +02:00
|
|
|
Spieler s = this.spielerAmZug;
|
|
|
|
String[] temp = { s.getName(), "" + s.getId(), s.getGeschlecht().toString(), "" + s.getVorhersage() };
|
|
|
|
return temp;
|
2023-10-10 15:30:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public boolean istSpielGestartet() {
|
|
|
|
return this.istGestartet;
|
|
|
|
}
|
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
public void setTrumpf(Kartenfarbe kf) {
|
|
|
|
Stich s = (Stich) this.stiche.get(0);
|
|
|
|
s.setTurmpfFarbe(kf);
|
|
|
|
}
|
|
|
|
|
2023-10-10 15:30:47 +02:00
|
|
|
public boolean istSpielBeendet() {
|
|
|
|
return this.istBeendet;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String[][] getBlock() {
|
|
|
|
return new String[0][0];
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getGewinner() {
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getRunde() {
|
|
|
|
return this.runde;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void austeilen() {
|
2023-10-26 17:22:29 +02:00
|
|
|
this.kartenstapel.mischen();
|
|
|
|
for (int i = 0; i < this.runde; i++) {
|
|
|
|
for (Spieler s : this.spieler) {
|
|
|
|
Karte k = this.kartenstapel.getObersteKarte();
|
|
|
|
if (k instanceof Magierkarte) {
|
|
|
|
s.addKarte(((Magierkarte) k));
|
|
|
|
} else if (k instanceof Zahlenkarte) {
|
|
|
|
s.addKarte(((Zahlenkarte) k));
|
|
|
|
} else {
|
|
|
|
s.addKarte((Narrenkarte) k);
|
|
|
|
}
|
2023-10-10 15:30:47 +02:00
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
}
|
|
|
|
}
|
2023-10-12 08:51:24 +02:00
|
|
|
|
2023-10-10 15:30:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void ausspielen(int idKarte) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public void vorhersagen(int stiche) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-10-11 11:04:46 +02:00
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
// Hilfsmethoden (privat)
|
|
|
|
/*--------------------------------------------------------*/
|
|
|
|
|
2023-10-25 11:57:48 +02:00
|
|
|
private void erstelleStiche(int runde) {
|
|
|
|
for (int i = 0; i < runde; i++) {
|
2023-10-26 17:22:29 +02:00
|
|
|
this.stiche.add(new Stich(this.spieler.size()));
|
2023-10-25 11:57:48 +02:00
|
|
|
}
|
2023-10-12 08:51:24 +02:00
|
|
|
}
|
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
/*
|
|
|
|
* private void ermittleGewinner(Stich stich) {
|
|
|
|
* stich.getKarten();
|
|
|
|
* }
|
|
|
|
*/
|
2023-10-12 08:51:24 +02:00
|
|
|
|
2023-10-19 16:44:03 +02:00
|
|
|
private void updateSpielerAmZug() {
|
|
|
|
if (this.spieler.size() >= 1) {
|
2023-10-26 17:22:29 +02:00
|
|
|
this.spielerAmZug = this.spieler.get(0);
|
2023-10-20 08:52:29 +02:00
|
|
|
} else {
|
|
|
|
this.spielerAmZug = null;
|
2023-10-19 16:44:03 +02:00
|
|
|
}
|
2023-10-12 08:51:24 +02:00
|
|
|
}
|
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
private void updateSpielerList(Spieler gewinner) {
|
|
|
|
ArrayList<Spieler> temp = new ArrayList<>(this.spieler.size());
|
|
|
|
int start = 0;
|
|
|
|
for (int i = 0; i < this.spieler.size(); i++) {
|
|
|
|
if (this.spieler.get(i) == gewinner) {
|
|
|
|
start = i;
|
|
|
|
}
|
|
|
|
}
|
2023-10-26 17:23:03 +02:00
|
|
|
|
2023-10-26 17:22:29 +02:00
|
|
|
for (int i = start; i < this.spieler.size(); i++) {
|
|
|
|
temp.add(this.spieler.get(i));
|
|
|
|
}
|
|
|
|
for (int i = 0; i < start; i++) {
|
|
|
|
temp.add(this.spieler.get(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
this.spieler = temp;
|
|
|
|
this.spielerAmZug = temp.get(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|