Zufälliges Wort direkt aus einer Liste ausgeben

Pio

Mitglied
Hallo zusammen,

In einem HangMan-Spiel habe ich zusätzlich einen Editor erstellt, womit man mindestens 20 Wörter eingeben kann und in liste.bin gespeichert werden.
Soweit kann ich auch auf die Liste zu greifen. Hier soll jetzt aus der Liste ein zufälliges Wort ausgewählt und angezeigt werden.

Das Anzeigen wird nicht das Problem sein. Ich habe das Problem, dass ich es nicht schaffe direkt aus der Liste ein zufälliges Wort auszuwählen. Dies soll nicht über ein Array passieren (dies habe ich geschafft).

Hier geht es eigentlich nur rein um den Weg, wie ich es umsetzen kann. Die Liste selbst ist als .bin gespeichert (soll auch sol bleiben).

Idee:
Da ich den Zeiger in der .bin-Liste mit seek() verschieben kann, wäre das eine Möglichkeit. Also müsste ich nur eine Zufallszahl erstellen, die mir sagt, welches Wort ausgewählt wird und den Zeiger dorthin verschieben zum Lesen und dann Ausgeben.

Aber wie schaffe ich es jetzt eine Zufallszahl ((int)Math.random() -> soweit klar) zu erstellen, die ich mit seek() verbinden kann, dass er mir das Wort ausgeben kann. Das Problem ist seek() erwartet ein Tpy long. Die Position des Zeigers bekomme ich mit getFilePointer() heraus -> auch kein Problem. Mit readUnsignedShort() bekomme ich die Wortlänge heraus -> auch ok. Über length() bekomme ich die Anzahl der ganzen Datei angezeigt. Dort könnte ich dann über die Zufallszahl auf einen x-beliebigen Wert der Datei zugreifen. Dennoch könnte hier auch ein Wert angesprochen werden, der mitten im Wort ist und somit bekomme ich eine Ausnahme.

Egal wie ich mir dies vorstelle, lande ich immer mit meiner Zufallszahl irgendwo und nicht da wo ich hin will.

Das sind soweit die Mittel, die ich kenne und erstmal nutzen soll. Und nochmals: Hier soll es nur um einen Weg gehen, wie man sowas umsetzen kann. Ich möchte keinen Quellcode oder so (das möchte ich schon selber machen).

mfg
 

Flown

Administrator
Mitarbeiter
Warum nicht einfach alle Wörter einlesen und dann das Wort selektieren ala words.get((int)Math.random() * words.size())?
 

Pio

Mitglied
Ein kleines Feedback von mir!

Ich habe es soweit geschafft. Ich habe es wie folgt gelöst. Ich lese die Datei ein und über While zähle ich die anzahl der Wörter die ich in zaehler speicher. Danach setze ich den Zeiger auf die Anfangsposition zurück. Weiterhin erstelle ich eine Zufallszahl (max Wert ist hier die gespeicherten Wörter minus 1). Danach laufe ich die Liste so oft wie die Zufallzahl es mir vorgibt in der for-Schleife durch. Zum Schluss werden noch die Buchstaben durch * ersetzt und in einem Label im Spiel ausgegeben.

Da ich noch sehr unerfahren bin würde ich mich freuen, wenn hier ein kurzes Feedback kommen würde.

Code:
    private void neuesWort()
    {

        //aus der Liste lesen
        try (RandomAccessFile datei = new RandomAccessFile("liste.bin","r"))
        {

            int zaehler = 0;
            int zufall = 0;
           
            //Anzahl der Wörter ermitteln und in der Var zaehler speichern
            while(datei.getFilePointer() < datei.length())
            {
                long naechstePosition = 0;
               
                naechstePosition = datei.readUnsignedShort();
                datei.seek(datei.getFilePointer() + naechstePosition);
               
                zaehler++;
            }
           
            //Zeiger zurücksetzen auf die Anfangsposition
            datei.seek(0);

            //Zufallzahl ermitteln. Max Anzahl = zaehler - 1 damit ich nicht bei der Ausgabe über das Dateiende hinauslese und eine Ausnahme auslöse
            //Hier werden die Zahlen 0 - 19 (sind auch 20zig) verwendet.
            zufall = (int)(Math.random() * (zaehler - 1));
           
            //Die Zufallszahl ist der maximale Durchlauf
            //
            for(int i = 0; i< zufall; i++)
            {
                long neuePosition = 0;

                //Ein Wort weitergehen
                neuePosition = datei.readUnsignedShort();
                datei.seek(datei.getFilePointer() + neuePosition);
               
            }

            //das Suchwort und die Zeichen für die Anzeige setzen
            suchwort = new String(datei.readUTF());
            anzeige = new StringBuilder(suchwort);
           
            //alle Zeichen in der Anzeige ersetzen durch *
            for (int zeichen = 0; zeichen < suchwort.length(); zeichen++)
                anzeige.setCharAt(zeichen, '*');

            //die Sternchen anzeigen
            ausgabeText.setText(anzeige.toString());

        }
        catch(IOException e)
        {
            JOptionPane.showMessageDialog(this, "Beim Laden ist ein Problem aufgetreten");
            e.printStackTrace();
        }
       
    }
 
X

Xyz1

Gast
RAF sieht man auch relativ selten. Wie ist denn deine "liste.bin" aufgebaut? Komplett alles kann ich nicht lesen. xD

Optionen:
Java:
        LinkedList<String> liste = new LinkedList();
        liste.add("aale");
        liste.add("bald");
        liste.add("cent");
        liste.add("dank");
        // usw.

        // Option 1.:
        System.out.println(liste.get((int) (Math.random() * liste.size() ) ) );

        // Option 2.:
        Collections.shuffle(liste, new Random(0));
        System.out.println(liste.getFirst());
 

Pio

Mitglied
@DerWissende
Die Liste wird durch Eingabe des Users erstellt. Hier wird ein extra Fenster geöffnet, wo der User min. 20 Wörter eingeben muss. Schaue mir gerad an, wie ich über randomAccessFile prüfen kann, ob es die Datei schon gibt und dann die Anzahl der Wörter auszulesen.

Code:
    private void speicherPanel()
    {
       
        try(RandomAccessFile datei = new RandomAccessFile("liste.bin", "rw"))
        {
            //aus dem eingabefeld das Wort auslesen und in text speichern
            String text = eingabeFeld.getText();
           
            //wenn das Eingabefeld leer ist
            if(eingabeFeld.getText().equals(""))
            {   
                //wird eine Meldung ausgegeben
                JOptionPane.showMessageDialog(null, "Sie haben noch kein Wort eingegeben");
            }
            //Wenn das Eingabefeld nicht leer ist, wird das Wort in der Datei gespeichert.
            else
            {
                //an das Ende der Datei gehen
                datei.seek(datei.length());
               
                //Wort in die Liste schreiben
                datei.writeUTF(text);
               
                //Zähler für die Anzahl der Wörter hochzählen
                zaehler++;

                //Textfeld leeren
                eingabeFeld.setText("");
               
                //Zaehler neu ausgeben bzw hochzählen
                anzahl.setText(Integer.toString(zaehler));
            }
           
        }
    catch (IOException e)
        {
            JOptionPane.showMessageDialog(this, "Beim Schreiben ist ein Problem aufgetreten");
        }   
    }

Option 1 werde ich mir anschauen. Das sieht recht vielversprechend aus.
 

mrBrown

