Zufalsszahl soll sich nicht wiederholen

Kenan

Mitglied
Liebe Forummitglieder,

ich implementiere ein Spiel. Hierbei geht es darum die gestellte Frage richtig zu bentworten. Der User darf ein Hinweis bekommen als Buchstaben. Hier mal ein Fallbeispiel:
Die Frage lautet: "angenehmer, feiner Geruch.
Die Antwort lautet: "Duft"

Der Spieler bekommt auf Wunsch einen Hinweis in form von Buchstaben. z.B. "D" oder"f"
Diese buchstaben werden vom Antwort-Wort zufällig ausgewählt. Manchmal kommt aber der gleiche Buchstabe wieder.

Ich benötige etwas womit ich es verhindern kann, das die eine Zufallszahl sich wiederholt und somit sich auch der Buchstabe sich wiederholt.

Der Konkrete Fall mit der Zufallszahl ist in der Klasse Aktionen in der Methode buchstabenNehmen()

Ich bitte um eure Hilfe und Unterstützung. Wäre super wenn jemand mir einen Ansatz geben könnte.

VG Kenan

Ich habe drei Klassen: Daten, Aktionen und TestAktionen

Hier die Klasse Daten.
Java:
public class Daten {

    private String[] fragen = new String[14];
    private String[] antworten = new String[14];

    public Daten(String[] fragen, String[] antworten) {
        this.fragen = fragen;
        this.antworten = antworten;

        fragen[0] = "Kleinste, aus einem oder mehreren Lauten gebildete Einheit innerhalb einer Wortform";
        antworten[0] = "Silbe";
        fragen[1] = "angenehmer, feiner Geruch";
        antworten[1] = "Duft";
        fragen[2] = "nach innen gewölbt";
        antworten[2] = "Konkav";
        fragen[3] = " Dünner Mensch";
        antworten[3] = "Abgemagert";
        fragen[4] = "pikante, dickflüssige Soße zum Würzen";
        antworten[4] = "Ketchup";
        fragen[5] = "mit freudiger Bereitwilligkeit, Vergnügen";
        antworten[5] = "Gerne";
        fragen[6] = "den Intellekt betreffend; verstandesmäßig, geistig";
        antworten[6] = "Intellektuell";
        fragen[7] = " Person, die einen Mord begangen hat";
        antworten[7] = "Mörder";
        fragen[8] = "über das gewohnte Maß hinausgehend";
        antworten[8] = "Außergewöhnlich";
        fragen[9] = "sich (in einer bestimmten Weise) verhalten, betragen";
        antworten[9] = "benehmen";
        fragen[10] = "philosophische Disziplin oder Lehre, die das hinter der sinnlich erfahrbaren, natürlichen Welt Liegende, die letzten Gründe und Zusammenhänge des Seins behandelt";
        antworten[10] = "metaphysik";
        fragen[11] = "Einrichtungsgegenstand, mit dem ein Raum ausgestattet ist";
        antworten[11] = "Möbel";
        fragen[12] = "für ein Individuum spezifische, relativ konstante Weise des Fühlens, Erlebens, Handelns und Reagierens";
        antworten[12] = "Temperament";
        fragen[13] = " weder Lust noch Unlust empfindend oder erkennen lassend";
        antworten[13] = "gleichgültig";
    }

    public String[] getFragen() {
        return fragen;
    }

    public void setFragen(String[] fragen) {
        this.fragen = fragen;
    }

    public String[] getAntworten() {
        return antworten;
    }

    public void setAntworten(String[] antworten) {
        this.antworten = antworten;
    }
}


Hier die Klasse Aktionen, wo die Methoden implementiert sind.
Java:
import java.util.*;
import java.util.ArrayList;

public class Aktionen extends Daten {

    Scanner in = new Scanner(System.in);
    int i;
    // Nehme die gleiche Länge für das Temporäre Array wie das AntwortArray
    String[] temp = new String[getAntworten()[i].length()];
    int[] sammleZZ = new int[getAntworten()[i].length()];

    public Aktionen(String[] fragen, String[] antworten) {
        super(fragen, antworten);

    }

    // Methode: Zeigt Frage von der Stelle i an.
    public void frageAnzeigen(int i) {
        System.out.println(getFragen()[i]);
    }

