Schwierigkeiten bei Stein.Schere.Papier-Aufgabe

d33eniz

Mitglied
Schönen Abend abermals =)
Ich sitze wieder an einer Aufgabe fest und ich hoffe ich kann hier wieder Hilfe erhalten.
Hier die Aufgabenstellung: Gruppenaufgabe 3.2: Rock-paper-scissors-lizard-Spock 19 GP Sheldon hat mit sei - Pastebin.com
Mein Problem ist, dass das ganze jetzt sehr unübersichtlich wurde und ich den Durchblick verloren habe und nicht weiß, wo ich was verbessern muss .-."

Java:
import static java.lang.System.err;

public class RockPaperScissorsLizardSpockTournament {

	/**
	 * Zwei Spieler A und B haben sich fuer ihr Symbol entschieden. Diese
	 * Methode entscheidet nun, welcher der beiden Spieler gewinnt, oder ob ein
	 * Unentschieden vorliegt.
	 * 
	 * @param a
	 *            Das Symbol, fuer das sich A entschieden hat.
	 * @param b
	 *            Das Symbol, fuer das sich B entschieden hat.
	 * @return Wenn A gewinnt, wird 1 zurueckgegeben. Wenn B gewinnt, wird -1
	 *         zurueckgegeben. Bei Unentschieden wird 0 zurueckgegeben.
	 */
	public static int whoWins(char a, char b) {
		switch (a) {
		case 'S': // Sciccors
			switch (b) {
			case 'S':
				return 0;
			case 'R':
				return -1;
			case 'W':
				return -1;
			case 'P':
				return 1;
			case 'L':
				return 1;
			}
		case 'R': // Rock
			switch (b) {
			case 'R':
				return 0;
			case 'S':
				return 1;
			case 'W':
				return -1;
			case 'P':
				return -1;
			case 'L':
				return 1;
			}
		case 'W': // Spock
			switch (b) {
			case 'W':
				return 0;
			case 'S':
				return 1;
			case 'R':
				return 1;
			case 'P':
				return -1;
			case 'L':
				return -1;
			}
		case 'P': // Paper
			switch (b) {
			case 'P':
				return 0;
			case 'S':
				return -1;
			case 'W':
				return 1;
			case 'R':
				return 1;
			case 'L':
				return -1;
			}
		case 'L': // Lizard
			switch (b) {
			case 'L':
				return 0;
			case 'S':
				return -1;
			case 'W':
				return 1;
			case 'P':
				return 1;
			case 'R':
				return -1;
			}
		}
		// Don't do any error handling!
		return 0;
	}

	/**
	 * UEberpruefe ob das uebergebene Zeichen ein gueltiges Smybol ist.
	 * 
	 * @param s
	 *            Ein Zeichen, das ein Symbol darstellen sollte.
	 * @return True wenn das Zeichen gueltig is, ansonsten false.
	 */
	// TODO: Implementiere Methode checkValidSymbol(char s)
	public static boolean checkValidSymbol(char s) {
		switch (s) {
		case 'L':
			return true;
		case 'S':
			return true;
		case 'W':
			return true;
		case 'P':
			return true;
		case 'R':
			return true;
		default:
			return false;
		}
	}

	public static void main(String[] args) {
		if (args.length != 1) {
			err.println("Usage: java RockPaperScissorsLizardSpockTournament letters");
			err.println();
			err.println("Letters is a continuous sequence of pairs of the following letters:");
			err.println("  S - Scissors");
			err.println("  P - Paper");
			err.println("  R - Rock");
			err.println("  L - Lizard");
			err.println("  W - Spock");
			err.println();
			err.println("A sequence must consist of at least one pair of those letters, ");
			err.println("where each pair consists of two letters. The first letter of a ");
			err.println("indicates the symbol that player A has chosen. The second letter ");
			err.println("indicates the symbol that player B has chosen. If the players ");
			err.println("played two rounds, two pairs are simply concatenated. There must ");
			err.println("be no space, comma or anything else separating two or more rounds!");
		} else {
			// TODO: Implementiere Schleife, die das Spielgeschehen auswertet.
			int zaehler = 0;
			String winner = new String();
			int score = 0;
			int scoreA = 0;
			int scoreB = 0;
			while (zaehler < args.length) {
				if (checkValidSymbol(args[0].charAt(zaehler + 1)) == false) {
					System.err.println("Invalid symbols in input!");
				} else if (whoWins(args[0].charAt(zaehler + 1),
						args[0].charAt(zaehler + 1)) == 0) {
					System.out.println("Draw.");
				} else if (whoWins(args[0].charAt(zaehler + 1),
						args[0].charAt(zaehler + 1)) > 0) {
					System.out.println("A wins.");
					score += 1;
					scoreA += 1;
				} else {
					System.out.println("B wins.");
					scoreB += 1;
					score -= 1;
				}
				zaehler++;
			}
			if (args.length == 0) {
				System.out.println("No symbols given on as input!");
			}
			if (args[0].length() == 0) {
				System.out.println("No symbols given on as input!");
			}
			if (args.length % 2 != 0) {
				System.err
						.println("An uneven number of symbols was given in the input!");
			}
			int rounds = args[0].length() / 2;
			System.out.println("The players played " + rounds + " rounds.");

			if (score > 0) {
				winner = "A";
				score = scoreA;
			} else if (score < 0) {
				winner = "B";
				score = scoreB;
			} else {
				System.out.println("It's a draw.");
			}
			System.out.println("Player " + winner + " wins with a score of "
					+ score + "!");
		}
	}
}