Super-Moderator
Mitarbeiter
Vergiss besser RandomAccessFile, das ist der so ziemlich umständlichste Weg, um die Datei einzulesen ;)
Da kann man, wenn man unbedingt händisch einlesen will, deutlich besser mit FileReader oder BufferedReader und einer Liste arbeiten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Hangman-Spiel-zufälliges Wort ermitteln Java Basics - Anfänger-Themen 4
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
L Zufälliges 2d array befüllen Java Basics - Anfänger-Themen 27
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
Curtis_MC Collections Zufälliges Element aus Stack Java Basics - Anfänger-Themen 2
A Zufälliges Objekt basierend auf Wahrscheinlichkeiten bekommen. Java Basics - Anfänger-Themen 4
M zufälliges Setzen von Schiffen in while klappt nicht immer Java Basics - Anfänger-Themen 3
StrikeTom Zufälliges Alphabet erzeugen Java Basics - Anfänger-Themen 6
M Zufälliges Auswählen von Textfields Java Basics - Anfänger-Themen 5
H zufälliges Array in ein 2D Array schreiben Java Basics - Anfänger-Themen 4
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
JavaBeginner22 Wort mit der größten Länge ausgeben Java Basics - Anfänger-Themen 4
O Regex bei ReplaceAll ersetzt Wort und Sonderzeichen nicht. Java Basics - Anfänger-Themen 9
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
I String nach Wort suchen Java Basics - Anfänger-Themen 6
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
J Ein Wort aus einer Datei zufällig ermitteln Java Basics - Anfänger-Themen 3
B Umbruch nach bestimmten Wort Java Basics - Anfänger-Themen 5
S Wort suchen und ersetzen in einer Datei Java Basics - Anfänger-Themen 6
M Programm, das ein Wort einliest Java Basics - Anfänger-Themen 3
F Wort nach String ausgeben Java Basics - Anfänger-Themen 5
L Mit java ein wort mehrfach versetzt darstellen Java Basics - Anfänger-Themen 14
T Zeilen des ListArray nach einem Wort durchsuchen und diese Zeile ausgeben Java Basics - Anfänger-Themen 4
V Ein Wort einlesen und dann jede Buchstabe ausgeben Java Basics - Anfänger-Themen 10
H Erste Schritte Längstes Wort eines Strings herausfinden Java Basics - Anfänger-Themen 7
S Wort in Text suchen und ersetzen Java Basics - Anfänger-Themen 3
Ananaskirsche Variablen Gucken ob Wort in Datei exisitert Java Basics - Anfänger-Themen 6
L Wort in String ersetzen Java Basics - Anfänger-Themen 11
X Methoden Wort aus String löschen und richtige Verschachtelung Java Basics - Anfänger-Themen 17
W Vergleich ob Buchstabe in einem Wort enthalten ist Java Basics - Anfänger-Themen 3
M Methoden String methoden ,Häufigkeit einm wort in der Zeichenkette Java Basics - Anfänger-Themen 14
N RegEx Wort anzeigen Java Basics - Anfänger-Themen 6
B CSV auslesen > Wort bilden > CSV ausgeben Java Basics - Anfänger-Themen 7
K Klassen String - nach Wort durchsuchen Java Basics - Anfänger-Themen 6
D 1 Wort aus TextDatei auslesen Java Basics - Anfänger-Themen 3
J Ein Wort einlesen und dann jede Buchstabe ausgeben Java Basics - Anfänger-Themen 25
D Das 1. Wort aus einem String herauslesen Java Basics - Anfänger-Themen 6
W Zahl/Wort in ein Array zerlegen Java Basics - Anfänger-Themen 6
D Wort nach Leerzeichen - String Java Basics - Anfänger-Themen 10
I Wie kann ich ein Wort in einem String suchen Java Basics - Anfänger-Themen 3
I Wort aus String löschen Java Basics - Anfänger-Themen 11
S Wort in zwei farben aufleuchten lassen Java Basics - Anfänger-Themen 2
Ollek Bestimmtes Wort aus einem Dokument lesen Java Basics - Anfänger-Themen 7
T Ersten Buchstaben in einem Wort groß schreiben. Java Basics - Anfänger-Themen 6
I Schriftart für einzelnes Wort in der JTextArea auswählen Java Basics - Anfänger-Themen 3
G Wort suchen Java Basics - Anfänger-Themen 4
L Was bedeutet das Wort "this" ? Java Basics - Anfänger-Themen 2
B a > n ? "wort" : "blub" << was Java Basics - Anfänger-Themen 3
B Char kommt 2 mal im Wort vor (indexOf) Java Basics - Anfänger-Themen 5
M Wort in einem String suchen und ausschneiden Java Basics - Anfänger-Themen 2
M Bestimmtest Wort aus einer Textdatei löschen Java Basics - Anfänger-Themen 3
L Gezielte Infos aus Datei holen - Suche nach Position/Wort Java Basics - Anfänger-Themen 22
E Wort in Datei suchen Java Basics - Anfänger-Themen 5
T Deutsches Wort für WindowClosingAdapter :) Java Basics - Anfänger-Themen 9
D wort rückwärts Java Basics - Anfänger-Themen 9
D Ein Wort einlesen über Tastatur und wieder ausgeben Java Basics - Anfänger-Themen 6
M Wort als Int funktioniert nicht Java Basics - Anfänger-Themen 29
Avalon Request direkt aus Eclipse wie bei Postman Java Basics - Anfänger-Themen 3
N Eingabe des Users direkt hinter die Ausgabe Java Basics - Anfänger-Themen 3
J GUI wird direkt nach dem erstellen weiß übermalt Java Basics - Anfänger-Themen 3
J Direkt studieren? Oder autodidaktisch lernen? Java Basics - Anfänger-Themen 20
Z ArrayList direkt feste Größe mitgeben Java Basics - Anfänger-Themen 13
X Dateien direkt hintereinander schreiben, Dateiname Java Basics - Anfänger-Themen 25
A Vererbung Mit Casten direkt auf Sub-Klasse Zugreiffen Java Basics - Anfänger-Themen 6
Q Tastatureingabe direkt nach Eingabe (ohne zwischenzeitliches "Return" o.Ä ) weiterverwenden Java Basics - Anfänger-Themen 1
J JDialog: wie kann ich ihn direkt als invisible erstellen Java Basics - Anfänger-Themen 7
S java tastendrücke direkt abfangen und printen Java Basics - Anfänger-Themen 3
J Objekte zur Laufzeit erzeugen und direkt verwenden Java Basics - Anfänger-Themen 9
S Direkt Instanzen anlegen Java Basics - Anfänger-Themen 1
G JTable: Werte in Tabelle direkt ansprechen Java Basics - Anfänger-Themen 3
D Direkt Klassen Initalisierung Java Basics - Anfänger-Themen 3
F Variablen Variable durch die direkt auf verschiede Objekte zugegriffen werden kann Java Basics - Anfänger-Themen 5
H Text ausdrucken, den ich entweder direkt in die Kommandozeile schreibe, oder über input redirect übe Java Basics - Anfänger-Themen 2
B Methoden Methode Direkt starten (über Kommandokonsole) Java Basics - Anfänger-Themen 5
P .class Datei direkt starten (optional Java Datei direkt starten) Java Basics - Anfänger-Themen 13
M Imports einzeln oder direkt komplette Pakete .*? Java Basics - Anfänger-Themen 26
T Input/Output Direkt auf Eingabe reagieren Java Basics - Anfänger-Themen 8
M Compiler-Fehler Exceptions lieber throwen oder direkt catchen? Java Basics - Anfänger-Themen 8
P int Array direkt einer Funktion übergeben Java Basics - Anfänger-Themen 3
D Access Abfrage - Results direkt als Array erhalten Java Basics - Anfänger-Themen 2
L Postleitzahl direkt nach Eingabe prüfen? Java Basics - Anfänger-Themen 7
D Javacode direkt in Betriebsystemabhängiges binary umwandeln Java Basics - Anfänger-Themen 5
D Ist es eigentlich ungünstig direkt in einem Konstruktor bereits umfangreichen Logikcode auszuführen? Java Basics - Anfänger-Themen 11
H jZable - Zelle direkt überschreiben Java Basics - Anfänger-Themen 3
B mit drawString direkt zeichnen, aber wie das Ende finden? Java Basics - Anfänger-Themen 3
K Datentypen Globale Variable direkt initialisieren oder im Konstruktor? Java Basics - Anfänger-Themen 13
U Von DB in Formular direkt oder über Objekt? Java Basics - Anfänger-Themen 2
babel Datenbank Daten direkt an die Tabelle übergeben ohne Arrays Java Basics - Anfänger-Themen 9
D strings wie "{{5.0,3.0},{1.0,2.0}}" direkt als dou Java Basics - Anfänger-Themen 6
B ActionListener direkt NACH einem anderen ausführen Java Basics - Anfänger-Themen 4
T Checkbox in jtable: boolean wert direkt setzen - wie? Java Basics - Anfänger-Themen 1
J Array: Jedem Element direkt denselben Wert zuweisen Java Basics - Anfänger-Themen 6
G Jar nicht direkt ausführbar Java Basics - Anfänger-Themen 6
N Bilder direkt in Jar einbinden Java Basics - Anfänger-Themen 7
W Double Werte von eine txt Datei direkt einlesen Java Basics - Anfänger-Themen 4
N Tastatur direkt einlesen (ohne Enter) Java Basics - Anfänger-Themen 3
K Reguläre Ausdrücke - Gefundene Tokens direkt ermitteln Java Basics - Anfänger-Themen 3
G jar direkt ausführen Java Basics - Anfänger-Themen 4
S paint() direkt auf JFrame seit 1.5 nicht mehr möglich? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben