public int zugErlaubt( int kartennummer) { // überprüft, ob der zug erlaubt ist (Abarbeiten der erlaubten fälle) String karteDieVersuchtWirdZuLegen = einzelneKarte(kartennummer); char farbeDieVersuchtWirdZuLegen = karteDieVersuchtWirdZuLegen.charAt(1); char IDDieVersuchtWirdZuLegen = karteDieVersuchtWirdZuLegen.charAt(0); if (stapel.gebeFarbe() == '4') { // Ist die Farbe der obersten Karte schwarz, so muss die karte aus der ersten // Runde sein und das ablegen jeder karte ist erlaubt return 4; // normales ablegen } if (farbeDieVersuchtWirdZuLegen == '4') { // Sonderfall schwarze Karten if (IDDieVersuchtWirdZuLegen == 'd') { return farbWechselKarte(0); // normale farbwechselkarte } if (IDDieVersuchtWirdZuLegen == 'c' && hatKeineAndereMoeglichkeit()) { // +4 darf nur gelegt werden, wenn keine andere // möglichkeit stapel.setzeZiehFlag(4); System.out.println(name + "Du hast eine +4 gelegt!"); System.out.println(name + "Die Gegnerin wird 4 Karten ziehen müssen oder kontern!"); return farbWechselKarte(1); // +4 mit farbwechsel } else if (IDDieVersuchtWirdZuLegen == 'c' && !hatKeineAndereMoeglichkeit()) { strafKarte( name + "Du hast versucht eine plus4 zu legen obwohl du noch andere Möglichkeiten hattest!\n\tDu musst eine Strafkarte ziehen!"); return -1; // Zug nicht erlaubt } } if (IDDieVersuchtWirdZuLegen == stapel.gebeID() || farbeDieVersuchtWirdZuLegen == stapel.gebeFarbe()) { // Fall selbe ID oder Fall selbe Farbe wahr if (IDDieVersuchtWirdZuLegen == 'a') { stapel.setzeZiehFlag(2); System.out.println(name + "Du hast eine +2 gelegt!"); System.out.println( name + "Die Nächste muss kontern oder " + stapel.gebeZiehFlag() + " Karten ziehen!"); return 4; // normales ablegen } else if (IDDieVersuchtWirdZuLegen == 'b') { System.out.println(name + "Du hast eine Aussetzen-Karte gelegt!"); aussetzen(true); return 4; // normales ablegen } System.out.println("Zug erfolgreich!"); return 4; // karte darf gelegt werden (wenn das Programm hier ankommt, dann erfordert die // Karte keine Sonderbehandlung) } else if (IDDieVersuchtWirdZuLegen != stapel.gebeID()) { // Fall Fehler wegen unterschiedlicher ID strafKarte( name + "Du hast versucht eine andere Zahl auf den Stapel zu legen als die oberste Karte! \nDu erhälst eine Strafkarte!"); return -1; } else if (farbeDieVersuchtWirdZuLegen != stapel.gebeFarbe()) { // Fall Fehler wegen unterschiedlicher Farbe strafKarte( name + "Du hast versucht eine andere Farbe zu legen. Du erhälst eine strafkarte!"); return -1; // Zug nicht erlaubt } return -1; // nicht erlaubt }
public void Zug() { // Durchführen des eigentlichen Zuges (Ziehen, reagieren auf +karten Fälle, ...) System.out.println("SPIELERIN " + ID + " IST AM ZUG!"); String gewaehlteKarte = ""; boolean error; int konterID = 0; stapel.gebeObersteKarteAus(); this.kartenAusgeben(); // überprüfen ob karte gelegt werden darf do { if (stapel.gebeZiehFlag() == 0) { gewaehlteKarte = leseEingabe( name + "Bitte eine Karte auswählen (Kartennummer angeben), oder unter dem Zug einer neuen Karte passen! (0 eingeben). \n\tUm \"UNO\" zu rufen ein \"u\" vor die Zahl setzen!"); error = erkenneEingabe(gewaehlteKarte); // eigentlicher Zug } else { gewaehlteKarte = leseEingabe( name + "Dein Gegner hat eine ziehen-karte gelegt. Du kannst kontern (Kartennummer angeben) oder die karten ziehen (0 eingeben). \n\tUm \"UNO\" zu rufen ein \"u\" vor die Zahl setzen!"); konterID = kontern(gewaehlteKarte); if (konterID == 1) { // Spieler wird nach fehlgeschlagenen Konter gegen +2 übersprungen this.kartenAusgeben(); error = false; } else if (konterID == 2) { this.kartenAusgeben(); error = false; // der Spieler wird wegen des fehlgeschlagenen konters nicht übersprungen (konter gegen // eine +4 fehlgeschlagen) gewaehlteKarte = leseEingabe( name + "Bitte eine Karte auswählen (Kartennummer angeben), oder unter dem Zug einer neuen Karte passen! (0 eingeben). \n\tUm \"UNO\" zu rufen ein \"u\" vor die Zahl setzen!"); error = erkenneEingabe(gewaehlteKarte); // eigentlicher Zug } else if (konterID == 0) { System.out.println(name + "Du hast erfolgreich gekontert!"); error = false; } else { error = false; } } if (error) { System.out.println(name + "Falsche Eingabe, bitte erneut versuchen!"); } } while (error); }
int farbWechselKarte( int ID) { // Führt eine Farbwechselkarte aus, unter Berücksichtigung ob es eine // Farbwechselkarte oder eine +4 war boolean error; String eingabe; int farbWunsch; if (ID == 0) { System.out.println( "Du hast eine Farbwechselkarte gelegt! Zu welcher Farbe möchtest du wechseln? \n" + "0 für Blau, 1 für Grün, 2 für Gelb, 3 für Rot"); } else { System.out.println( "Deine +4 beinhaltet einen Farbwechsel! Zu welcher Farbe möchtest du wechseln? \n" + "0 für Blau, 1 für Grün, 2 für Gelb, 3 für Rot"); } do { eingabe = scanner.nextLine(); if (eingabe.matches("[0-3]")) { farbWunsch = Integer.parseInt(eingabe); stapel.setzeNeueFarbe(Character.forDigit(farbWunsch, 10)); return farbWunsch; } else { error = true; } if (error) { System.out.println("Falsche Eingabe, bitte erneut versuchen!"); } } while (error); return -1; }
boolean zugVersuchen( String eingabe, int uno) { // Versuchen, einen Zug durchzuführen, bei Fehler reagieren darauf (Karten ziehe, // ...). Die Methode entfernt auch eine gelegte Karte aus den Spielerkarten) int kartennummer; if (uno == 1) { // Uno muss geprüft werden unoIsTrue(true); kartennummer = Integer.parseInt( eingabe.substring(1, eingabe.length())); // es steht ein U am anfang vom string } else { unoIsTrue(false); // überprüfen, ob uno hätte gerufen werden müssen kartennummer = Integer.parseInt(eingabe); // es steht kein U am anfang vom string } int zug = zugErlaubt(kartennummer); if (zug == 4) { zugDurchfueren( einzelneKarte(kartennummer)); // Die oberste Karte des Stapels wird die augewählte Karte entferneGewisseKarte(kartennummer); return true; } else if (zug == 0 | zug == 1 | zug == 2 | zug == 3) { // Farbkartenbehandlung (Farbwechsel und +4) String karteTemp = einzelneKarte(kartennummer); char IDtemp = karteTemp.charAt(0); stapel.neueObersteKarte( "" + IDtemp + zug); // Die oberste Karte des Stapels wird die augewählte Karte entferneGewisseKarte(kartennummer); } else { return false; } return false; }
public static void main(String[] args) { boolean weiterSpielen = true; while (weiterSpielen) { if (runde == 0 && spiel == 0) { intro(); } if (runde == 0) { startStapel(); stapel.zieheErsteKarte(); scrollTerminal(); } if (runde % 2 == 0) { // entscheidet ob Spielerin1 oder Spielerin2 an der reihe ist spieler1.Zug(); } else { spieler2.Zug(); } System.out.println(""); System.out.println("Setze fort in 3 sek"); warten(3000); scrollTerminal(); warten(500); runde++; if (spieler1.karten.length() == 0) { System.out.println("Spielerin 1 hat gewonnen!"); weiterSpielen = rundenAuswertung(); spiel++; } else if (spieler2.karten.length() == 0) { System.out.println("Spielerin 2 hat gewonnen!"); weiterSpielen = rundenAuswertung(); spiel++; } } }
boolean hatKeineAndereMoeglichkeit() { // Überprüft, ob der Spieler eine andere Karte außer der +4 // legen kann String colorAll = ""; String IDAll = ""; for (int i = 1; i < karten.length(); i = i + 2) { // Alle Farben in einen String colorAll += karten.charAt(i); } for (int i = 0; i < karten.length(); i = i + 2) { // Alle IDs in einen String IDAll += karten.charAt(i); } if (IDAll.contains("d") || (IDAll.contains("" + stapel.gebeID()) && stapel.gebeID() != 'c') || (colorAll.contains("" + stapel.gebeFarbe()) && stapel.gebeID() != 'c')) { return false; // Spielerin hat noch andere Möglichkeiten zu legen } else { return true; // Spielerin kann nur diese +4 legen } }
void plusXZiehen( int anzahl) { // wenn eine spielerin wg. einer Strafkarte ziehen muss, wird diese methode // aufgerufen System.out.println(name + "Du hast " + anzahl + " Karten gezogen"); for (int i = 0; i < anzahl; i++) { neueKarte(); } stapel.resetZiehflag(); }
int kontern( String gewaehlteKarte) { // Überprüfen, ob die Spielerin kontern kann, Durchführen des Konters // oder des Kartenziehens unter Berücksichtigung der Ausnahmefälle int fehlerID = pruefeEingabe(gewaehlteKarte); String karte = ""; int kartennummer = 0; if (fehlerID == 1) { // kein Uno eingegeben kartennummer = Integer.parseInt(gewaehlteKarte); } else if (fehlerID == 2) { // uno eingegeben kartennummer = Integer.parseInt(gewaehlteKarte.substring(1, gewaehlteKarte.length())); } if (kartennummer != 0) { karte = einzelneKarte(kartennummer); } boolean error; do { int eingabeID = konterEingabe( gewaehlteKarte); // 0 = kein fehler, kein uno / 1= uno, kein fehler / -1 = fehler if (eingabeID == 0) { // spielerin zieht die karten, es kann auch kein UNO auftreten error = false; } else if (eingabeID == 1) { // spielerin hat uno gerufen error = false; } else if (eingabeID == 2) { // spielerin hat kein uno gerufen error = false; } else { error = true; } if (error) { System.out.println(name + "Falsche Eingabe, bitte erneut versuchen!"); } } while (error); if (karte.equals("c4") || (karte.contains("a") && karte.charAt(1) == stapel.gebeFarbe())) { if (karte.equals("c4") && hatKeineAndereMoeglichkeit()) { stapel.setzeZiehFlag(4); System.out.println(name + "Du hast mit einer +4 gekontert!"); System.out.println( name + "Der nächste muss kontern oder " + stapel.gebeZiehFlag() + " Karten ziehen!"); farbWechselKarte(1); entferneGewisseKarte(kartennummer); return 0; // erfolgreich gekontert } else { stapel.setzeZiehFlag(2); System.out.println(name + "Du hast mit einer +2 gekontert!"); System.out.println( name + "Der Nächste muss kontern oder " + stapel.gebeZiehFlag() + " Karten ziehen!"); entferneGewisseKarte(kartennummer); return 0; // erfolgreich gekontert } } else { System.out.println("Du hast nicht gekontert!"); plusXZiehen(stapel.gebeZiehFlag()); if (stapel.gebeID() == 'c') { stapel.resetZiehflag(); return 2; // Konter gegen eine +4 fehlgeschlagen (Spieler wird nicht übersprungen) } else { stapel.resetZiehflag(); return 1; // Konter gegen eine +2 fehlgeschlagen (Spieler wird übersprungen) } } }
void zugDurchfueren(String karte) { stapel.neueObersteKarte(karte); // Die oberste Karte des Stapels wird die augewählte Karte }