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.
Hallo Leute,
es soll ein Lotto-Spiel programmiert werden. Dabei soll jeweils mit 2 Arrays gearbeitet werden. Das eine ist für den Tipp des Spielers zuständig, das andere enthält 6 Zufallszahlen.
Zudem dürfen nur Zahlen zwischen 1 bis 49 eingegeben werden und es gibt bei der Tippabgabe keine doppelten Zahlen. Hier mein Programm:
Java:
import java.util.Random;
import java.util.Scanner;
class Lotto {
public static void main(String[] args) {
Random generator = new Random();
if (args.length == 1) {
generator.setSeed(Long.parseLong(args[0]));
}
Scanner s = new Scanner(System.in);
int ein = 0;
int feld[] = new int[6];
int ergebnis[] = new int[6];
int anzahl = 0;
int zahl = 0;
do {
ein = s.nextInt();
if ((ein < 1) || (ein > 49)) {
System.out.println("Nur ziwschen 1 und 49");
continue;
}
for (int i = 0; i < feld.length; i++) {
if (feld[i] == ein) {
System.out.println("Kam bereits vor");
continue;
}
}
feld[anzahl] = ein;
anzahl++;
} while (anzahl < 6);
for(int i=0; i<6;i++){
ergebnis[i] = generator.nextInt(49) + 1;
}
for (int i = 0; i < feld.length; i++) {
for (int j = 0; j < ergebnis.length; j++) {
if ((ergebnis[j]) == (feld[i]))
zahl++;
}
}
for (int i = 0; i < ergebnis.length; i++) {
System.out.println( i+1 + "te Zahl der Ziehung: " + ergebnis[i]);
}
System.out.println("Sie haben " + zahl + " Richtige!");
}
}
Wo könnte es da Probleme geben. In einem darauf ausgeführten Test wiederholt das Programm bei der Ausgabe der Zufallsszahlen eine und gibt die letzte Zufallszahl dann nicht mehr aus.
Bei einem anderen Test fängt das gleiche bei der 3. Zahl an. Am Ende fehlt auch wieder eine?
Wo könnte der Fehler dazu im Programm sein?
@LeonInfo19
Du stehst hier vor mehreren Problemen, denn so kann es nicht funktionieren.
Java:
for (int i = 0; i < feld.length; i++) {
for (int j = 0; j < ergebnis.length; j++) {
if ((ergebnis[j]) == (feld[i]))
zahl++;
}
}
Gibt zwar an, wieviel Zahlen ich richtig habe aber leider nicht welche.
Außerdem:
Java:
do
{
System.out.println("Vor der Eingabe");
ein = s.nextInt();
System.out.println("Zahlenreihe");
if ((ein < 1) || (ein > 49))
{
System.out.println("Nur ziwschen 1 und 49");
System.out.println(anzahl);
continue;
}
System.out.println("Vorhanden oder nicht");
for (int i = 0; i < feld.length; i++)
{
if (feld[i] == ein)
{
continue;
}
}
System.out.println("Anzahl: " + anzahl);
feld[anzahl] = ein;
anzahl++;
} while (anzahl < 6);
/** Output */
Vor der Eingabe
1
Zahlenreihe
Vorhanden oder nicht
Anzahl: 0
Vor der Eingabe
1
Zahlenreihe
Vorhanden oder nicht
Anzahl: 1
Vor der Eingabe
1
Zahlenreihe
Vorhanden oder nicht
Anzahl: 2
Vor der Eingabe
1
Zahlenreihe
Vorhanden oder nicht
Anzahl: 3
Vor der Eingabe
1
Zahlenreihe
Vorhanden oder nicht
Anzahl: 4
Vor der Eingabe
1
Zahlenreihe
Vorhanden oder nicht
Anzahl: 5
1te Zahl der Ziehung: 22
2te Zahl der Ziehung: 25
3te Zahl der Ziehung: 38
4te Zahl der Ziehung: 42
5te Zahl der Ziehung: 42
6te Zahl der Ziehung: 2
Sie haben 0 Richtige!
Wenn die Zahl bereits gezogen war, wird die Schleife zwar verlassen, aber das Programm läuft weiter und nicht wie von dir erwünscht, von der do{... Stelle an. Gehe den Output hier Schritt für Schritt durch und du wirst es sehen
Prüfe gleich nach der Eingabe, ob die Zahl bereits gezogen wurde. Ich würde hier die Prüfung in eine eigene Methode auslagern und die Methode ein boolean als Typ zurückgeben lassen. Nebenbei wäre war, wenn die Zahl x im Array y bereits vorhanden ist. Das hat den Vorteil, dass nach continue die Schleife von deiner gewünschten Stelle wieder anläuft.
Dann würde ich prüfen, ob die Zahl sich im Zahlenbereich befindet und nur dann, diese im Array y aufnehmen und alle weitere Schritte wie die Variable anzahl hochsetzen, durchführen.
Ok das mit der eigenen Methode haben wir noch nicht so gehabt.
Wir haben thematisch erst mit den Arrays begonnen, also sind da noch am Anfang:
Eine Zwischenfrage:
Wie wird dadurch mein Fehler behoben?
Ich hätte gedacht es geht um folgende Zeile
Java:
for (int i = 0; i < ergebnis.length; i++) {
System.out.println( i+1 + "te Zahl der Ziehung: " + ergebnis[i]);
}
Sorry für die späte Antwort.
Ja genau. Ich gebe nur die Zufallszahlen aus.
Aber der Test liefert, dass eine Zahl doppelt ausgeben und am Ende die letzte fehlt.
Verstehst du was ich meine?
@LeonInfo19
Du musst natürlich dein ergebnis-Array genau so wie das feld-Array füllen: keine Zahl darf doppelt vorkommen.
Du könntest also prüfen, ob eine Zahl n im Array ergebnis bereits vorkommt und nur wenn nein, es im ergebnis-Array aufgenommen werden darf.
Ich persönlich benutze anstelle continue oder break <variablenname> doch lieber boolean, weil ich hier ein viel besseren Überblick über den Ablauf und wesentlich vertrauter mit einfachen Typen bin.
So auch hier habe ich dir ein Beispiel geschrieben, wie ich die Angelegenheit lösen würde:
Java:
public static void main(String[] args)
{
Random generator = new Random();
boolean bereitsGezogen = false;
int zahl = 0;
int[] automatisch = new int[6];
do
{
int random = generator.nextInt(49) + 1;
for (int i = 0; i < automatisch.length; i++)
{
if (automatisch[i] == random)
{
bereitsGezogen = true;
}
}
if (!bereitsGezogen)
{
automatisch[zahl] = random;
zahl++;
} else
{
bereitsGezogen = false;
}
} while (zahl < 6);
}
Dein continue bezieht sich auf die for-Schleife, in der es steht.
Unabhängig davon: @Javinner hat vollkommen Recht, continue/break sind nämlich nichts anderes als Sprunganweisungen - das wohl beste Werkzeug, um Spaghetti-Code zu schreiben.
Unabhängig davon: @Javinner hat vollkommen Recht, continue/break sind nämlich nichts anderes als Sprunganweisungen - das wohl beste Werkzeug, um Spaghetti-Code zu schreiben.
Na ja, bevor ich mich durch zusätzliche Booleans und/oder Abfragen kämpfen muß, habe ich es schon lieber wenn man einfach raus springt und so für klare Verhältnisse sorgt. Da finde ich continue und break schon deutlich besser als "goto/comefrom sonstwo". Aber wenn es so unübersichtlich wird, ist das ja meistens ohnehin ein Indikator dafür, dass vernünftig benannte, zusätzliche Methoden fehlen, so dass die Diskussion um continue/break sich oft nur um ein Phantomproblem dreht.
@Meniskusschaden
Der TE hat erwähnt, dass diese erst bei Arrays sind und Methoden wohl ein Zukunftsthema sind.
Mit Methoden wäre mein Rat anders ausgefallen.
Na ja, bevor ich mich durch zusätzliche Booleans und/oder Abfragen kämpfen muß, habe ich es schon lieber wenn man einfach raus springt und so für klare Verhältnisse sorgt.
Danke euch. Dann habe ich es jetzt gelernt, eher nicht auf Sprnganweisungen zu setzen. Im 1. Teil meines Programms komme ich aber trotzdem nicht drum herum:
Ja stimmt
Vielen Dank
Das Programm geht jetzt mithilfe der boolschen Variable. Wisst ihr warum das mit continue nicht geklappt hat. Ich würde es gerne zum Verständnis wissen?
Es gilt das Prinzip "teile und herrsche". Man teilt ein nicht unmittelbar lösbares Problem so lange in kleinere Probleme auf, bis sich diese unmittelbar lösen lassen.
Der Algorithmus wäre wie folgt:
Code:
anzahl := 0
wiederhole
eingabe := nächste vom Benutzer eingegebene Ganzzahl
falls eingabe gültig:
verarbeite eingabe
erhöhe anzahl um 1
sonst:
gib Fehler aus
so lange anzahl < 6
Ich denke, das ist leicht verständlich. Mit Methoden kann man das fast 1:1 in Java formulieren. Ohne Methoden muss man die einzelnen Schritte "inline" ersetzen.
Was ich damit sagen will: fang grob an und verfeinere, dann wird einiges leichter.
Danke. Vllt hätte ich es mir wirklich nochmal sowie du in Worten überlegen sollen, um Fehler zu vermeiden.
Danke dir und euch allen für eure Hilfe
Ich wünsche dir mihe7 und den anderen noch einen schönen Tag