Bei "SRLW" müsste er eigentlich doch B mit 2 Punkten gewonnen haben, aber bei mir kommt lediglich:
"Draw.
An uneven number of symbols was given in the input!
The players played 2 rounds.
It's a draw.
Player wins with a score of 0!"
Was stimmt da nicht .-."

MfG,
- Deniz
 
Habe mich jetzt nicht komplett reingelesen aber müssten hier
Code:
} else if (whoWins(args[0].charAt(zaehler + 1),
                        args[0].charAt(zaehler + 1)) == 0) {
nicht 2 unterschiedliche Parameter übergeben werden?
Sowas wie zaehler und zaehler +1 oder wie auch immer du dir das vorgestellt hast?

Folgender code wundert mich auch etwas:
Code:
if (args.length % 2 != 0) {
                System.err
                        .println("An uneven number of symbols was given in the input!");
            }
hier überprüfst du wieviele Argumente du an die main übergeben hast.
Steht da tatsächlich sowas wie "SLRW" oder ähnliches drin? falls ja ist die Länge von args == 1 und die Überprüfung mittels mod 2 wird somit den Fehler provozieren:
"An uneven number of..."

Grüße!
 
Zuletzt bearbeitet:

d33eniz

Mitglied
Alles klar, ausgebessert, allerdings scheint mein Score-System nicht zu funktionieren .-."
Java:
import static java.lang.System.err;

public class RockPaperScissorsLizardSpockTournament {

	/**
	 * Zwei Spieler A und B haben sich fuer ihr Symbol entschieden. Diese
	 * Methode entscheidet nun, welcher der beiden Spieler gewinnt, oder ob ein
	 * Unentschieden vorliegt.
	 * 
	 * @param a
	 *            Das Symbol, fuer das sich A entschieden hat.
	 * @param b
	 *            Das Symbol, fuer das sich B entschieden hat.
	 * @return Wenn A gewinnt, wird 1 zurueckgegeben. Wenn B gewinnt, wird -1
	 *         zurueckgegeben. Bei Unentschieden wird 0 zurueckgegeben.
	 */
	public static int whoWins(char a, char b) {
		switch (a) {
		case 'S': // Sciccors
			switch (b) {
			case 'S':
				return 0;
			case 'R':
				return -1;
			case 'W':
				return -1;
			case 'P':
				return 1;
			case 'L':
				return 1;
			}
		case 'R': // Rock
			switch (b) {
			case 'R':
				return 0;
			case 'S':
				return 1;
			case 'W':
				return -1;
			case 'P':
				return -1;
			case 'L':
				return 1;
			}
		case 'W': // Spock
			switch (b) {
			case 'W':
				return 0;
			case 'S':
				return 1;
			case 'R':
				return 1;
			case 'P':
				return -1;
			case 'L':
				return -1;
			}
		case 'P': // Paper
			switch (b) {
			case 'P':
				return 0;
			case 'S':
				return -1;
			case 'W':
				return 1;
			case 'R':
				return 1;
			case 'L':
				return -1;
			}
		case 'L': // Lizard
			switch (b) {
			case 'L':
				return 0;
			case 'S':
				return -1;
			case 'W':
				return 1;
			case 'P':
				return 1;
			case 'R':
				return -1;
			}
		}
		// Don't do any error handling!
		return 0;
	}

	/**
	 * UEberpruefe ob das uebergebene Zeichen ein gueltiges Smybol ist.
	 * 
	 * @param s
	 *            Ein Zeichen, das ein Symbol darstellen sollte.
	 * @return True wenn das Zeichen gueltig is, ansonsten false.
	 */
	// TODO: Implementiere Methode checkValidSymbol(char s)
	public static boolean checkValidSymbol(char s) {
		switch (s) {
		case 'L':
			return true;
		case 'S':
			return true;
		case 'W':
			return true;
		case 'P':
			return true;
		case 'R':
			return true;
		default:
			return false;
		}
	}

	public static void main(String[] args) {
		if (args.length != 1) {
			err.println("Usage: java RockPaperScissorsLizardSpockTournament letters");
			err.println();
			err.println("Letters is a continuous sequence of pairs of the following letters:");
			err.println("  S - Scissors");
			err.println("  P - Paper");
			err.println("  R - Rock");
			err.println("  L - Lizard");
			err.println("  W - Spock");
			err.println();
			err.println("A sequence must consist of at least one pair of those letters, ");
			err.println("where each pair consists of two letters. The first letter of a ");
			err.println("indicates the symbol that player A has chosen. The second letter ");
			err.println("indicates the symbol that player B has chosen. If the players ");
			err.println("played two rounds, two pairs are simply concatenated. There must ");
			err.println("be no space, comma or anything else separating two or more rounds!");
		} else {
			// TODO: Implementiere Schleife, die das Spielgeschehen auswertet.
			String winner = new String();
			int zaehler = 0;
			int score = 0;
			int scoreA = 0;
			int scoreB = 0;
			while (zaehler < args.length) {
				if (checkValidSymbol(args[0].charAt(zaehler)) == false) {
					System.err.println("Invalid symbols in input!");
				} else if (whoWins(args[0].charAt(zaehler),
						args[0].charAt(zaehler + 1)) == 0) {
					System.out.println("Draw.");
				} else if (whoWins(args[0].charAt(zaehler),
						args[0].charAt(zaehler + 1)) > 0) {
					System.out.println("A wins.");
					score += 1;
					scoreA += 1;
				} else {
					System.out.println("B wins.");
					score -= 1;
					scoreB += 1;

				}
				zaehler++;
			}
			if (args.length == 0) {
				System.out.println("No symbols given on as input!");
			}
			if (args[0].length() % 2 != 0) {
			System.err.println("An uneven number of symbols was given in the input!");
			}
			int rounds = args[0].length() / 2;
			System.out.println("The players played " + rounds + " rounds.");

			if (score > 0) {
				winner = "A";
				score = scoreA;
			} else if (score < 0) {
				winner = "B";
				score = scoreB;
			} else {
				System.out.println("It's a draw.");
			}
			System.out.println("Player " + winner + " wins with a score of "
					+ score + "!");
			System.out.println(scoreA);
			System.out.println(scoreB);
			System.out.println(score);
		}
	}
}
habe ich nun dastehen und wenn ich beispielsweise "SRWL" eintippe spuckt er folgendes aus:
"B wins.
The players played 2 rounds.
Player B wins with a score of 1!
0
1
1"
Aber durch "score = scoreB" überschreibe ich doch den Wert von score und der müsste doch ausgegeben werden!?
Aber offensichtlich ist scoreB 1- warum? Die Schleife läuft doch 2x, d.h. da müsste eigentlich eine 2 stehen, tut es aber nicht- warum ned? ;_;"
 

Sunchezz

Bekanntes Mitglied
"B wins.
The players played 2 rounds.
Player B wins with a score of 1!
0
1
1"
Also wenn das deine gesamte Ausgabe ist, läuft die Schleife nicht zweimal ;)
Was dann auch ganz den Werten entsprechen würde.

