diff --git a/src/BotInterface.java b/src/BotInterface.java new file mode 100644 index 0000000000000000000000000000000000000000..8e42269c17e163151390097f8575d634072c5afb --- /dev/null +++ b/src/BotInterface.java @@ -0,0 +1,82 @@ + + +//Daran hat Justin Klein gearbeitet + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +public class BotInterface extends JFrame{ + private JPanel kartenPanel1; + private JPanel kartenPanel2; + private JLabel BotLabel; + public BotInterface(){ + setTitle("Bot Überblick"); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setLayout(new BorderLayout()); + + kartenPanel1 = new JPanel(); + JScrollPane kartenScrollPanel1; + kartenPanel1.setLayout(new FlowLayout(FlowLayout.LEFT)); + kartenScrollPanel1 = new JScrollPane(kartenPanel1); + add(kartenScrollPanel1, BorderLayout.NORTH); + + kartenPanel2 = new JPanel(); + JScrollPane kartenScrollPanel2; + kartenPanel2.setLayout(new FlowLayout(FlowLayout.LEFT)); + kartenScrollPanel2 = new JScrollPane(kartenPanel2); + add(kartenScrollPanel2, BorderLayout.CENTER); + + BotLabel = new JLabel(); + add(BotLabel,BorderLayout.SOUTH); + + setSize(800,700); + setVisible(true); + revalidate(); + repaint(); + } + public void anzeige(ArrayList<UnoKarte> LegbareKarten,SpielerHand spielerHand, int aktuellerSpieler,String Bot){ + + aktuelleKarteHinzufuegen(spielerHand,aktuellerSpieler); + + legbareKarteHinzufuegen(LegbareKarten); + + BotLabel.setText(Bot); + BotLabel.setFont(new Font("Arial", Font.PLAIN, 20)); + } + + public void aktuelleKarteHinzufuegen( SpielerHand spielerHand, int aktuellerSpieler){ + int size = spielerHand.spielerHaende.get(aktuellerSpieler).size()-1; + kartenPanel1.removeAll(); + revalidate(); + repaint(); + for (int i = 0; i <= size; i++) { + JButton kartenButton = createImageButton("UnoKarten/"+Bild(spielerHand.spielerHaende.get(aktuellerSpieler).get(i))+".png"); // Passe den Pfad zum Kartenbild an + kartenPanel1.add(kartenButton); + } + } + public void legbareKarteHinzufuegen(ArrayList<UnoKarte> LegbareKarten){ + int size = LegbareKarten.size()-1; + kartenPanel2.removeAll(); + revalidate(); + repaint(); + for (int i = 0; i <= size; i++) { + JButton kartenButton = createImageButton("UnoKarten/"+Bild(LegbareKarten.get(i))+".png"); // Passe den Pfad zum Kartenbild an + kartenPanel2.add(kartenButton); + } + } + public JButton createImageButton(String imagePath) { + ImageIcon icon = new ImageIcon(imagePath); + JButton button = new JButton(icon); + button.setBorderPainted(false); + button.setFocusPainted(false); + button.setContentAreaFilled(false); + return button; + } + public String Bild(UnoKarte aktuelleKarte){ + Farbe farbe = aktuelleKarte.getFarbe(); + Wert wert = aktuelleKarte.getWert(); + String wort = farbe + "_" + wert; + return wort; + + } +} diff --git a/src/BotKontroll.java b/src/BotKontroll.java new file mode 100644 index 0000000000000000000000000000000000000000..842e16ab4e60288117f20cfa5c3ce6e012fcb8e7 --- /dev/null +++ b/src/BotKontroll.java @@ -0,0 +1,41 @@ + +//Diese Klasse soll denn Bots ihre jeweilige Boteigenschaft geben und sie speichern + +//Daran hat Justin Klein gearbeitet +import java.util.ArrayList; +import java.util.Random; +public class BotKontroll { + + private ArrayList<Integer> isBot; + public int BotKontroll(SpielerHand spielerHand,int aktuellerSpieler, UnoKarte aktuelleKarte, Regelwerk regel,UnoDeck deck, UnoSpielfeld spielfeld,BotInterface anzeige, boolean Interface) { + Random rand = new Random(); + + if (isBot.get(aktuellerSpieler) == null) { + int randome = rand.nextInt(1,2); + isBot.set(aktuellerSpieler, randome); + } + + int kartenIndex = -1; + switch (isBot.get(aktuellerSpieler)){ + case 1 -> { + Bot_1 bot_1 = new Bot_1(); + kartenIndex = bot_1.Bot_1(spielerHand, aktuellerSpieler, aktuelleKarte, regel, deck, spielfeld, anzeige, Interface); + }case 2 -> { + Bot_2 bot_2 = new Bot_2(); + kartenIndex = bot_2.Bot_2(spielerHand, aktuellerSpieler, aktuelleKarte, regel, deck, spielfeld, anzeige, Interface); + }case 3 ->{ + Bot_3 bot_3 = new Bot_3(); + kartenIndex = bot_3.Bot_3(spielerHand, aktuellerSpieler, aktuelleKarte, regel, deck, spielfeld, anzeige, Interface); + } + } + return kartenIndex; + } + + public void setBotKontroll(int lenght){ + isBot = new ArrayList<>(); + + for(int i = 0; i < lenght; i++){ + isBot.add(null); + } + } +} diff --git a/src/Bot_1.java b/src/Bot_1.java new file mode 100644 index 0000000000000000000000000000000000000000..aef55413bc362abca9761038f91d55b91df11b41 --- /dev/null +++ b/src/Bot_1.java @@ -0,0 +1,209 @@ + +/* + Der Bot versucht über den Verlauf des Spiels seine Wild Karten aufzusparen, um sie dann am Ende legen zu können + */ +// An diesem Bot haben Alexandros Tzialidiss und Luan Blum gearbeitet +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +public class Bot_1 { + + public boolean isWild; + public boolean neuKarte = false; + + private ArrayList<UnoKarte> LegbareKarten; + public int Bot_1(SpielerHand spielerHand,int aktuellerSpieler, UnoKarte aktuelleKarte, Regelwerk regel,UnoDeck deck, UnoSpielfeld spielfeld,BotInterface anzeige, boolean Interface){ + LegbareKarten = new ArrayList<UnoKarte>(); + legbareKarten(spielerHand,aktuellerSpieler,aktuelleKarte,regel); + sortiereUnoKarten(LegbareKarten); + int lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + int size = LegbareKarten.size(); + if(Interface == true) { + String Bot = "Bot 1"; + anzeige.anzeige(LegbareKarten, spielerHand, aktuellerSpieler, Bot); + } + isWild = false; + if(size > 0) { + if (LegbareKarten.get(size - 1).getFarbe() == Farbe.Wild) { + isWild = true; + } + } + if(isWild == true && spielerHand.spielerHaende.get(aktuellerSpieler).size() > 1 && LegbareKarten.size() > 1){ + aktuelleKarte = LegbareKarten.get(0); + neuKarte = true; + } else if (isWild == true && size > 2 && LegbareKarten.get(size-2).getFarbe() == Farbe.Wild ) { + aktuelleKarte = LegbareKarten.get(size-2); + neuKarte = true; + } else if(isWild == false && spielerHand.spielerHaende.get(aktuellerSpieler).size() == 1 ){ + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + boolean geht = true; + UnoKarte neueKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1); + if(geht == ueberpruefeKarte(aktuelleKarte,neueKarte,regel) && (neueKarte.getWert() != Wert.Draw_Four || neueKarte.getWert() != Wert.Multicolor)){ + aktuelleKarte = neueKarte; + neuKarte = true; + } + } else if (isWild == false && spielerHand.spielerHaende.get(aktuellerSpieler).size() > 1 && LegbareKarten.size() >=1) { + aktuelleKarte = LegbareKarten.get(0); + neuKarte = true; + } else if(isWild == true && spielerHand.spielerHaende.get(aktuellerSpieler).size() <= 1){ + aktuelleKarte = LegbareKarten.get(0); + neuKarte = true; + }else{ + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + boolean geht = true; + UnoKarte neueKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1); + if(geht == ueberpruefeKarte(aktuelleKarte,neueKarte,regel) && neueKarte.getFarbe() != Farbe.Wild){ + aktuelleKarte = neueKarte; + neuKarte = true; + } else if(geht == ueberpruefeKarte(aktuelleKarte,neueKarte,regel) && isWild == false && neueKarte.getFarbe() == Farbe.Wild) { + + } + } + + int kartenIndex = -1; + if(neuKarte == true) { + if (regel.color.size() == 2) { + if (aktuelleKarte.getFarbe() == regel.color.get(1) || aktuelleKarte.getFarbe() == regel.color.get(0)) { + if (aktuelleKarte.getFarbe() == regel.color.get(0)) { + regel.color.remove(1); + } + for (int i = 0; i < lenght; i++) { + if (aktuelleKarte.equals(spielerHand.spielerHaende.get(aktuellerSpieler).get(i))) { + kartenIndex = i; + } + } + } + } else { + for (int i = 0; i < lenght; i++) { + if (aktuelleKarte.equals(spielerHand.spielerHaende.get(aktuellerSpieler).get(i))) { + kartenIndex = i; + } + } + } + } + int[] farben = {0,0,0,0,0}; + if((aktuelleKarte.getWert() == Wert.Draw_Four || aktuelleKarte.getWert() == Wert.Multicolor) && neuKarte == true){ + for(UnoKarte karte : spielerHand.spielerHaende.get(aktuellerSpieler)){ + switch (karte.getFarbe()){ + case Gruen -> + farben[0] +=1; + case Gelb -> + farben[1] +=1; + case Blau -> + farben[2] +=1; + case Rot -> + farben[3] +=1; + case Wild -> + farben[4] +=1; + } + } + int max = farben[0]; + int id = 0; + + for (int i = 1; i < farben.length; i++) { + if (farben[i] > max) { + max = farben[i]; + id = i; + } + } + switch (id){ + case 0 -> { + regel.color.add(Farbe.Gruen); + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gruen, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gruen, Wert.Multicolor); + } + } + case 1 -> { + regel.color.add(Farbe.Gelb); + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gelb, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gelb, Wert.Multicolor); + } + } + case 2 -> { + regel.color.add(Farbe.Blau); + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Blau, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Blau, Wert.Multicolor); + } + } + case 3 -> { + regel.color.add(Farbe.Rot); + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Rot, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Rot, Wert.Multicolor); + } + } + default -> { + } + } + } + return kartenIndex; + } + + public void legbareKarten(SpielerHand spielerHand,int aktuellerSpieler,UnoKarte aktuelleKarte, Regelwerk regel){ + int size = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + boolean geht = true; + for(int i = 0; i < size; i++){ + UnoKarte neueKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(i); + if(geht == ueberpruefeKarte(aktuelleKarte, neueKarte, regel)){ + LegbareKarten.add(neueKarte); + } + } + } + + public Boolean ueberpruefeKarte(UnoKarte aktuelleKarte, UnoKarte neueKarte, Regelwerk regel){ + if(regel.color.size() == 2) { + if(regel.color.get(1) == neueKarte.getFarbe() || regel.color.get(0) == neueKarte.getFarbe()){ + return true; + }else { + return false; + } + }else if (aktuelleKarte.getFarbe() == neueKarte.getFarbe()) { + return true; + } else if (aktuelleKarte.getWert() == neueKarte.getWert()) { + return true; + }else if(neueKarte.getFarbe() == Farbe.Wild || aktuelleKarte.getFarbe() == Farbe.Wild){ + return true; + } else { + return false; + } + } + + public static void sortiereUnoKarten(ArrayList<UnoKarte> LegbareKarten){ + Collections.sort(LegbareKarten, new Comparator<UnoKarte>() { + @Override + public int compare(UnoKarte karte1, UnoKarte karte2) { + int farbenIndex1 = getFarbenIndex(karte1.getFarbe()); + int farbenIndex2 = getFarbenIndex(karte2.getFarbe()); + + return Integer.compare(farbenIndex1, farbenIndex2); + } + }); + } + + public static int getFarbenIndex(Farbe farbe) { + switch (farbe){ + case Rot -> { + return 0; + }case Blau -> { + return 1; + }case Gelb -> { + return 2; + }case Gruen -> { + return 3; + }case Wild -> { + return 4; + }default -> { + return -1; + } + } + } +} diff --git a/src/Bot_2.java b/src/Bot_2.java new file mode 100644 index 0000000000000000000000000000000000000000..451ed9a7f9ea7ddd099ec51e71cce5e9ed67ef44 --- /dev/null +++ b/src/Bot_2.java @@ -0,0 +1,243 @@ + +/* + Der Bot bewertet Karten nach einem Punkte System. Je höher die Punkte um so nerviger ist die Karte + */ + +// An diesem Bot haben Ismail Eren Cakan und Furkan Celik gearbeitet +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class Bot_2 { + private boolean neuKarte = false; + + private ArrayList<UnoKarte> LegbareKarten; + public int Bot_2(SpielerHand spielerHand,int aktuellerSpieler, UnoKarte aktuelleKarte, Regelwerk regel,UnoDeck deck, UnoSpielfeld spielfeld,BotInterface anzeige,boolean Interface){ + UnoKarte alteKarte = aktuelleKarte; + LegbareKarten = new ArrayList<UnoKarte>(); + legbareKarten(spielerHand,aktuellerSpieler,aktuelleKarte,regel); + sortiereUnoKarten(LegbareKarten); + int lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + int size = LegbareKarten.size(); + + if(Interface == true) { + String Bot = "Bot 2"; + anzeige.anzeige(LegbareKarten, spielerHand, aktuellerSpieler, Bot); + } + if(size >=1) { + UnoKarte besteKarte = LegbareKarten.get(0); + int besteBewertung = bewerteKarte(besteKarte, aktuelleKarte); + + for (UnoKarte karte : LegbareKarten) { + int bewertung = bewerteKarte(karte, aktuelleKarte); + if (bewertung > besteBewertung) { + besteBewertung = bewertung; + besteKarte = karte; + } + } + aktuelleKarte = besteKarte; + neuKarte = true; + } else if (size == 0) { + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + UnoKarte neueKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1); + if(true == ueberpruefeKarte(aktuelleKarte,neueKarte,regel)){ + aktuelleKarte = neueKarte; + neuKarte = true; + } + }else { + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + UnoKarte neueKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1); + if(true == ueberpruefeKarte(aktuelleKarte,neueKarte,regel)){ + aktuelleKarte = neueKarte; + neuKarte = true; + } + } + + int kartenIndex = -1; + if(neuKarte == true) { + if (regel.color.size() == 2) { + if (aktuelleKarte.getFarbe() == regel.color.get(1) || aktuelleKarte.getFarbe() == regel.color.get(0)) { + if (aktuelleKarte.getFarbe() == regel.color.get(0)) { + regel.color.remove(1); + } + for (int i = 0; i < lenght; i++) { + if (aktuelleKarte.equals(spielerHand.spielerHaende.get(aktuellerSpieler).get(i))) { + kartenIndex = i; + } + } + } + } else { + for (int i = 0; i < lenght; i++) { + if (aktuelleKarte.equals(spielerHand.spielerHaende.get(aktuellerSpieler).get(i))) { + kartenIndex = i; + } + } + } + } + + int[] farben = {0,0,0,0,0}; + if((aktuelleKarte.getWert() == Wert.Draw_Four || aktuelleKarte.getWert() == Wert.Multicolor) && neuKarte == true){ + for(UnoKarte karte : spielerHand.spielerHaende.get(aktuellerSpieler)){ + switch (karte.getFarbe()){ + case Gruen -> + farben[0] +=1; + case Gelb -> + farben[1] +=1; + case Blau -> + farben[2] +=1; + case Rot -> + farben[3] +=1; + case Wild -> + farben[4] +=1; + } + } + int max = farben[0]; + int id = 0; + + for (int i = 1; i < farben.length; i++) { + if (farben[i] > max) { + max = farben[i]; + id = i; + } + } + switch (id){ + case 0 -> { + if(alteKarte.getFarbe() == Farbe.Gruen){ + + }else { + regel.color.add(Farbe.Gruen); + } + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gruen, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gruen, Wert.Multicolor); + } + } + case 1 -> { + if(alteKarte.getFarbe() == Farbe.Gelb){ + + }else { + regel.color.add(Farbe.Gelb); + } + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gelb, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gelb, Wert.Multicolor); + } + } + case 2 -> { + if(alteKarte.getFarbe() == Farbe.Blau){ + + }else { + regel.color.add(Farbe.Blau); + } + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Blau, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Blau, Wert.Multicolor); + } + } + case 3 -> { + if(alteKarte.getFarbe() == Farbe.Rot){ + + }else { + regel.color.add(Farbe.Rot); + } + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Rot, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Rot, Wert.Multicolor); + } + } + default -> { + } + } + } + + return kartenIndex; + } + + public void legbareKarten(SpielerHand spielerHand,int aktuellerSpieler,UnoKarte aktuelleKarte, Regelwerk regel){ + int size = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + boolean geht = true; + for(int i = 0; i < size; i++){ + UnoKarte neueKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(i); + if(geht == ueberpruefeKarte(aktuelleKarte, neueKarte, regel)){ + LegbareKarten.add(neueKarte); + } + } + } + + public Boolean ueberpruefeKarte(UnoKarte aktuelleKarte, UnoKarte neueKarte, Regelwerk regel){ + if(regel.color.size() == 2) { + if(regel.color.get(1) == neueKarte.getFarbe() || regel.color.get(0) == neueKarte.getFarbe()){ + return true; + }else { + return false; + } + }else if (aktuelleKarte.getFarbe() == neueKarte.getFarbe()) { + return true; + } else if (aktuelleKarte.getWert() == neueKarte.getWert()) { + return true; + }else if(neueKarte.getFarbe() == Farbe.Wild || aktuelleKarte.getFarbe() == Farbe.Wild){ + return true; + } else { + return false; + } + } + + public static void sortiereUnoKarten(ArrayList<UnoKarte> LegbareKarten){ + Collections.sort(LegbareKarten, new Comparator<UnoKarte>() { + @Override + public int compare(UnoKarte karte1, UnoKarte karte2) { + int farbenIndex1 = getFarbenIndex(karte1.getFarbe()); + int farbenIndex2 = getFarbenIndex(karte2.getFarbe()); + + return Integer.compare(farbenIndex1, farbenIndex2); + } + }); + } + + public static int getFarbenIndex(Farbe farbe) { + switch (farbe){ + case Rot -> { + return 0; + }case Blau -> { + return 1; + }case Gelb -> { + return 2; + }case Gruen -> { + return 3; + }case Wild -> { + return 4; + }default -> { + return -1; + } + } + } + + public static int bewerteKarte(UnoKarte besteKarte, UnoKarte aktuelleKarte){ + int bewertung = 0; + + if(besteKarte.getWert() == Wert.Zwei_Ziehen){ + bewertung +=20; + }else if(besteKarte.getWert() == Wert.Draw_Four){ + bewertung += 50; + }else if(besteKarte.getWert() == Wert.Aussetzen || besteKarte.getWert() == Wert.Richtungswechsel){ + bewertung += 10; + } + + if(besteKarte.getFarbe() == Farbe.Wild){ + bewertung += 3; + } + + if(besteKarte.getFarbe() != aktuelleKarte.getFarbe()) { + bewertung += 5; + }else if(besteKarte.getWert() != aktuelleKarte.getWert()){ + bewertung += 2; + } + return bewertung; + } +} diff --git a/src/Bot_3.java b/src/Bot_3.java new file mode 100644 index 0000000000000000000000000000000000000000..7a4eca0ba7dfefb61baf371316c2c2f117dd1414 --- /dev/null +++ b/src/Bot_3.java @@ -0,0 +1,302 @@ + +/* + der Bot versucht durch legen von +2 und +4 Karten den Spieler daran zu hindern das spiel zu gewinnen + */ +// An diesem Bot hat Justin Klein gearbeitet +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class Bot_3 { + + boolean isZwei = false; + boolean isVier = false; + boolean isMulticolor = false; + boolean neuKarte = false; + Farbe zwingendeFarbe; + + private ArrayList<UnoKarte> LegbareKarten; + public int Bot_3(SpielerHand spielerHand,int aktuellerSpieler, UnoKarte aktuelleKarte, Regelwerk regel,UnoDeck deck, UnoSpielfeld spielfeld,BotInterface anzeige,boolean Interface){ + LegbareKarten = new ArrayList<UnoKarte>(); + legbareKarten(spielerHand,aktuellerSpieler,aktuelleKarte,regel); + sortiereUnoKarten(LegbareKarten); + int lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + int size = LegbareKarten.size(); + if(Interface == true) { + String Bot = "Bot 3"; + anzeige.anzeige(LegbareKarten, spielerHand, aktuellerSpieler,Bot); + } + int anzahlspielerKarten = spielerHand.spielerHaende.get(regel.reihenfolge.get(0)).size(); + + for(UnoKarte karte : spielerHand.spielerHaende.get(aktuellerSpieler)){ + if(karte.getWert() == Wert.Draw_Four){ + isVier = true; + } else if (karte.getWert() == Wert.Zwei_Ziehen) { + isZwei = true; + } + } + int anzahl = 0; + for(UnoKarte karten : spielerHand.spielerHaende.get(aktuellerSpieler)){ + if (isZwei == true || isVier == true){ + if (karten.getWert() == Wert.Zwei_Ziehen || karten.getWert() == Wert.Draw_Four){ + anzahl += 1; + } + } + } + if(anzahl == lenght){ + boolean passt = false; + if(LegbareKarten.size() >= 1) { + for (UnoKarte karten : LegbareKarten){ + if(ueberpruefeKarte(aktuelleKarte,karten,regel) == true){ + aktuelleKarte = karten; + neuKarte = true; + passt = true; + break; + } + } + } + if(passt == false){ + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + UnoKarte neueKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1); + if(ueberpruefeKarte(aktuelleKarte,neueKarte,regel)){ + aktuelleKarte = neueKarte; + neuKarte = true; + } + } + }else if(anzahlspielerKarten > 2){ + if(isZwei == true || isVier == true) { + boolean passend = false; + if(LegbareKarten.size() >= 1) { + for (UnoKarte karte : LegbareKarten) { + if (karte.getWert() != Wert.Draw_Four && karte.getWert() != Wert.Zwei_Ziehen) { + if(ueberpruefeKarte(aktuelleKarte,karte,regel)){ + aktuelleKarte = karte; + neuKarte = true; + passend = true; + } + } + } + } + if(passend == false){ + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + if(spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1).getWert() != Wert.Draw_Four && spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1).getWert() != Wert.Zwei_Ziehen) { + if (ueberpruefeKarte(aktuelleKarte, spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght - 1), regel) == true) { + aktuelleKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght - 1); + neuKarte = true; + } + } + } + }else{ + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + if(spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1).getWert() != Wert.Draw_Four && spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1).getWert() != Wert.Zwei_Ziehen) { + if (ueberpruefeKarte(aktuelleKarte, spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght - 1), regel) == true) { + aktuelleKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght - 1); + neuKarte = true; + } + } + } + }else if(anzahlspielerKarten <= 2) { + if(isZwei == true){ + int menge = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + for(int j = 0; j < menge; j++) { + UnoKarte karte = spielerHand.spielerHaende.get(aktuellerSpieler).get(j); + if(karte.getWert() == Wert.Zwei_Ziehen) { + if (ueberpruefeKarte(aktuelleKarte, karte, regel) == true) { + aktuelleKarte = karte; + neuKarte = true; + break; + }else { + for (int i = 0; i < menge; i++){ + UnoKarte karte2 = spielerHand.spielerHaende.get(aktuellerSpieler).get(i); + if(karte2.getFarbe() == karte.getFarbe() && aktuelleKarte.getWert() == karte2.getWert()){ + aktuelleKarte = karte2; + neuKarte = true; + break; + } else if (karte2.getFarbe() == Farbe.Wild && karte2.getWert() == Wert.Multicolor) { + aktuelleKarte = karte2; + neuKarte = true; + isMulticolor = true; + zwingendeFarbe = karte.getFarbe(); + break; + }else{ + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + UnoKarte neuekarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1); + if(ueberpruefeKarte(aktuelleKarte,neuekarte,regel)){ + aktuelleKarte = neuekarte; + neuKarte = true; + break; + } + } + } + } + } + } + }else if(isVier == true){ + for(UnoKarte karte : spielerHand.spielerHaende.get(aktuellerSpieler)){ + if(karte.getWert() == Wert.Draw_Four){ + aktuelleKarte = karte; + neuKarte = true; + break; + } + } + }else{ + spielerHand.befuelleSpieleHand(aktuellerSpieler,deck,1); + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + UnoKarte neuekarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(lenght-1); + if(ueberpruefeKarte(aktuelleKarte,neuekarte,regel)){ + aktuelleKarte = neuekarte; + neuKarte = true; + } + } + } + int kartenIndex = -1; + if(neuKarte == true) { + if (regel.color.size() == 2) { + if (aktuelleKarte.getFarbe() == regel.color.get(1) || aktuelleKarte.getFarbe() == regel.color.get(0)) { + if (aktuelleKarte.getFarbe() == regel.color.get(0)) { + regel.color.remove(1); + } + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + for (int i = 0; i < lenght; i++) { + if (aktuelleKarte.equals(spielerHand.spielerHaende.get(aktuellerSpieler).get(i))) { + kartenIndex = i; + } + } + } + } else { + lenght = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + for (int i = 0; i < lenght; i++) { + if (aktuelleKarte.equals(spielerHand.spielerHaende.get(aktuellerSpieler).get(i))) { + kartenIndex = i; + } + } + } + } + if(isMulticolor == true){ + regel.color.add(zwingendeFarbe); + spielfeld.wechsleWunschKarte(zwingendeFarbe,Wert.Multicolor); + }else if (neuKarte == true) { + int[] farben = {0, 0, 0, 0, 0}; + if (aktuelleKarte.getWert() == Wert.Draw_Four || aktuelleKarte.getWert() == Wert.Multicolor) { + for (UnoKarte karte : spielerHand.spielerHaende.get(aktuellerSpieler)) { + switch (karte.getFarbe()) { + case Gruen -> farben[0] += 1; + case Gelb -> farben[1] += 1; + case Blau -> farben[2] += 1; + case Rot -> farben[3] += 1; + case Wild -> farben[4] += 1; + } + } + int max = farben[0]; + int id = 0; + + for (int i = 1; i < farben.length; i++) { + if (farben[i] > max) { + max = farben[i]; + id = i; + } + } + switch (id) { + case 0 -> { + regel.color.add(Farbe.Gruen); + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gruen, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gruen, Wert.Multicolor); + } + } + case 1 -> { + regel.color.add(Farbe.Gelb); + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gelb, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Gelb, Wert.Multicolor); + } + } + case 2 -> { + regel.color.add(Farbe.Blau); + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Blau, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Blau, Wert.Multicolor); + } + } + case 3 -> { + regel.color.add(Farbe.Rot); + if (Wert.Draw_Four == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Rot, Wert.Draw_Four); + } else if (Wert.Multicolor == aktuelleKarte.getWert()) { + spielfeld.wechsleWunschKarte(Farbe.Rot, Wert.Multicolor); + } + } + default -> { + } + } + } + } + return kartenIndex; + } + + public void legbareKarten(SpielerHand spielerHand,int aktuellerSpieler,UnoKarte aktuelleKarte, Regelwerk regel){ + int size = spielerHand.spielerHaende.get(aktuellerSpieler).size(); + boolean geht = true; + for(int i = 0; i < size; i++){ + UnoKarte neueKarte = spielerHand.spielerHaende.get(aktuellerSpieler).get(i); + if(geht == ueberpruefeKarte(aktuelleKarte, neueKarte, regel)){ + LegbareKarten.add(neueKarte); + } + } + } + + public Boolean ueberpruefeKarte(UnoKarte aktuelleKarte, UnoKarte neueKarte, Regelwerk regel){ + if(regel.color.size() == 2) { + if(regel.color.get(1) == neueKarte.getFarbe() || regel.color.get(0) == neueKarte.getFarbe()){ + return true; + }else { + return false; + } + }else if (aktuelleKarte.getFarbe() == neueKarte.getFarbe()) { + return true; + } else if (aktuelleKarte.getWert() == neueKarte.getWert()) { + return true; + }else if(neueKarte.getFarbe() == Farbe.Wild || aktuelleKarte.getFarbe() == Farbe.Wild){ + return true; + } else { + return false; + } + } + + public static void sortiereUnoKarten(ArrayList<UnoKarte> LegbareKarten){ + Collections.sort(LegbareKarten, new Comparator<UnoKarte>() { + @Override + public int compare(UnoKarte karte1, UnoKarte karte2) { + int farbenIndex1 = getFarbenIndex(karte1.getFarbe()); + int farbenIndex2 = getFarbenIndex(karte2.getFarbe()); + + return Integer.compare(farbenIndex1, farbenIndex2); + } + }); + } + + public static int getFarbenIndex(Farbe farbe) { + switch (farbe){ + case Rot -> { + return 0; + }case Blau -> { + return 1; + }case Gelb -> { + return 2; + }case Gruen -> { + return 3; + }case Wild -> { + return 4; + }default -> { + return -1; + } + } + } +} diff --git a/src/RunGame.java b/src/RunGame.java index d9e94a77abda713d07a0bb0b3101c588b2bbb731..8b4a418a2b81596f6da2374f774c095dab87e25c 100644 --- a/src/RunGame.java +++ b/src/RunGame.java @@ -2,7 +2,12 @@ An dieser Datei hat Luan Blum größtenteils gearbeitet */ +import java.util.ArrayList; + public class RunGame { + + public boolean Interface = true; + UnoDeck deck = new UnoDeck(); Regelwerk regel = new Regelwerk(); farbAuswahl farbAuswahl = new farbAuswahl(); @@ -10,6 +15,8 @@ public class RunGame { final Object lock = new Object(); final Object locked = new Object(); private int lenght = 0; + public ArrayList<Boolean> isBot; + public BotInterface anzeige; public void Start() { @@ -28,6 +35,9 @@ public class RunGame { lenght = Names.getgroesse(); + isBot = new ArrayList<Boolean>(); + isBot = Names.getisBot(); + if (lenght > 4) { deck.befuellen(); deck.befuellen(); @@ -63,9 +73,18 @@ public class RunGame { 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); + UnoSpielfeld spielFeld = new UnoSpielfeld(aktuelleKarte, spielerHand, regel,lock,lenght,isBot); + + + if(Interface == true){ + anzeige = new BotInterface(); + } + + BotKontroll botKontroll = new BotKontroll(); + botKontroll.setBotKontroll(spielerHand.spielerHaende.size()); while (!win) { + spielFeld.aktuelleKarte(aktuelleKarte); reihen = regel.reihenfolge(); spielFeld.colorPlayer(reihen); boolean start = false; @@ -81,200 +100,225 @@ public class RunGame { } 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(isBot.get(reihen) == false){ + 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); + } - 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; + 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; - //Hier wird die Karte dann geprüft ob es möglich ist diese zu legen + //Entscheidet der Spieler sich für das legen der Karte wird wird die zu legende Karte entnommen - } else { + 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; - //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(); + //Hier wird die Karte dann geprüft ob es möglich ist diese zu legen - //Diese Schleife prüft erneut ob der Spieler eine Karte Legen oder ziehen möchte + } else { - } - 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 + //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(); - 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; + //Diese Schleife prüft erneut ob der Spieler eine Karte Legen oder ziehen möchte - //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)); + 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; - // Entscheidet der Spieler sich für das zihen der Karte wird ihm eine Karte hinzugefügt + //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)); - synchronized (lock) { - try { - lock.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } + // Entscheidet der Spieler sich für das zihen der Karte wird ihm eine Karte hinzugefügt - while (geht == true) { - kartelegen = false; - karteziehen = false; - spielFeld.highLegen(); - spielFeld.highBehalten(); - while ((kartelegen || karteziehen) != true) { + synchronized (lock) { try { - Thread.sleep(100); + lock.wait(); } catch (InterruptedException e) { - throw new RuntimeException(e); + e.printStackTrace(); } - 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); + 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 + //Hier findet die Prüfung ob die Karte legbar ist statt + } + geht = false; } - 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) { + } 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 { - Thread.sleep(100); + lock.wait(); } catch (InterruptedException e) { - throw new RuntimeException(e); + e.printStackTrace(); } - 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 + 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 - } 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.highBehaltenundo(); + spielFeld.highLegenundo(); + if (karteziehen == true) { spielFeld.changeKarteziehenundo(); + geht = false; - //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 + //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; } - geht = false; } } - } - if(spielerHand.spielerHaende.get(spielFeld.getSpielerIndex()).size() == 1){ + 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 + //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; + 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(); + }else if (isBot.get(reihen) == true){ + int kartenIndex = botKontroll.BotKontroll(spielerHand,reihen,aktuelleKarte,regel,deck, spielFeld,anzeige,Interface); + if(kartenIndex != -1){ + UnoKarte neueKarte = spielerHand.spielerHaende.get(reihen).get(kartenIndex); + if(regel.karteLegbar(aktuelleKarte,neueKarte,deck,spielerHand,lenght) == true){ + aktuelleKarte = neueKarte; + spielerHand.entferneKarteHand(reihen,kartenIndex + 1,deck,zug); + spielFeld.aktuelleKarte(aktuelleKarte); + } + } + if(spielerHand.spielerHaende.get(regel.reihenfolge.get(1)).size() == 0) { + spielFeld.beenden(); + win = true; + Ende.EndScreen(spielerHand, regel.reihenfolge.get(1)); + } + spielFeld.changeKarteziehenundo(); + spielFeld.aktuelleKarte(aktuelleKarte); + spielFeld.Kartenausschalten(); try { - Thread.sleep(2500); + Thread.sleep(200); } 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(); } } } diff --git a/src/UnoSpielfeld.java b/src/UnoSpielfeld.java index 236595b8ea5dc884711d393bbf944b8bef064614..8aa260721884368c6c09d94ed3603524c6839584 100644 --- a/src/UnoSpielfeld.java +++ b/src/UnoSpielfeld.java @@ -35,12 +35,15 @@ public class UnoSpielfeld extends JFrame { public Farbe farbe; Object lock = null; private ArrayList<JButton> spielerButton; + private ArrayList<Boolean> isBot; - public UnoSpielfeld(UnoKarte aktuelleKarte, SpielerHand spilerhand, Regelwerk regel,Object lock1,int lenght) { + public UnoSpielfeld(UnoKarte aktuelleKarte, SpielerHand spilerhand, Regelwerk regel,Object lock1,int lenght,ArrayList<Boolean> ifBot) { this.lock = lock1; spielerButton = new ArrayList<JButton>(); + isBot = new ArrayList<Boolean>(); + isBot = ifBot; size = lenght; // Fenstereinstellungen @@ -108,7 +111,12 @@ public class UnoSpielfeld extends JFrame { for(int j = 0; j < size ; j++){ int w = j; int finalJ = j; - JButton spielerLabel = new JButton("Spieler " + (w + 1) + ": \t " + spielerHand.spielerNamen[j]); + JButton spielerLabel = null; + if(isBot.get(w) == false){ + spielerLabel = new JButton("Spieler " + (w + 1) + ": \t " + spielerHand.spielerNamen[j]); + }else if (isBot.get(w) == true){ + spielerLabel = new JButton("Bot " + (w + 1) + ": \t " + spielerHand.spielerNamen[j]); + } spielerPanel.add(spielerLabel); spielerButton.add(spielerLabel); spielerLabel.setFont(new Font("Arial", Font.PLAIN, 20)); @@ -230,8 +238,6 @@ public class UnoSpielfeld extends JFrame { public void KarteHinzufuegen( SpielerHand spielerHand, int reihen){ spielerIndex = reihen; int size = spielerHand.spielerHaende.get(reihen).size()-1; - for( int k = 0; k < 100; k++) { - } kartenPanel.removeAll(); revalidate(); repaint();