package arschloch;
import java.util.ArrayList;
import java.util.Collections;
public class Game{
ArrayList<Spieler> alleSpieler;
ArrayList<Karten> alleKarten;
private ArrayList<Integer> selectedCards;
private int numPlayers;
private int aktPlayer;
private int runden;
private Stock stock;
public static boolean dropOutRound;
private int dropOutPlayer;
private Grafik gui;
public static Wait wait;
Game(int numPlayers){
dropOutRound = false;
alleSpieler = new ArrayList<Spieler>();
stock = new Stock();
this.numPlayers = numPlayers;
for(int i = 0; i<numPlayers;i++){
alleSpieler.add(new Spieler());
}
alleSpieler.get(0).setName("Jonas");
alleSpieler.get(1).setName("CPU1");
alleSpieler.get(2).setName("CPU2");
alleSpieler.get(3).setName("CPU3");
this.generiereKarten();
this.verteileKarten();
//Wichtig: Hier muss als erstes Argument die Spielerkarten übergeben werden
gui = new Grafik(alleSpieler);
/*alleSpieler.get(0).addCard(alleKarten.get(0));
alleSpieler.get(1).addCard(alleKarten.get(10));
alleSpieler.get(2).addCard(alleKarten.get(14));
alleSpieler.get(2).addCard(alleKarten.get(16));
alleSpieler.get(3).addCard(alleKarten.get(20));
alleSpieler.get(3).addCard(alleKarten.get(28));*/
//Das Spiel beginnt
this.start();
/*for(int i=0;i<numPlayers;i++){
System.out.println(alleSpieler.get(i).getName());
}*/
}
private void generiereKarten(){
String[] kartennamen = {"7","8","9","10", "j", "q", "k", "a"};
String[] farben = {"diamonds", "hearts", "spades", "clubs"};
int tatsWert;
this.alleKarten = new ArrayList<Karten>();
for(int j=0;j<kartennamen.length;j++){
for(int i=0;i<farben.length;i++){
//Wert für späteren Vergleich errechnen
tatsWert = j*farben.length+(i+1);
alleKarten.add(new Karten(farben[i],kartennamen[j],tatsWert));
}
}
}
private void verteileKarten(){
//Karten mischen
Collections.shuffle(this.alleKarten);
//Karten pro Spieler errechnen
int kartenProSpieler = alleKarten.size()/this.numPlayers;
//Karten an Spieler verteilen
int i = 0;
int spieler = 0;
while(i<this.numPlayers*kartenProSpieler){
//Gibt Spieler Karte und löscht diese direkt im Stock
alleSpieler.get(spieler).addCard(alleKarten.remove(0));
//Wenn alle Karten an Spieler verteilt, nächsten Spieler auswählen
if((i+1)%kartenProSpieler == 0){
alleSpieler.get(spieler).sortCards();
spieler++;
}
i++;
}
}
private void start(){
//Wer hat die niedrigste Karte
int startSpieler = 0;
//Der aktuell kleinste Wert, zunächst auf unendlich gesetzt
int minWert = 1000;
for(int i=0;i<alleSpieler.size();i++){
if(alleSpieler.get(i).getLowCard() < minWert){
minWert = alleSpieler.get(i).getLowCard();
startSpieler = i;
}
}
this.aktPlayer = startSpieler;
runde();
}
private void runde(){
this.runden++;
System.out.println("DropOut: "+Game.dropOutRound);
while(true){
System.out.println("Stock:");
stock.ausgabeStock();
System.out.println("-------");
System.out.println("Du bist dran, "+alleSpieler.get(aktPlayer).getName()+", bitte lege eine Karte:");
alleSpieler.get(aktPlayer).ausgabeKarten();
System.out.println();
//Warte auf Eingabe
------------------------------------- HIER MÜSSTE GEWARTET WERDEN
--------------------------------------------------------------------
--------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
--------------------------------------------------------------------
--------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
----------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
----------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------
---------------------------------------------------------------------
-----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
System.out.println("Weiter gehts");
ArrayList<Integer> selectedCards = gui.getSelectedCards();
System.out.println("Spiel geht weiter");
if(selectedCards.size() == 0){
System.out.println(alleSpieler.get(aktPlayer).getName()+" verlässt die Runde");
if(alleSpieler.get(aktPlayer).quitRound()){//Wenn nur noch ein Spieler im Spiel
Spieler.leftPlayersRound--; // Somit wird leftPlayersRound = 0, wichtig wenn hinterher roundOut zurückgesetzt wird
nextRound(); // Gewinner der Runde ausfindig machen
return; //Funktion abbrechen
}
break;
} else{
if(checkEingabe(selectedCards)){ // Wenn alles richtig ist, Karte legen
Game.dropOutRound = false;
ArrayList<Karten> gelegteKarten = new ArrayList<Karten>();
for(int i=0;i<selectedCards.size();i++){
gelegteKarten.add(alleSpieler.get(aktPlayer).returnCards().get(selectedCards.get(i)));
}
for(int i=0;i<gelegteKarten.size();i++){
alleSpieler.get(aktPlayer).returnCards().remove(gelegteKarten.get(i));
}
stock.setStock(gelegteKarten);
//stock.ausgabeStock();
//alleSpieler.get(aktPlayer).ausgabeKarten();
//Wenn Spieler keine Karten mehr hat, gewinnt er
if(alleSpieler.get(aktPlayer).returnCards().size() == 0){
alleSpieler.get(aktPlayer).quitRound();
if(alleSpieler.get(aktPlayer).finished()){//Wenn nur noch ein Spieler im Spiel
System.out.println("Das Spiel ist vorbei!");
System.exit(0);
}
this.dropOutPlayer = aktPlayer;
}
break;
}
System.out.println("_______________________________________________________________________");
}
}
setNextPlayer();
runde();
}
private boolean checkEingabe(ArrayList<Integer> inputKarten){
//Überprüfen, ob alle drei Karten die gleichen sind (z.B. 3 sieben)
String wert = alleSpieler.get(aktPlayer).returnCards().get(inputKarten.get(0)).getWert();
for(int i=1; i<inputKarten.size();i++){
if(alleSpieler.get(aktPlayer).returnCards().get(inputKarten.get(i)).getWert() != wert){
System.out.println("Du hast zwei Karten ausgewählt, die nicht den gleichen Wert haben");
return false;
}
}
if(this.stock.getStock().size() != 0){
//Überprüfen ob Anzahl der Karten gleich groß sind wie die liegenden
if(this.stock.getStock().size() != inputKarten.size()){
System.out.println("Du hast nicht die gleiche Anzahl gelegt, die im Stock liegen");
return false;
}
//Überprüfen, ob gelegte Karte höher ist als momentan vorhandene
//Letzte Karte im Stock hat den höchsten Wert, da Spielerhand sortiert wurde
//Erste Karte auf der Hand hat niedrigsten Wert
// /\/\/\ Nur gültig wenn Spieler Sortierte Reihenfolge eingibt, zu lösen mit sort bei eingabe
if(stock.getStock().get(stock.getStock().size()-1).getTatsWert() > alleSpieler.get(aktPlayer).returnCards().get(inputKarten.get(0)).getTatsWert()){
System.out.println("Gelegte Karte niedriger als liegende Karte");
return false;
}
//Überprüfen ob gelegte Karte gleichen Wert hat wie liegende Karte
// (Ohne wäre es möglich eine Karo sieben mit einer Pik sieben zu überbieten
if(stock.getStock().get(stock.getStock().size()-1).getWert() == alleSpieler.get(aktPlayer).returnCards().get(inputKarten.get(0)).getWert()){
System.out.println("Du hast den gleichen Wert der liegt nochmal gelegt");
return false;
}
}
return true;
}
private void nextRound(){
System.out.println("Suche Gewinner der Runde...");
if(dropOutRound == false){
for(int i=0; i<numPlayers;i++){
if(!alleSpieler.get(i).hasQuitRound()){
aktPlayer = i;
}
//Werte für nächste Runde zurücksetzen
if(!alleSpieler.get(i).hasFinished()){
alleSpieler.get(i).setNewRound();
}
}
} else {
aktPlayer = this.dropOutPlayer;
//Der Spieler nach dem, der gewonnen hat
while(true){
aktPlayer++;
if(aktPlayer>(numPlayers-1)){
aktPlayer = 0;
}
//Überprüfen, ob der aktuelle Spieler noch in der Runde bzw. im Spiel ist
if(!alleSpieler.get(aktPlayer).hasFinished()){
break; // Spieler gefunden
}
}
for(int i=0; i<numPlayers;i++){
//Werte für nächste Runde zurücksetzen
if(!alleSpieler.get(i).hasFinished()){
alleSpieler.get(i).setNewRound();
}
}
dropOutRound = false;
}
System.out.println(alleSpieler.get(aktPlayer).getName()+" gewinnt die Runde");
//Stock zurücksetzen
stock.getStock().clear();
runde();
}
private void setNextPlayer(){
System.out.println("Nächsten Spieler wählen");
while(true){
aktPlayer++;
if(aktPlayer>(numPlayers-1)){
aktPlayer = 0;
}
//Überprüfen, ob der aktuelle Spieler noch in der Runde bzw. im Spiel ist
if(!alleSpieler.get(aktPlayer).hasQuitRound() || !alleSpieler.get(aktPlayer).hasFinished()){
break; // Spieler gefunden
}
}
}
public void setSelectedCards(ArrayList<Integer> selectedCards){
this.selectedCards = selectedCards;
}
public void listeAusgeben(){
for(int i=0;i<alleKarten.size();i++){
System.out.println(alleKarten.get(i).ausgabe());
}
}
}