Mich wundert auch das du keine Exception bekommst, aber da habe ich scheinbar grad nen Knoten im Kopf um die Uhrzeit^^

Doch du gehst die Länge des übergebenen Arguments durch.
Das ist beim aktuellen Beispiel 4. ("SWRL")
Code:
while (zaehler < args.length) {
erst "S", dann "W", dann "R", dann "L".
Wenn er dann beim letzten buchstaben angekommen ist sollte folgender Aufruf eigentlich ins Leere greifen:
Code:
args[0].charAt(zaehler + 1)
... denn nach "L", kommt nichts mehr.


Genauer habe ich jetzt nicht mehr hingesehen, vielleicht schafft das ja schon abhilfe ;)

EDIT:
Nochmal drüber geschaut...
Verstehe den Sinn einer dritten score Variable nicht so ganz, ist aber auch nicht wichtig.
Jedoch ziehst du, wenn "B" einen Durchgang gewinnt, vom (Gesamt)Score eins ab.
Und erst dann Vergleichst du den (Gesamt)Score mit 0.

Wieso Score nicht weglassen und ScoreA ><== ScoreB vergleichen??
Dein Weg erscheint mir als eine unnötige Erhöhung von potentiellen Fehlerquellen. Außerdem entspricht er meiner Meinung nach nicht der der logischen Frage, "Hat A oder B gewonnen", was irgendwie auch verständlicher wäre :)
 
