Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Deine Klasse Wuerfel hat eine Methode wuerfeln, die einen int zurückgibt. Diesen Rückgabewert musst du dir zunächst einmal beim Aufruf der Methode merken. (Das System.out.println(zahl); in wuerfeln würde ich dagegen weglassen.)
Du erzeugst ein Array mit den Häufigkeiten (am Anfang mit 0 initialisiert).
Jedesmal, wenn eine Zahl gewürfelt wird, zählst du den passenden Eintrag um eins hoch.
import java.util.Scanner;
public class Start {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
boolean quit = true;
while(quit == true) {
System.out.println("Wie viele Runden möchten Sie würfeln?: ");
int runden = s.nextInt();
if(runden < 3) {
System.out.println("Sie müssen mindestens 3 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden > 20) {
System.out.println("Sie dürfen nicht mehr als 20 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden >= 3 && runden <=20) {
quit = false;
}
Wuerfel wuerfel = new Wuerfel(1,true);
int[] zufallsZahlen = new int[1];
for(int i=1; i<=runden; i++) {
System.out.print("Ergebnis aus Runde "+i+": ");
for(int j=0; j<zufallsZahlen.length; j++) {
wuerfel.wuerfeln();
int[] moeglicheZahlen = haeufigkeitDerWuerfe(zufallsZahlen, j);
}
}
}
}
public static int[] haeufigkeitDerWuerfe(int[] zufallsZahlen, int durchlaeufe) {
int[] moeglicheZahlen = {1,2,3,4,5,6};
for(int i=0; i<moeglicheZahlen.length; i++) {
if(zufallsZahlen[durchlaeufe] == moeglicheZahlen[i]) {
System.out.println("Die Häufigkeit von "+moeglicheZahlen+" ist: "+i );
}
}
return moeglicheZahlen;
}
}
So habe ich die Main umgeschrieben. Es wird mir jedoch nichts ausgegeben, außer die Würfe an sich. Stimmt es denn von der Logik her?
Vielen Dank für die Tipps : )
Du hast meinen ersten Tipp immer noch nicht berücksichtigt: Du musst den Rückgabewert erst einmal in einer lokalen Variablen speichern!
Dann sehen wir weiter.
Das Wort "static" sollte in deinem Code nur vor der main-Funktion vorkommen.
Und deine main-Funktion macht viel zu viel.
Eine typische main-Funktion sieht so aus:
Java:
public class MeineKlasse {
public static void main (String args) {
MeineKlasse meineKlasse = new MeineKlasse();
meineKlasse.tuWas();
}
public void tuWas() {
// hier steht der Code, der vorher in der main stand
}
}
Und die Abfrage, wieviele Runden gespielt werden sollen, würde ich auch in eine eigene Funktion auslagern:
Am besten schreibst du den Code als nächsten Schritt um zu:
Java:
import java.util.Scanner;
public class Start {
public static void main(String[] args) {
Start start = new Start();
start.anzahlWuerfe();
}
public void anzahlWuerfe() {
int runden = anzahlRundenAbfragen();
System.out.println("Es werden " + runden + " Runden gewürfelt");
/*
weiterer Code
*/
}
int anzahlRundenAbfragen() {
int runden = 0;
Scanner s = new Scanner(System.in);
boolean quit = true;
while(quit == true) {
System.out.println("Wie viele Runden möchten Sie würfeln?: ");
runden = s.nextInt();
if(runden < 3) {
System.out.println("Sie müssen mindestens 3 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden > 20) {
System.out.println("Sie dürfen nicht mehr als 20 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden >= 3 && runden <=20) {
quit = false;
}
}
return runden;
}
}
import java.util.Scanner;
public class Start {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
boolean quit = true;
while(quit == true) {
System.out.println("Wie viele Runden möchten Sie würfeln?: ");
int runden = s.nextInt();
if(runden < 3) {
System.out.println("Sie müssen mindestens 3 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden > 20) {
System.out.println("Sie dürfen nicht mehr als 20 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden >= 3 && runden <=20) {
quit = false;
}
zufallsZahlen(runden);
}
}
public static void zufallsZahlen(int runden) {
Wuerfel wuerfel = new Wuerfel(1,true);
int[] zufallsZahlen = new int[1];
for(int i=1; i<=runden; i++) {
System.out.print("Ergebnis aus Runde "+i+": ");
for(int j=0; j<zufallsZahlen.length; j++) {
int gewuerfelt = wuerfel.wuerfeln();
int[] moeglicheZahlen = haeufigkeitDerWuerfe(zufallsZahlen, j);
}
}
}
public static int[] haeufigkeitDerWuerfe(int[] zufallsZahlen, int durchlaeufe) {
int[] moeglicheZahlen = {1,2,3,4,5,6};
for(int i=0; i<moeglicheZahlen.length; i++) {
if(zufallsZahlen[durchlaeufe] == moeglicheZahlen[i]) {
System.out.println("Die Häufigkeit von "+moeglicheZahlen+" ist: "+i );
}
}
return moeglicheZahlen;
}
}
Das entspricht nicht ganz deinem Vorschlag, denn in der Aufgabenstellung heißt es, dass die Klasse Start eben diese Funktionen übernehmen soll. Das mit static habe ich versucht zu ändern, jedoch erscheint dann eine Fehlermeldung beim Methodenaufruf. Aber woran liegt es, dass die Häufigkeit nicht ausgegeben wird? Etwa an dem static?
Solange du noch "static" benutzt, ist dein Code nicht lesbar. Das hat auch nichts mit der "Aufgabenstellung" zu tun.
Erst wenn dieses blödsinnige "static" los wirst, ist die Aufgabe lösbar.
Ich weiß, das sollte so nicht sein. Momentan habe ich aber keine Idee, wie es anders geht. Der Code ist sowieso ein einziges Durcheinander. Ein Neustart wäre vielleicht nicht schlecht.
Das gehörte nicht mehr zum Code, habe nur vergessen, es raus zu löschen.
Ich glaube, diese Aufgabe ist noch eine Nummer zu hoch für mich. Vielleicht probiere ich es morgen noch mal. Heute war es zu viel.
Vielen Dank für deine Tipps und deine Mühe : )
Vielleicht solltest Du Dir einfach einmal überlegen, wie du das machen würdest mit Stift und Papier?
Wie ist da der Ablauf?
Also ich gebe Dir einen Würfel und du sollst jetzt 20 Mal würfeln und mir dann am Ende sagen, wie oft jede Zahl gewürfelt wurde. Ist das etwas, das du irgendwie hin kriegen kannst?
Das es -neben der Verwendung von Zettel und Stift- auch mit Java möglich ist, zeigt u.a. folgendes Beispiel mit Streams: https://farenda.com/java/java-8-count-frequency-of-numbers/ (jetzt gilt es zu recherchieren, was hinter den Kulissen der Streams passiert)
Wobei es aus meiner Sicht nicht wirklich zielführend ist, sich im frühen Stadium mit Streams zu beschäftigen.
Generell ist der erste Schritt immer, sich zu überlegen, wie man vorgehen sollte. Und wenn es Probleme gibt, sich etwas vorzustellen, dann ist Stift und Papier kaum zu übertreffen. (Wobei natürlich die Detailtiefe mit der Zeit immer geringer wird.)
So noch einmal ein kleines Update. Habe die letzten zwei Methoden komplett neu gemacht. Ich denke, so kann man es lassen, oder gibt es noch Fehler? Wenn nicht, versuche ich mich an der Häufigkeitsanalyse.
Java:
import java.util.Scanner;
public class Start {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
Start start = new Start();
boolean quit = true;
while(quit == true) {
System.out.println("Wie viele Runden möchten Sie würfeln?: ");
int runden = s.nextInt();
if(runden < 3) {
System.out.println("Sie müssen mindestens 3 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden > 20) {
System.out.println("Sie dürfen nicht mehr als 20 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden >= 3 && runden <=20) {
quit = false;
}
start.zufallsZahlen(runden);
}
}
public Wuerfel zufallsZahlen(int runden) {
Wuerfel wuerfel = new Wuerfel(1,true);
int[] gewuerfelteZahlen = new int[runden];
for(int i=0; i<gewuerfelteZahlen.length; i++) {
gewuerfelteZahlen[i] = wuerfel.wuerfeln();
}
for(int j=0; j<runden; j++) {
System.out.println("Ergebnis aus Runde "+(j+1)+": "+gewuerfelteZahlen[j]);
}
haeufigkeitDerZahlen(gewuerfelteZahlen);
return wuerfel;
}
/*public void haeufigkeitDerZahlen(int[] gewuerfelteZahlen) {
int[] moeglicheZahlen = {1,2,3,4,5,6};
for(int i=0; i<moeglicheZahlen.length; i++) {
}
}*/
}
Dann probiere es doch einmal aus. Gib z.B. 10000 Runden ein. Damm kommt die Fehlermeldung und es startet doch die Verarbeitung der Zufallszahlen. Das wird nicht das Verhalten sein, das Du willst.
Und dann ist quit doch true. Also musst Du es nicht immer wieder auf true setzen.
Und wenn quit bereits ein boolean ist, dann musst Du nicht quit==true prüfen. quit==true ist das Gleiche wie quit.
So Logik-Fehler wie den ersten, vermeidet man sehr gut, in dem man die Logik Teile verkleinert:
Java:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
Start start = new Start();
int runden = getNumberOfRounds();
start.zufallsZahlen(runden);
}
public static int getNumberOfRounds() {
Scanner s = new Scanner(System.in);
while(true) {
System.out.println("Wie viele Runden möchten Sie würfeln?: ");
int runden = s.nextInt();
if(runden < 3) {
System.out.println("Sie müssen mindestens 3 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die Eingabe.");
}else if(runden > 20) {
System.out.println("Sie dürfen nicht mehr als 20 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die Eingabe.");
}else if(runden >= 3 && runden <=20) {
return runden;
}
}
}
Also so Dinge einfach in eigene Methoden auslagern. So macht man den Code auch deutlich lesbarer. (Das war jetzt nur der Ansatz - das kann man noch deutlich weiter treiben....)
Stimmt, es wird trotzdem verarbeitet. Ich habe es jetzt so gelöst und verändert, find ich etwas einfacher. Wenn ich den Code auslagere, würde die Main ja fast gar nichts mehr machen. Ich werde es aber trotzdem mit einer Extramethode probieren, zur Übung. Danke für den Tipp.
Java:
import java.util.Scanner;
public class Start {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
Start start = new Start();
int runden = 0;
boolean quit = true;
while(quit) {
System.out.println("Wie viele Runden möchten Sie würfeln?: ");
runden = s.nextInt();
if(runden < 3) {
System.out.println("Sie müssen mindestens 3 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden > 20) {
System.out.println("Sie dürfen nicht mehr als 20 Runden würfeln!");
System.out.println("Bitte wiederholen Sie die eingabe.");
quit = true;
}else if(runden >= 3 && runden <=20) {
quit = false;
start.zufallsZahlen(runden);
System.out.println("Möchten Sie noch einmal? J->ja, N->nein: ");
String antwort = s.next();
if(antwort.equals("J")) {
quit = true;
}else if(antwort.equals("N")) {
quit = false;
}
}
}
}
public Wuerfel zufallsZahlen(int runden) {
Wuerfel wuerfel = new Wuerfel(1,true);
int[] gewuerfelteZahlen = new int[runden];
for(int i=0; i<gewuerfelteZahlen.length; i++) {
gewuerfelteZahlen[i] = wuerfel.wuerfeln();
}
for(int j=0; j<runden; j++) {
System.out.println("Ergebnis aus Runde "+(j+1)+": "+gewuerfelteZahlen[j]);
}
haeufigkeitDerZahlen(gewuerfelteZahlen);
return wuerfel;
}
/*public void haeufigkeitDerZahlen(int[] gewuerfelteZahlen) {
int[] moeglicheZahlen = {1,2,3,4,5,6};
for(int i=0; i<moeglicheZahlen.length; i++) {
}
}*/
}