    // Zeige zufälligen Buchstaben vom AntwortenArray.
    public int buchstabenNehmen(int i) {

       
        // Nehme die gleiche Länge für das Temporäre Array wie die Länge des Wortes im jeweiligen AntwortArray
        String[] temp = new String[getAntworten()[i].length()];

       
        // Zufallszahl
        int z;
        z = ((int) (Math.random() * getAntworten()[i].length()));

        // Packe den char an die gleiche Stelle ins tempArray wie das AntwortArray
        temp[z] = String.valueOf(getAntworten()[i].charAt(z));

        // Zeige Inhalt vom Array
        for (int j = 0; j < temp.length; j++) {

            System.out.println(temp[j]);
        }

       

        System.out.println("Geben Sie b für einen neuen Buchstaben ein oder l wenn Sie auflösen möchten.");
        String entscheidung = in.nextLine();
        if (entscheidung.equals("b")) {
            buchstabenNehmen(i);

        } else if (entscheidung.equals("l")) {
            System.out.println("Fertig mit Buchstaben nehmen.");
        }

        return i;
    }

    public void aufloesen(int i) {

        System.out.println("Geben Sie die Antwort ein.");
        String antwort = in.next();

        if (antwort.equals(getAntworten()[i])) {
            System.out.println("Die Lösung ist korrekt: " + getAntworten()[i]);

        } else {
            System.out.println("Die Lösung ist falsch. Versuchen Sie es erneut.");
        }

    }

}

Hier die Klasse mit der Main-Methode. Hier habe ich ein Menü drinnen womit ich die jeweiligen Methoden aufrufe.
Java:
import java.io.ObjectInputStream.GetField;
import java.util.ArrayList;
import java.util.Scanner;

public class TestAktionen {

    public static void main(String[] args) {
       
   
       
        String[] fragen = new String[14];
        String[] antworten = new String[14];
       
        Aktionen ob1 = new Aktionen(fragen, antworten);
        Scanner in = new Scanner(System.in);
       
        boolean helper = false;
        while (!helper) {
            System.out.println("Bitte wählen Sie aus!\n");
            System.out.println("1. Spiel beginnen");
            System.out.println("2. BuchstabenNehmen");
            System.out.println("3. Auflösen");
            System.out.println("4. Spiel beenden");
           
            int i = 0;
            int menu = in.nextInt();

            switch (menu) {

            case 1:
                if(i <= 13) {
               
                ob1.frageAnzeigen(i);
               
                i++;
                }
                break;
            case 2:
                ob1.buchstabenNehmen(i);
                break;

            case 3:
                ob1.aufloesen(i);
                break;
               
            case 4: // Bei Auswahl 4, wird das Program beendet.
                helper = true;
                System.out.println("Das Spiel wurde beendet. ");
                break;

            default:
                // Falls der User eine Zahl außerhalb der Spanne 1-3 eingibt, wird eine
                // Fehlermeldung ausgegeben.
                System.out.println("Falsche Eingabe! Zahlen nur im Bereich 1-3 möglich");
                break;
            }

        }

    }
}
 

Flown

Administrator
Mitarbeiter
Die einfachste Variante wäre du nimmst dein Wort, machst ein char array daraus, ein shuffle auf das array und gibst dann einfach buchstabe für buchstabe zurück.
 

Code-Mode

Mitglied
Nur kurz überflogen und auch nicht viel Zeit.
Aber wenn Antwort = "Baum" könntest du ein Array oder Liste oder etc.. haben mit jedem einzelnen Buchstaben
[B,a,u,m] und dann einen zufälligen index rausnehmen.
z.B. 1
dann löscht du diesen Buchstaben und hälst nur noch [B,u,m]
und von diesen könnte dann wieder ein zufälliges Element genommen werden.

Java:
List<String> myList = new ArrayList<String>(Arrays.asList("Baum".split("")));
System.out.println(myList); // [B, a, u, m]
System.out.println(myList.remove(1)); // a
System.out.println(myList); // [B, u, m]
 

Kenan

Mitglied
Die einfachste Variante wäre du nimmst dein Wort, machst ein char array daraus, ein shuffle auf das array und gibst dann einfach buchstabe für buchstabe zurück.