Zuletzt bearbeitet:

Landei

Top Contributor
Ohne Gewähr, aber die inneren switches müsste man ungefähr so einsparen können:
Java:
case 'S' : return (int) Math.signum("RWSPL".indexOf(b) - 2);
 

d33eniz

Mitglied
Den Code bekomme ich ja Teilweise geliefert. Ich MUSS gewisse Zeilen übernehmen und sie ergänzen. Am Ende soll nämlich auch wirklich der Score mir der Variable "score" ausgegeben werden. Vllt. hätte ich mich klarer ausdrücken sollen.
Deswegen habe ich ja versucht am Ende der score Variablen scoreA oder scoreB zuzuordnen, damit ich das so abgeben kann.
Mein Problem ist, warum er die Schleife denn nicht 2x durchgeht. Aber nuja, Abgabe ist in 20 Minuten, somit habe ich die Aufgabe wenigstens (fast) geschafft. Keine Ahnung wo der Wurm jetzt drin ist, würd mich aber interessieren.
Auch der Draw-Fall scheint nicht zu funktionieren. Im Fall "PSSP" gewinnt iwie doch B und keine Ahnung. Aber wie gesagt, Zeit is rum =)

@Landei:
Das war so vorgegeben, musste ich so übernehmen, bzw, ergänzen =)
 

Landei

Top Contributor
Na dann wenigstens hier:

Java:
    public static boolean checkValidSymbol(char s) {
        return "LSWRP".indexOf(s) >= 0;
    }
 
M

MiDniGG

Gast
Wie Du schon sagtest leider zu spät. Trotzdem hier mein Verdacht:

Du übergibst dem Programm EINEN Parameter mit Inhalt "SRWL".
In der while prüfst Du aber die Länge (besser Anzahl) der übergebenen Parameter:

Java:
while (zaehler < args.length) {...}
hier 1.

Da Du aber sicher bist, dass args genau 1 lang ist, sollte es hier wohl
Code:
args[0].length
heißen. Damit überprüfst Du die Länge des übergeben Strings. Und dann hast Du am Ende auch 4 Schleifendurchläufe, da Du ja 4 Zeichen übergibst.

Jetzt möchstest Du aber nur 2 Durchläufe, da ja immer zwei Zeichen eine Runde ergeben. Daher einfach am Ende der while-Schleife das
Code:
zaehler++
durch
Code:
zaehler += 2;
ersetzen.
 

d33eniz

Mitglied
Ach, wie konnte ich das nur so verkacken .-."
Stimmt, daran lag's im Endeffekt. Ah, wäre das nur ne Stunde vor der Abgabe noch gekommen :D
Immerhin, jetz bin ich schlauer, ich markier's mal als erledigt.
Danke nochmals, 1A+ Forum hier :>
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Nerdinfekt Programmieranfänger, Schwierigkeiten mit der Programmierung Java Basics - Anfänger-Themen 6
S Schwierigkeiten beim Aufrücken von Arrays Java Basics - Anfänger-Themen 10
Azazel (Anfängerhilfe) awt.Graphics Schwierigkeiten Java Basics - Anfänger-Themen 6
C Hilfe - Kleines Programm macht mir Schwierigkeiten Java Basics - Anfänger-Themen 2
T OOP Schwierigkeiten mit OOP Java Basics - Anfänger-Themen 2
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
I Schwierigkeiten bei Ausgabe von KreisObjekten in Array Java Basics - Anfänger-Themen 4
N JDK installieren kompilier schwierigkeiten Java Basics - Anfänger-Themen 6
hdi Schwierigkeiten mit Fullscreen API Java Basics - Anfänger-Themen 3
S grundlegende schwierigkeiten Java Basics - Anfänger-Themen 11
S Schere, Stein, Papier Java Basics - Anfänger-Themen 13
K Schere Stein Papier Spiel Java Basics - Anfänger-Themen 3
J Schere, Stein, Papier Spiel - Logikfrage Java Basics - Anfänger-Themen 6
J Stein Schere Papier Java Basics - Anfänger-Themen 7
J Tetris-Stein wird nicht gezeichnet! Java Basics - Anfänger-Themen 9
Antoras Schere-Stein-Papier Spiel Java Basics - Anfänger-Themen 18
V Stein, Schere, Papier Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben