diff --git a/src/RunGame.java b/src/RunGame.java new file mode 100644 index 0000000000000000000000000000000000000000..1fd1c82fde4cb809bd43faf2e152376bbe3b3403 --- /dev/null +++ b/src/RunGame.java @@ -0,0 +1,278 @@ + + +public class RunGame { + UnoDeck deck = new UnoDeck(); + Regelwerk regel = new Regelwerk(); + farbAuswahl farbAuswahl = new farbAuswahl(); + EndScreen Ende = new EndScreen(); + final Object lock = new Object(); + final Object locked = new Object(); + private int lenght = 0; + + + public void Start() { + + PlayerNamesInput Names = new PlayerNamesInput(locked); + + synchronized (locked) { + try { + locked.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + //Es wird so Lange gewartet bis die Eingabe der Spieler Namen abgeschlossen ist + + + lenght = Names.getgroesse(); + + if (lenght > 4) { + deck.befuellen(); + deck.befuellen(); + } else { + deck.befuellen(); + } + //Bei mehr als 4 Spilern sind 108 Karten zu wenig, deswegen werden die Karten verdoppelt (116 Karten)! + deck.mischeHand(); + regel.wunschFestlegen(); + + + String[] PlayerNames = new String[lenght]; + int i; + for (i = 0; i < lenght; i++) { + PlayerNames[i] = Names.getNames(i); + } + SpielerHand spielerhand = new SpielerHand(lenght, PlayerNames); + for (i = 0; i < lenght; i++) { + spielerhand.befuelleSpieleHand(i, deck, 7); + spielerhand.zeigeHaende(i); + } + regel.reihenfolgeFestlegen(lenght); + //Die Spieler Namen werden verarbeitet und jeder Spieler bekommt die Hand gefüllt + GameLoop(spielerhand); + } + + public void GameLoop(SpielerHand spielerHand) { + boolean win = false; + int zug = 1; + int legeKarte; + int spieler; + int reihen = 0; + UnoKarte aktuelleKarte = regel.ersteKarte(deck, zug, deck.hand.size()); + boolean geht = false; //Das boolean hilft bei der kontrolle ob die Karte legbar ist!!!! + + UnoSpielfeld spielFeld = new UnoSpielfeld(aktuelleKarte, spielerHand, regel,lock,lenght); + + while (!win) { + reihen = regel.reihenfolge(); + spielFeld.colorPlayer(reihen); + boolean start = false; + spielFeld.highZugStarten(); + while (start != true) { + start = spielFeld.getzugStarten(); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + //Die Schleife Wartet bis der Zug vom Spiler gestartet wird + + } + spielFeld.highZugStartenundo(); + spielFeld.KarteHinzufuegen(spielerHand,reihen); + spielFeld.aktuelleKarte(aktuelleKarte); + boolean kartelegen = false; + boolean karteziehen = false; + while ((kartelegen || karteziehen) != true) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + kartelegen = spielFeld.getkartelegen(); + karteziehen = spielFeld.getkarteziehen(); + //Diese Schleife wartet bis der Spieler sich zwischen Karte Legen und Karte Ziehen entschieden hat + } + if (kartelegen == true) { + UnoKarte neueKarte = spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).get(spielFeld.getKartenIndex()); + geht = true; + + //Entscheidet der Spieler sich für das legen der Karte wird wird die zu legende Karte entnommen + + if (geht == regel.karteLegbar(aktuelleKarte, neueKarte, deck, spielerHand,lenght)) { + spielerHand.entferneKarteHand(spielFeld.getSpielerIndex(), spielFeld.getKartenIndex()+1, deck, zug); + aktuelleKarte = neueKarte; + farbAuswahl.farbAuswahl(aktuelleKarte,regel,spielFeld); + geht = false; + + //Hier wird die Karte dann geprüft ob es möglich ist diese zu legen + + } else { + + //Ist es nicht möglich die Karte zu legen, läuft der Loop hier weiter + while (geht == true){ + kartelegen = false; + karteziehen = false; + while ((kartelegen || karteziehen) != true) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + kartelegen = spielFeld.getkartelegen(); + karteziehen = spielFeld.getkarteziehen(); + + //Diese Schleife prüft erneut ob der Spieler eine Karte Legen oder ziehen möchte + + } + if (kartelegen == true){ + neueKarte = spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).get(spielFeld.getKartenIndex()); + //Entscheidet der Spieler sich für das legen der Karte wird wird die zu legende Karte erneut entnommen + + if (geht == regel.karteLegbar(aktuelleKarte, neueKarte, deck, spielerHand,lenght)) { + spielerHand.entferneKarteHand(spielFeld.getSpielerIndex(), spielFeld.getKartenIndex()+1, deck, zug); + aktuelleKarte = neueKarte; + farbAuswahl.farbAuswahl(aktuelleKarte,regel,spielFeld); + geht = false; + + //Hier wird erneut geprüft ob die zu legende Karte legbar ist + } + }else if(karteziehen == true){ + spielerHand.befuelleSpieleHand(spielFeld.getSpielerIndex(), deck, 1); + spielFeld.changeKarteziehen(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).get(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size()-1)); + + // Entscheidet der Spieler sich für das zihen der Karte wird ihm eine Karte hinzugefügt + + synchronized (lock) { + try { + lock.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + while (geht == true) { + kartelegen = false; + karteziehen = false; + spielFeld.highLegen(); + spielFeld.highBehalten(); + while ((kartelegen || karteziehen) != true) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + kartelegen = spielFeld.getneuekartelegen(); + karteziehen = spielFeld.getneuekartebehalten(); + + //Hier wird entschieden ob der Spieler die neu gezogene Karte behalten möchte oder direkt legen möchte + } + spielFeld.highLegenundo(); + spielFeld.highBehaltenundo(); + if (karteziehen == true) { + spielFeld.changeKarteziehenundo(); + geht = false; + + //möchte der Spieler die Karte behalten passiert quasi nichts mehr + + } else if (kartelegen == true) { + neueKarte = spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).get(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size() - 1); + if (geht == regel.karteLegbar(aktuelleKarte, neueKarte, deck, spielerHand,lenght)) { + aktuelleKarte = neueKarte; + farbAuswahl.farbAuswahl(aktuelleKarte,regel,spielFeld); + spielerHand.entferneKarteHand(spielFeld.getSpielerIndex(), spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size(), deck, zug); + spielFeld.changeKarteziehenundo(); + + //Hier findet die Prüfung ob die Karte legbar ist statt + } + geht = false; + } + } + } + } + } + }else if (karteziehen == true){ + geht = true; + spielerHand.befuelleSpieleHand(spielFeld.getSpielerIndex(), deck, 1); + spielFeld.changeKarteziehen(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).get(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size()-1)); + synchronized (lock) { + try { + lock.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + while (geht == true) { + kartelegen = false; + karteziehen = false; + spielFeld.highBehalten(); + spielFeld.highLegen(); + while ((kartelegen || karteziehen) != true) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + kartelegen = spielFeld.getneuekartelegen(); + karteziehen = spielFeld.getneuekartebehalten(); + //Hier wird erneut entschieden ob der Spieler die Karte behalten oder legen möchte + + } + spielFeld.highBehaltenundo(); + spielFeld.highLegenundo(); + if (karteziehen == true) { + spielFeld.changeKarteziehenundo(); + geht = false; + + //Behält der Spieler die Karte, so passiert quasi nichts + + } else if (kartelegen == true) { + UnoKarte neueKarte = spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).get(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size() - 1); + if (geht == regel.karteLegbar(aktuelleKarte, neueKarte, deck, spielerHand,lenght)) { + aktuelleKarte = neueKarte; + farbAuswahl.farbAuswahl(aktuelleKarte,regel,spielFeld); + spielerHand.entferneKarteHand(spielFeld.getSpielerIndex(), spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size(), deck, zug); + spielFeld.changeKarteziehenundo(); + + //legt er sie wid sie überprüft oob dies auch möglich ist. Ist es nicht möglich behält der Spiler di Karte und der loop läuft weiter + } + geht = false; + } + } + } + if(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size() == 1){ + + //besitzt der Spieler nur noch eine Karte, so muss er uno "Sagen" + //Dies passiert indem der spieler inerhalb von 2.5 Sekunden auf uno drücken muss, sonst bekommt er eine Karte als Strafe + + spielFeld.highUno(); + boolean eineKarte = false; + try { + Thread.sleep(2500); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + spielFeld.highUnoundo(); + eineKarte = spielFeld.getUno(); + if(eineKarte == true){ + spielFeld.aktuelleKarte(aktuelleKarte); + spielFeld.Kartenausschalten(); + continue; + }else { + spielerHand.befuelleSpieleHand(spielFeld.getSpielerIndex(), deck, 1); + } + } + //Besitzt ein Spiler keine Karten mehr, so wird der loop beendet und der EndScreen wird aufgerufen + + if(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size() == 0){ + spielFeld.beenden(); + win = true; + Ende.EndScreen(spielerHand, spielFeld.getSpielerIndex()); + } + spielFeld.changeKarteziehenundo(); + spielFeld.aktuelleKarte(aktuelleKarte); + spielFeld.Kartenausschalten(); + } + } +}