Nur kurz überflogen und auch nicht viel Zeit.
Aber wenn Antwort = "Baum" könntest du ein Array oder Liste oder etc.. haben mit jedem einzelnen Buchstaben
[B,a,u,m] und dann einen zufälligen index rausnehmen.
z.B. 1
dann löscht du diesen Buchstaben und hälst nur noch [B,u,m]
und von diesen könnte dann wieder ein zufälliges Element genommen werden.

Java:
List<String> myList = new ArrayList<String>(Arrays.asList("Baum".split("")));
System.out.println(myList); // [B, a, u, m]
System.out.println(myList.remove(1)); // a
System.out.println(myList); // [B, u, m]

Hi Flown und Code-Mode

danke für den Tipp. Ich habe vergessen zu erwähnen, das ich dem Spieler die Buchstabenhinweise wie folgt geben will. Ich habe versucht meinen Beitrag nochmal zu bearbeiten. Dieses wird anscheinend nicht angeboten. Ich erkläre es nun hier. Also weiter zum Beispiel:

Beispielantwort: "Duft"

Auf Wunsch bekommt der Spieler einen Hinweis.
Erster Hinweis: _ _ f _

Der User Wünscht sich einen weiteren hinweis usw.
Zweiter Hinweis: D _ f _
Dritter Hinweis: D _ f t

Das heißt ich darf das Array nicht mischen.
 

Flown

Administrator
Mitarbeiter
Zum Beispiel so:
Java:
String word = "Duft";
int[] indices = shuffle(IntStream.range(0, word.length()).toArray());
System.out.println(Arrays.toString(indices));
System.out.println(Arrays.stream(indices).map(word::charAt).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append));
und mit shuffle:
Java:
public static int[] shuffle(int[] arr) {
  Objects.requireNonNull(arr);
  Random rand = ThreadLocalRandom.current();
  for (int i = arr.length - 1; i > 0; i--) {
    int idx = rand.nextInt(i);
    int t = arr[i];
    arr[i] = arr[idx];
    arr[idx] = t;
  }
  return arr;
}
 

mihe7

Top Contributor
Oder so:
Java:
public class Test {
    private int[] pos;
    private int remaining;

    public Test(int len) {
        pos = new int[len];
        for (int i = 0; i < len; i++) {
            pos[i] = i;
        }
        remaining = len;
    }

    public boolean hasNext() {
        return remaining > 0;
    }

    public int next() {
        int ix = (int)(Math.random() * remaining);
        int result = pos[ix];
        remaining--;
        pos[ix] = pos[remaining];
        return result;
    }

    public static void main(String[] args) {
        String antwort = "Duft";
        Test test = new Test(antwort.length());
        int i = 0;
        while (test.hasNext()) {
            int ix = test.next();
            System.out.printf("%d. Tipp: %c an Position %d\n",
                    ++i, antwort.charAt(ix), ix);
        }
    }
}
 

Kenan

Mitglied
Danke euch beiden. In euren Code-Beispielen ist ne Menge die für mich neu sind. Deshlab verstehe ich euren Quelltext noch nicht. Ich möchte die Sachen auch nicht einfach copy und paste einsetzen. Ich möchte verstehen was ich implementiere. Den Instream habe ich schonmal gegoogelt und verstanden. Die anderen Sachen muss ich mir noch anschauen und ggf. aneignen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
DrahtEck Schleife soll wieder da anfangen wo ich es möchte ! Java Basics - Anfänger-Themen 17
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
Com.Roter Wie soll ich lernen? Java Basics - Anfänger-Themen 17
T code so schreiben das er von sich selber anpasst (code soll die anzahl aller bustaben bestimmen) Java Basics - Anfänger-Themen 16
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
I aus 2 random zahlen soll nur die ungerade summe der beiden genommen werden. Java Basics - Anfänger-Themen 13
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
R App soll selbstständig reagieren, anstatt via Models Java Basics - Anfänger-Themen 0
A Wenn eine Zahl durch 7 teilbar ist, soll statt der Zahl ein ‘*‘ angezeigt werden. java? Java Basics - Anfänger-Themen 47
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
HeiTim Brauche Hilfe soll ein nummeriertes Feld ausgeben lassen Java Basics - Anfänger-Themen 17
O Ich habe einen String und soll mit matches schauen, ob ein Buchstabe zu einer geraden ANzahl im String vorkommt, wie soll das gehen? Java Basics - Anfänger-Themen 7
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
B Java Programm soll mit Python kommunizeren Java Basics - Anfänger-Themen 1
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
MichelNeedhelp Brauche zu diesem Labyrinth ein Skript? Der Hamster soll im Urzeigersinn das ganze Labyrinth abgehen und wieder an seinem Ursprungsplatz sein. Java Basics - Anfänger-Themen 40
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
kazzam94 Methode soll Array von Boolean zurückgeben Java Basics - Anfänger-Themen 5
S Scanner soll Groß-/ Kleinschreibung ignorieren Java Basics - Anfänger-Themen 2
E Division von BigInteger soll Gelitkommazahl liefern Java Basics - Anfänger-Themen 46
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
E Methode soll andere Methode der selben Klasse aufrufen Java Basics - Anfänger-Themen 28
S Vergleichen ob der Integer der benutzt eingeben werden soll überhaupt ein int ist Java Basics - Anfänger-Themen 1
C Ganzzahlige Werte in Boolean ausgeben und überprüfen ob Primzahl oder nicht, wenn es keine Primzahl ist soll es die Primfaktorzerlegung ausgeben Java Basics - Anfänger-Themen 4
E Kreis soll eine Raupe darstellen Java Basics - Anfänger-Themen 37
V Erste Schritte for-Schleife; Ausgabe soll alle 5 Sekunden erfolgen. Java Basics - Anfänger-Themen 4
H Koordinateneingabe im 2D Array soll true/false zurückgeben Java Basics - Anfänger-Themen 5
D Etwas unsicher wie es weitergehen soll Java Basics - Anfänger-Themen 2
N Bewegtes Objekt soll sich um eine Parallele bewegen Java Basics - Anfänger-Themen 0
B Button soll sowohl auf Klicken als auch auf die Enter-Taste reagieren Java Basics - Anfänger-Themen 9
B Derzeit JSF - Projekt, später soll MobileApp folgen Java Basics - Anfänger-Themen 5
scratchy1 Wie deklariert man eine Methode, die ein Objekt zurückgeben soll? Java Basics - Anfänger-Themen 22
V Vererbung Subklasse soll Superklasse verändern Java Basics - Anfänger-Themen 2
T Random soll Zufallszahl beibehalten. Java Basics - Anfänger-Themen 11
C Objekt soll ein Array sein. Java Basics - Anfänger-Themen 15
N Ich weiß nicht, wie ich meinen Code richtig designen soll und komme nicht weiter Java Basics - Anfänger-Themen 4
W Eigener Iterator soll mehrdimensionales Array durchlaufen Java Basics - Anfänger-Themen 4
P Methode soll Variable einer anderen Klasse ändern. Wie? Java Basics - Anfänger-Themen 1
J Kopierte Datei soll alte ersetzen. Java Basics - Anfänger-Themen 6
A Variablen Main Klasse soll auf eine andere Klasse zugreifen Java Basics - Anfänger-Themen 3
I Programm tut nicht was es soll :) Java Basics - Anfänger-Themen 5
Tommy135 Klassen jComboBox macht nicht was sie soll Java Basics - Anfänger-Themen 4
D JButton soll Farbe von JTextfield ändern Java Basics - Anfänger-Themen 5
R While-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 24
kilopack15 Methode soll int-Array zurückgeben Java Basics - Anfänger-Themen 2
S Variable in JTextField soll immer um 5 zunehmen Java Basics - Anfänger-Themen 8
S JButton soll für bestimmte Zeit verschwinden Java Basics - Anfänger-Themen 5
J-Gallus Ein Getter bekommt eine anderen Type als er Return soll Java Basics - Anfänger-Themen 9
L Bei falscher Eingabe soll NaN zurückgegeben werden, Rückgabetyp jedoch double Java Basics - Anfänger-Themen 3
W drawLine(...) - Linie soll nur begrenzt lang sein Java Basics - Anfänger-Themen 9
I Fenster A soll Fenster B schliessen Java Basics - Anfänger-Themen 5
A Variablen Variable soll ihren Wert nach Initialisierung nicht mehr ändern Java Basics - Anfänger-Themen 2
TheMenox Methoden Bestimmung an welche Methode eine andere Methode ihren Wert weitergeben soll Java Basics - Anfänger-Themen 35
M Exception soll Werte mitgeliefert bekommen Java Basics - Anfänger-Themen 12
K Objekt soll Anwendung über Änderungen informieren Java Basics - Anfänger-Themen 8
X Einfache Frage; wie soll ich die spezielle float var speichern? Java Basics - Anfänger-Themen 2
C Ein Button soll Focus rausfinden und Methode starten Java Basics - Anfänger-Themen 9
M Panel erstellen, welches ein Control erhält. Ausgabe soll über einen Stream erfolgen. Java Basics - Anfänger-Themen 0
K Variablenname soll der Inhalt vom String sein Java Basics - Anfänger-Themen 2
K Wie lange kann / soll das dauern? Java Basics - Anfänger-Themen 6
R Button soll Wert 1 in Variable schreiben Java Basics - Anfänger-Themen 4
J Interface Bubblesort soll Arrays beliebiger Referenztypen sortieren können. Java Basics - Anfänger-Themen 5
T Array soll Werte aufnehmen Java Basics - Anfänger-Themen 2
B Anwender soll mathematische Funktion eingeben können, Einfachster Fnktionsplotter Java Basics - Anfänger-Themen 4
E Erste Schritte [Noob-Frage] Meine If-Abfrage macht nicht, was sie soll... Java Basics - Anfänger-Themen 2
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
M Weiß nicht, wie ich es nennen soll. Java Basics - Anfänger-Themen 1
T Wenn Schaltjahr ist, soll Februar, einen Tag mehr haben, GUI mit combobox Java Basics - Anfänger-Themen 4
H Erste Schritte Ergebniss soll kleiner als 1000 sein Java Basics - Anfänger-Themen 4
M Warum soll man die Finanlize Methode nicht überschreiben und aufrufen? Java Basics - Anfänger-Themen 2
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
T BufferReader soll datei mehrmals lesen Java Basics - Anfänger-Themen 13
M CompareTo soll Datum sortieren Java Basics - Anfänger-Themen 2
S Maus soll Programm nicht verlassen Java Basics - Anfänger-Themen 1
M Java Datei soll sich selbst löschen Java Basics - Anfänger-Themen 8
V Was soll alles in den Konstruktor? Java Basics - Anfänger-Themen 3
E Einfache For-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 2
Sogomn Wie soll ich weiermachen? Java Basics - Anfänger-Themen 4
E Erste Schritte Array soll kleiner werdenden String erstellen Java Basics - Anfänger-Themen 5
S Methoden Methode soll String zurückgeben Java Basics - Anfänger-Themen 11
C Wo soll die Methode hin? Java Basics - Anfänger-Themen 2
A scan.nextLine() - Wenn man zu lange nichts macht, soll etwas passieren Java Basics - Anfänger-Themen 3
C Erste Schritte Boolsche For-Schleife soll Ausgaben mitzählen Java Basics - Anfänger-Themen 8
S Ein Rechteck soll an einer Seite gespiegelt werden. Java Basics - Anfänger-Themen 5
B Collections Collection soll nur einen bestimmten Datentyp aufnehmen Java Basics - Anfänger-Themen 12
G Erste Schritte Action soll zwei sachen ausführen Java Basics - Anfänger-Themen 7
B Array soll an Konstruktor übergeben werden..Hilfe! Java Basics - Anfänger-Themen 16
D Break funktioniert nicht so wie es soll Java Basics - Anfänger-Themen 8
D jProgressBar soll bei 100% sein wenn sql Abfrage inkl. jTable schreiben fertig ist... Java Basics - Anfänger-Themen 5
K Konstruktor soll an einen anderen Konstruktor weitergeben Java Basics - Anfänger-Themen 5
L Cannot Find Symbol - Was soll denn das bedeuten?!? Java Basics - Anfänger-Themen 7
P methode soll int zurückgeben Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben