Hangman Spiel

Mane123

Bekanntes Mitglied
Hallo zusammen,

ich habe folgenden Quelltext gerade fertiggestellt:

Java:
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.RandomAccessFile;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;


public class WortListe extends JFrame {
	
	//für die Anzahl der Wörter
	private int anzahlWoerter;
	//für die Eingabe neuer Wörter
	private JTextField eingabeWoerter;
	//für den Button einlesen und die Wortliste anzeigen
	private JButton einlesen,anzeigen;
	//eine Instanzvariable vom Typ RandomAccessFile
	private RandomAccessFile datei;
	//eine Instanzvariable vom Typ MeineWoerter
	private MeineWoerter woerterTemp;
	
	
	//das JLabel für die Anzahl der Wörter
	private JLabel woerterAnzahlZeigen;
	
	//eine innereKlasse für die Wörter
	class MeineWoerter {
		//die Wörter des Hang-Man Spiels
		private String woerter;

		
	
		
		
	
		MeineWoerter(String wort) {
						
			//das neue Wort setzen
			woerter = wort;
			//den Index des neuen Wort setzen
			datenSchreiben();
		}
		
		//die Methode für das Schreiben des Wortes in die Datei
		private void datenSchreiben() {
			
			try {
			
				//eine neue Instanz für das Schreiben der Datei
				datei = new RandomAccessFile("woerter.bin","rw");
				
				//die Anzahl der Wörter erhöhen
				//die Anzahl der Wörter steht zugleich für den
				//Index des einzelnen Wortes
				anzahlWoerter++;
				
				//die Anzahl der Wörter wird in den ersten 4 Bytes
				//als Int - Wert gespeichert
				datei.writeInt(anzahlWoerter);
				
				//den Zeiger ans Ende der Datei setzen
				datei.seek(datei.length());
				
				//jedes Wort erhält zuerst einen Index 
				//anschließend wird das Wort angehängt.
				
				//den Index am Ende an die Datei anhängen
				datei.writeInt(anzahlWoerter);
				//das Wort nach dem Index an die Datei Anhängen
				datei.writeUTF(woerter);
				//datei wieder schließen.
				datei.close();
				
			}
			
			catch(IOException e) {
				/////////WIE REFERENZ zum  ERZEUGEN??
				JOptionPane.showMessageDialog(null,"Beim Schreiben ist ein Problem aufgetreten");
			}
		}
	}
	
	
	//eine innere Klasse für den ActionListener
	class MeinListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			
			//das erstellt Wort speichern
			if (e.getActionCommand().equals("lesen"))
				werteEinlesen();
			
			//die Liste der Wörter anzeigen
			if (e.getActionCommand().equals("anzeigen"))
				datenLesen();
			
		}
		
		
	}
	
	
	public WortListe(String titel) {
		
		//den Titel erstellen
		super(titel);
		
		//das Layout setzen
		this.setLayout(new GridLayout(0,2));
		
		//die Schaltfläche zum Einlesen der Dateien erstellen
		einlesen = new JButton("Einlesen");
		einlesen.setActionCommand("lesen");
		
		//die Schaltfläche zum anzeigen der Wortliste erstellen
		anzeigen = new JButton("Wörter anzeigen");
		anzeigen.setActionCommand("anzeigen");
		
		//die Schaltflächen mit dem Listener verbinden
		MeinListener listener = new MeinListener();
		einlesen.addActionListener(listener);
		anzeigen.addActionListener(listener);
		
		
		//ein Label für die Wörter erstellen
		add(new JLabel("Wort eingeben: "));
		
		//das Text Feld für die Wörter erstellen
		eingabeWoerter = new JTextField();
		//und einfügen
		add(eingabeWoerter);
		
		//ein Label für die eingegeben Wörter erstellen
		add(new JLabel("Anzahl vorhanden Wörter: "));
		
		//die Anzahl der Wörter welche bereits gespeichert wurden,
		//ermitteln
		try {
			//eine neue Instanz für das Lesen der Datei
		datei = new RandomAccessFile("woerter.bin","r");
		//die Anzahl der Wörter ist in den ersten 4 Bytes gespeichert
		anzahlWoerter = datei.readInt();
	
		datei.close();
		
		}
		
		catch (IOException e) {
			//falls die Datei noch nicht erstellt wurde, die Anzahl
			//der Wörter auf 0 setzen.
			anzahlWoerter = 0;
		}
		
		//die Anzahl der Wörter in einem JLabel anzeigen
		add(woerterAnzahlZeigen = new JLabel(Integer.toString(anzahlWoerter)));
		//den Button einlesen erstellen
		add(einlesen);
		//den Button anzeigen erstellen
		add(anzeigen);
		
		//das Fenster packen
		pack();
		//das Standardverhalten festlegen
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		//das Fenster anzeigen
		setVisible(true);		
	}
	
	
	private void werteEinlesen() {
		//wenn kein Wort eingeben wurde, dann die Methode verlassen
		if(eingabeWoerter.getText().isEmpty())
			return;
		
		//ein neues Wort erstellen
		new MeineWoerter(eingabeWoerter.getText());
		
		
		System.out.println("Die Anzahl der Wörter:" + anzahlWoerter);
		//den Text des JLabels neu setzen
		woerterAnzahlZeigen.setText(Integer.toString(anzahlWoerter));
			
	}
	
	
	
	
	
	private void datenLesen() {
		
		try {
			
			//eine neue Instanz für den Lesezugriff
			datei = new RandomAccessFile("woerter.bin","r");
			
			//den Zeiger auf das 4. Byte setzen, da erst am dem 5. Byte gelesen
			//werden soll, weil in den Bytes 1 - 4 die Anzahl der Wörter im Typen Int 
			//abgespeichert wird
			datei.seek(4);
		
			//Mit der While-Schleife wird die Ausgabe gesteuert
			//solange die aktuelle Position kleiner ist als die
			//länge der Datei wird der Index ausgelesen 
			//und das Wort ausgegeben
			while(datei.getFilePointer() < datei.length()) {
				
				add(new JLabel(datei.readInt() + ". Wort: "));
				add(new JLabel(datei.readUTF()));
				
				//das Fenster neu packen
				pack();
			}
			datei.close();
		}
		
		catch (IOException e) {
			
			JOptionPane.showMessageDialog(this,"Beim Laden ist ein Problem aufgetreten");
		}
		
	}
	
	//die MEthode zum zufälligen lesen der Datei
	private void datenZufaelligLesen() {
		
		//Variable für die zufällige Poition
		double positionZufaellig;
		//Variable für die neue Position
		int neuePosition;
		
		//die Zufällige Zahl ermitteln
		positionZufaellig = Math.random() * anzahlWoerter+1;
		System.out.println(positionZufaellig);
		
		//Es existiert kein Wort mit einem Index < 1
		//Falls eine zufällig Zahl < 1 berechnet wird,
		//wird die Variable auf 1 gesetzt
		if(positionZufaellig < 1)
			positionZufaellig = 1;
		
		try {
			//eine neue Inszanz datei mit Lesezugriff
			datei = new RandomAccessFile("woerter.bin","r");
			
			//die Position auf die 4. Stelle setzen, da in den Bytes 
			//1 - 4 die anzahl der Wörter gespeichert wird
			datei.seek(4);
			
			
			//Es wird nach der Position gesucht			
			while(datei.getFilePointer() < datei.length()) {
				
				//wenn der ausgelesene Int-WErt mit der 
				//zufällig ermittelten Position übereinstimmt
				//dann String zurückliefern
				if(datei.readInt() == (int) positionZufaellig) {
					
					
					//return (datei.readUTF());
					//return STRING
				}
				
				//wenn keine Übereinstimmung gefunden wurde, dann
				//wird weitergesucht.
				else {
					
						neuePosition = datei.readUnsignedShort();
					
						datei.seek(datei.getFilePointer() + neuePosition);
				}
			}
			
			datei.close();
		}
		
		catch (IOException e) {
			
			System.out.println("OH OH, FEHLLLER");
		}
	}
}

Hier soll für ein Hangman Spiel eine Liste mit Wörtern erstellt werden. Diese Liste soll beliebig erweiterbar sein.

Ich habe hierzu ein paar Fragen:
1. Frage:

Wenn die Liste z.B. 50 Einträge hat, dann passt sie nicht mehr in das JFrame. Ein Großteil der Wörter wird abgeschnitten.
Das müsste doch mit einem JScrollPanel änderbar sein?
Allerdings kann ich ein ScrollPanel nicht in das GridLayout einfügen.
Wisst ihr eine Möglichkeit, wie ich hier ein ScrollPanel einfügen kann?


2. Frage:

In der Klasse MeineWoerter gibt es folgende Catch - Anweisung:

Java:
catch(IOException e) {
				/////////WIE REFERENZ zum  ERZEUGEN??
				JOptionPane.showMessageDialog(null,"Beim Schreiben ist ein Problem aufgetreten");

Wisst ihr, wie ich statt "null" Eine Referenz zum JFrame herstelle?
Würde das hier mit einer Instanzvariablen vom Typ WortListe funktionieren?

Vielen Dank!

Viele Grüße!
 
Zuletzt bearbeitet von einem Moderator:
M

MiDniGG

Gast
Zur 1. Frage. Sollte eigentlich gehen, dass Du da ein JScrollPane addest... Was für ein Fehler wird denn da angezeigt?

Zur 2. Frage. Da Du eine Klasse in der Klasse hast weiß ich nicht sicher wie es geht. Aber probiere mal super oder eben mit einer Variable (Klasse k = new Klasse(); und dann das k (Das new Klasse() entsprechend ersetzen, sodass der JFrame nicht 2 mal offen ist dan...).
 

Flown

Administrator
Mitarbeiter
Zu Frage 2:

Du hast 2 Optionen:

Entweder du legst dir eine Variable bei den Feldern an mit:

Java:
private JFrame thisFrame = this;

is aber unschön!
Oder du legst dir einfach eine Methode in WortListe an die dir den JFrame zurückgibt z.B. so:

Java:
private JFrame getFrame(){
    return this;
}

wesentlich schöner und dann kannst du sie einfach in der catch-Klausel aufrufen.
 
B

BinGüst

Gast
Warum :
JOptionPane.showMessageDialog(WortListe.this,"Beim Schreiben ist ein Problem aufgetreten");

und nicht

JOptionPane.showMessageDialog(this,"Beim Schreiben ist ein Problem aufgetreten");

...
WortListe.this und this sind doch beide Referenzen auf WortListe ( JFrame ) oder ?!?
 
B

BinGüst

Gast
Oops , hätte auch mal die letzte Frage lesen soll.
Ok , verstehe schon warum WorteListe.this
 

Mane123

Bekanntes Mitglied
Danke für die Tipps.

Wenn ich in ein JScrollPane die Labels mit den einzelnen Worten einfügen möchte, dann klappt das nicht. Ich verwende die Methode scroll.add(new JLabel()).
Es wird das JScrollPane nicht aktualisiert.

Wie kann ich das aktualisieren?

Noch etwas:

Wenn ich das Scroll Panel in ein GridLayout einfügen möchte, dann nimmt es doch nur den Platz von einer Zelle ein?
Ich müsste dann wohl z.B. ein BorderLayout verwenden?

Viele Grüße

Vielen Dank
 
S

SlaterB

Gast
ein JScrollPane kann immer nur eine Komponente aufnehmen, die entweder per setViewportView() oder im Konstruktor übergeben wird,
diese Komponente kann ein JPanel sein, dann sind alle weiteren Überlegungen an dieses JPanel zu richten


wenn du während der Anzeige Änderungen vornimmst, rufe immer
validate();
repaint();
am JPanel oder gleich ganz oben am JFrame auf
 

Mane123

Bekanntes Mitglied
Hallo zusammen,

ich habe den Quelltext jetzt wie folgt geändert:

Java:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.RandomAccessFile;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;


public class Test extends JFrame {
	
	//für die Anzahl der Wörter
	private int anzahlWoerter;
	//für die Eingabe neuer Wörter
	private JTextField eingabeWoerter;
	//für den Button einlesen und die Wortliste anzeigen
	private JButton einlesen,anzeigen;
	//eine Instanzvariable vom Typ RandomAccessFile
	private RandomAccessFile datei;
	
	private JScrollPane scrollAusgabeWoerter;
	private JPanel panelAusgabeWoerter, panelGui;
	
	//das JLabel für die Anzahl der Wörter
	private JLabel woerterAnzahlZeigen;
	
	//eine innereKlasse für die Wörter
	class MeineWoerter {
		//die Wörter des Hang-Man Spiels
		private String woerter;

		
	
		
		
	
		MeineWoerter(String wort) {
						
			//das neue Wort setzen
			woerter = wort;
			//den Index des neuen Wort setzen
			datenSchreiben();
		}
		
		//die Methode für das Schreiben des Wortes in die Datei
		private void datenSchreiben() {
			
			try {
			
				//eine neue Instanz für das Schreiben der Datei
				datei = new RandomAccessFile("woerter.bin","rw");
				
				//die Anzahl der Wörter erhöhen
				//die Anzahl der Wörter steht zugleich für den
				//Index des einzelnen Wortes
				anzahlWoerter++;
				
				//die Anzahl der Wörter wird in den ersten 4 Bytes
				//als Int - Wert gespeichert
				datei.writeInt(anzahlWoerter);
				
				//den Zeiger ans Ende der Datei setzen
				datei.seek(datei.length());
				
				//jedes Wort erhält zuerst einen Index 
				//anschließend wird das Wort angehängt.
				
				//den Index am Ende an die Datei anhängen
				datei.writeInt(anzahlWoerter);
				//das Wort nach dem Index an die Datei Anhängen
				datei.writeUTF(woerter);
				//datei wieder schließen.
				datei.close();
				
			}
			
			catch(IOException e) {
				/////////WIE REFERENZ zum  ERZEUGEN??
				JOptionPane.showMessageDialog(null,"Beim Schreiben ist ein Problem aufgetreten");
			}
		}
	}
	
	
	//eine innere Klasse für den ActionListener
	class MeinListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			
			//das erstellt Wort speichern
			if (e.getActionCommand().equals("lesen"))
				werteEinlesen();
			
			//die Liste der Wörter anzeigen
			if (e.getActionCommand().equals("anzeigen"))
				datenLesen();
			
		}
		
		
	}
	
	
	public Test(String titel) {
		
		//den Titel erstellen
		super(titel);
		
		guiErstellen();
			
		
		//die Schaltflächen mit dem Listener verbinden
		MeinListener listener = new MeinListener();
		einlesen.addActionListener(listener);
		anzeigen.addActionListener(listener);
			
		//die Anzahl der Wörter welche bereits gespeichert wurden,
		//ermitteln
		try {
			//eine neue Instanz für das Lesen der Datei
		datei = new RandomAccessFile("woerter.bin","r");
		//die Anzahl der Wörter ist in den ersten 4 Bytes gespeichert
		anzahlWoerter = datei.readInt();
	
		datei.close();
		
		}
		
		catch (IOException e) {
			//falls die Datei noch nicht erstellt wurde, die Anzahl
			//der Wörter auf 0 setzen.
			anzahlWoerter = 0;
		}
		
		woerterAnzahlZeigen.setText(Integer.toString(anzahlWoerter));
		
		//das Fenster packen
		pack();
		//das Standardverhalten festlegen
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		//das Fenster anzeigen
		setVisible(true);		
	}
	
	
	private void guiErstellen() {
		
		//Layout für das Fenster setzen
		this.setLayout(new BorderLayout());
		
		//das Panel für die Ausgabe der Wörter erstellen
		panelAusgabeWoerter = new JPanel();
		panelAusgabeWoerter.setLayout(new GridLayout(0,2));
		
		//das Panel für die grafische Oberfläche erstellen
		panelGui = new JPanel();
		panelGui.setLayout(new GridLayout(0,2));
		
		//das JScrollPane erstellen
		scrollAusgabeWoerter = new JScrollPane(panelAusgabeWoerter);
	
		
		this.add(scrollAusgabeWoerter,BorderLayout.CENTER);
		
		//ein Label für die Wörter erstellen
		panelGui.add(new JLabel("Wort eingeben: "));
		
		//das Text Feld für die Wörter erstellen
		eingabeWoerter = new JTextField();
		//und einfügen
		panelGui.add(eingabeWoerter);
		
		//ein Label für die eingegeben Wörter erstellen
		panelGui.add(new JLabel("Anzahl vorhanden Wörter: "));
		
		
		//die Anzahl der Wörter in einem JLabel anzeigen
		panelGui.add(woerterAnzahlZeigen = new JLabel());

		
		
		//die Schaltfläche zum Einlesen der Dateien erstellen
		einlesen = new JButton("Einlesen");
		einlesen.setActionCommand("lesen");
		//den Button einlesen erstellen
		panelGui.add(einlesen);
		
		//die Schaltfläche zum anzeigen der Wortliste erstellen
		anzeigen = new JButton("Wörter anzeigen");
		anzeigen.setActionCommand("anzeigen");
		//den Button anzeigen erstellen
		panelGui.add(anzeigen);
		
		this.add(panelGui,BorderLayout.NORTH);
		
	}
	
	private void werteEinlesen() {
		//wenn kein Wort eingeben wurde, dann die Methode verlassen
		if(eingabeWoerter.getText().isEmpty())
			return;
		
		//ein neues Wort erstellen
		new MeineWoerter(eingabeWoerter.getText());
		
		
		System.out.println("Die Anzahl der Wörter:" + anzahlWoerter);
		//den Text des JLabels neu setzen
		woerterAnzahlZeigen.setText(Integer.toString(anzahlWoerter));
			
	}
	
	
	
	
	
	private void datenLesen() {
		
		try {
			
			//eine neue Instanz für den Lesezugriff
			datei = new RandomAccessFile("woerter.bin","r");
			
			//den Zeiger auf das 4. Byte setzen, da erst am dem 5. Byte gelesen
			//werden soll, weil in den Bytes 1 - 4 die Anzahl der Wörter im Typen Int 
			//abgespeichert wird
			datei.seek(4);
		
			//Mit der While-Schleife wird die Ausgabe gesteuert
			//solange die aktuelle Position kleiner ist als die
			//länge der Datei wird der Index ausgelesen 
			//und das Wort ausgegeben
			while(datei.getFilePointer() < datei.length()) {
				
				panelAusgabeWoerter.add(new JLabel(datei.readInt() + ". Wort: "));
				panelAusgabeWoerter.add(new JLabel(datei.readUTF()));
				
				//das Fenster neu packen
				pack();
			}
			datei.close();
		}
		
		catch (IOException e) {
			
			JOptionPane.showMessageDialog(this,"Beim Laden ist ein Problem aufgetreten");
		}
		
	}
	
	//die MEthode zum zufälligen lesen der Datei
	private void datenZufaelligLesen() {
		
		//Variable für die zufällige Poition
		double positionZufaellig;
		//Variable für die neue Position
		int neuePosition;
		
		//die Zufällige Zahl ermitteln
		positionZufaellig = Math.random() * anzahlWoerter+1;
		System.out.println(positionZufaellig);
		
		//Es existiert kein Wort mit einem Index < 1
		//Falls eine zufällig Zahl < 1 berechnet wird,
		//wird die Variable auf 1 gesetzt
		if(positionZufaellig < 1)
			positionZufaellig = 1;
		
		try {
			//eine neue Inszanz datei mit Lesezugriff
			datei = new RandomAccessFile("woerter.bin","r");
			
			//die Position auf die 4. Stelle setzen, da in den Bytes 
			//1 - 4 die anzahl der Wörter gespeichert wird
			datei.seek(4);
			
			
			//Es wird nach der Position gesucht			
			while(datei.getFilePointer() < datei.length()) {
				
				//wenn der ausgelesene Int-WErt mit der 
				//zufällig ermittelten Position übereinstimmt
				//dann String zurückliefern
				if(datei.readInt() == (int) positionZufaellig) {
					
					
					//return (datei.readUTF());
					//return STRING
				}
				
				//wenn keine Übereinstimmung gefunden wurde, dann
				//wird weitergesucht.
				else {
					
						neuePosition = datei.readUnsignedShort();
					
						datei.seek(datei.getFilePointer() + neuePosition);
				}
			}
			
			datei.close();
		}
		
		catch (IOException e) {
			
			System.out.println("OH OH, FEHLLLER");
		}
	}
}

Es funktioniert fast alles:

Wenn z.B. 100 Wörter angegeben werden, dann erscheinen nur 50 im JPanel des JScrollPane. Eine Vertikale Scroll-Leiste erscheint nicht.
Die Leiste erscheint erst, wenn ich das Fenster ein bisschen größer ziehe (ein Pixel reicht dafür schon aus)
Wie kann ich erreichen, dass die Scroll-Leiste gleich nach dem auslesen der Wörter angezeigt wird, also ohne dass ich die größe des Fensters um 1 Pixel mit der Maus erhöhen muss?

Vielen Dank!

Viele Grüße
 
G

Gast2

Gast
Du solltest dem Scrollpane noch ne größe setzen, z.b.:

Java:
        //das JScrollPane erstellen
        scrollAusgabeWoerter = new JScrollPane(panelAusgabeWoerter);
        scrollAusgabeWoerter.setPreferredSize(new Dimension(50, 200));
 
G

Gast2

Gast
Weil dein Layout Manager die Größen wieder neu ausrichtet und sich dabei an der PreferredSize orientiert.
 

Mane123

Bekanntes Mitglied
So, jetzt läuft das Programm fast perfekt.

Ich müsste jetzt nur noch in mein Hang-Man Programm die Methode purlic String datenZufaelligLesen() einfügen.
Sobald das Hang-Man Programm gestarter wird, soll ein Wort aus der gespeicherten Datei zufällig ermittelt werden und zum lösen durch den Benutzer bereit gestellt werden.

Das Problem ist nun allerdings, dass ich datenZufaelligLesen() nur aufrufen kann, wenn ich eine neue Instanz der Klasse WortListe erstelle :/

Wisst ihr eine andere Möglichkeit?

Viele Grüße
 
Wenn ich das auf die Schnelle richtig gesehen habe, ist die Methode, von Der Du sprichst, eine, die nichts von einem Objekt (also insbesondere nicht seine Felder) benutzt. Du kannst sie daher als Klassenmethode definieren (also als "static" deklarieren wie in "static void <Methodenname>"). Wenn Du sie dann aufrufen willst, brauchst Du kein Objekt, sondern rufst sie mit dem Klassennamen auf (Test.<Methodenname> ()).
 
Zuletzt bearbeitet:

Mane123

Bekanntes Mitglied
Hallo!

Danke, ich habe die Methode jetzt in eine statische Mehthode umgewandelt.
Nun gibt es noch ein kleines Problem:

Das Argument HangManGui aufrufer ist eine Instanzvariable der Klasse, von welcher aus die Methode datenZufaelligLesen aufgerufen wird.

Die Klasse HangManGui wird von der Klasse JFrame abgeleitet.

Dadurch ist es möglich in der Exception die Ausgabe - Komponente korrekt zu setzen.

Allerdings würde ein Argument HangManGui aufrufer bedeuten, dass eine andere Klasse (z.B.: ZufallGUI) die Methode doch nicht aufrufen kann, oder?

Wenn ich jetzt als Argument Object aufrufer verwenden würde, dann funktioniert das leider nicht, da eine Fehlermeldung in Eclipse erscheint.

Wisst wir wie man das am Besten lösen kann?

Vielen Dank!

Viele Grüße

Java:
	//die statische-Methode zum zufälligen Lesen der Datei
	public static String datenZufaelligLesen(HangManGui aufrufer) {
		//eine Instanzvariable für den Zugriff auf die Wörter - Datei
		RandomAccessFile dateiZufaellig;
		//speichert die Anzahl der Wörter, welche sich in der 
		//Binärdatei befinden
		int anzahlWoerter;

		//gibt das ermittelte Wort zurück
		String rueckgabeWort = "";
		
		//Variable für die zufällige Poition
		double positionZufaellig;
		//Variable für die neue Position
		int neuePosition;
		
		try {
			//eine neue Instanz datei mit Lesezugriff
			dateiZufaellig = new RandomAccessFile("woerter.bin","r");
			
			//die Anzahl der Wörter ermitteln
			anzahlWoerter = (dateiZufaellig.readInt());
			//eine zufällige Position ermitteln
			//anzahlWoerter + 1, weil ansonsten der letzte
			//Indexwert nicht ausgelesen werden kann.
			positionZufaellig = Math.random() * anzahlWoerter+1;
			
			//falls positionZufaellig kleiner als 1 ist, 
			//wird als Wert 1 gesetzt, da kein Wort mit dem Index 0
			//existiert
			if(positionZufaellig < 1)
				positionZufaellig = 1;
			
			//Es wird nach der Position gesucht			
			while(dateiZufaellig.getFilePointer() < dateiZufaellig.length()) {
				
				//wenn der ausgelesene Int-WErt mit der 
				//zufällig ermittelten Position übereinstimmt
				//dann String zurückliefern
				if(dateiZufaellig.readInt() == (int) positionZufaellig) {
					rueckgabeWort = (dateiZufaellig.readUTF());
					
				}
				
				//wenn keine Übereinstimmung gefunden wurde, dann
				//wird weitergesucht.
				else {
						//die Länge des Wortes ist in den ersten beiden Bytes
						//gespeichert.
						//neuePosition erhält die Länge des nach dem passenden
						//Index folgende Wort
						neuePosition = dateiZufaellig.readUnsignedShort();
					
						//den Pointer auf die neue Position setzen.
						dateiZufaellig.seek(dateiZufaellig.getFilePointer() + neuePosition);
				}
			}
			
			dateiZufaellig.close();
		}
		
		catch (IOException e) {
			
			JOptionPane.showMessageDialog(aufrufer,"Beim Laden des Ratebegriffs ist ein Problem aufgetreten.\n Bitte überprüfen Sie, ob bereits Wörter vorhanden sind!");
		}
				
		return rueckgabeWort;
	}
 

Marco13

Top Contributor
Hm. Einmal im Kreis und wieder zurück denken, bitte :)

Schau' dir diese Methode nochmal genau an.

Das ist ein ganz allgemeines Grundprinzip, auf das man achten sollte: JEDE Methode sollte das mindestens übergeben bekommen, was sie braucht, um ihre Aufgabe zu lösen. Eine spezielle Form davon ist das, was manchmal als "gegen das Interface programmieren" bezeichnet wird. Ein Beispiel: Man hat eine CopyOnWriteArrayList, und will ihren Inhalt zeilenweise ausgeben. Dann könnte man schreiben
Code:
void print(CopyOnWriteArrayList list)
{
    for (Object object : list) System.out.println(object);
}
besser wäre es aber, dort nur das zu übergeben, was die Methode mindestens braucht - nämlich irgendwas, wo man mit so einer for-Schleife drüber laufen kann:
Code:
void print([b]Iterable[/b] iterable)
{
    for (Object object : iterable) System.out.println(object);
}
Dort kann man dann nicht nur eine CopyOnWriteArrayList übergeben, sondern auch eine LinkedList, ArrayList, Vector, ein HashSet ... ist also allgemeiner und flexibler einsetzbar.

In diesem Fall: Braucht die Methode unbedingt ein "HangManGUI"? Nein. Also geht man in der Vererbungshierarchie weiter hoch. Braucht sie unbedingt einen "JFrame"? Nein. Also... ... ....


EDIT: Alternative Modellierungen mal außen vor gelassen: Ich persönlich würde die Methode wohl eher schreiben als sowas wie
Code:
public static String datenZufaelligLesen(String fileName) throws IOException
{ 
    ...
    dateiZufaellig = new RandomAccessFile(fileName,"r");

}
Dann kann der Aufrufer die Datei angeben (Z.b: "kurzerWoerter.bin" oder "langeWoerter.bin" :exclaim: ) und sich bei einem Fehler selbst um die Exception kümmern und ggf. einen Dialog anzeigen...
 
Zuletzt bearbeitet:

Mane123

Bekanntes Mitglied
Danke!

In der Methode JOptionOane.showMessageDialog() ist ja als Argument ein Component gefordert. Also habe ich die Methode in

public static String datenZufaelligLesen(Component aufrufer)

geändert.

Dies Idee hatte ich vorher auch schon mal. Allerdings dachte ich mir, das bringt nichts, da wenn z.b. Jemand nur ein einfaches Konsolenprogramm erstellt mit
System.out.println(WortListe.datenZufaelligLesen(????)

Kann das nicht funktionieren.
Mir ist jedoch beim Lesen deiner Antwort eingefallen, dass ich ja auch "null" übergeben kann, dann funktioniert es...

System.out.println(WortListe.datenZufaelligLesen(null)
Stimmen meine Ausführungen?

Vielen Dank!
 

Marco13

Top Contributor
Ja. Aber gerade bei einem reinen Konsolenprorgamm würde man ja ggf. nicht davon ausgehen, dass dort auf einmal ein Dialog erscheint. (Kann man aber machen, natürlich)...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Hangman-Spiel-zufälliges Wort ermitteln Java Basics - Anfänger-Themen 4
Tacofan Hangman als fertiges Spiel Java Basics - Anfänger-Themen 7
T Hangman spiel Java Basics - Anfänger-Themen 5
M hangman spiel Java Basics - Anfänger-Themen 1
L Hangman! Spiel Java Basics - Anfänger-Themen 5
K Hangman Spiel ! wie immer probleme Java Basics - Anfänger-Themen 25
S Spiel Hangman programmieren - Ausgabe funktioniert nicht!!! Java Basics - Anfänger-Themen 13
F Hangman Java Basics - Anfänger-Themen 14
Tacofan Hangman - ist der Buchstabe vorhanden wenn ja wo kommt er vor Java Basics - Anfänger-Themen 6
K Hangman Programm Java Basics - Anfänger-Themen 12
G Hangman GUI Java Basics - Anfänger-Themen 6
I Hangman CardLayout/repaint? Java Basics - Anfänger-Themen 2
A Hangman in Java programmieren - dringend Java Basics - Anfänger-Themen 8
NoXiD Hangman problem Java Basics - Anfänger-Themen 2
S Hangman! Java Basics - Anfänger-Themen 9
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
I Threads Spiel gol Java Basics - Anfänger-Themen 6
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
J ArrayList vergleichen im spiel Mastermind Java Basics - Anfänger-Themen 2
enesss tictactoe spiel Java Basics - Anfänger-Themen 5
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
httprt Probleme bei dem erstellen von leveln in meinem Spiel Java Basics - Anfänger-Themen 2
berserkerdq2 Habe ein Spiel entwickelt, dass immer in der 4 Runde einen cast-Fehler erhält Java Basics - Anfänger-Themen 3
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
Ekooekoo Hilfe spiel Java Basics - Anfänger-Themen 5
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
Kennewick Basketball Spiel Ergebnisse Java Basics - Anfänger-Themen 11
X Erste Schritte Hilfe bei einem kleinen Spiel. Java Basics - Anfänger-Themen 19
D Snake-Spiel ähnliche Aufgabe Hilfe Java Basics - Anfänger-Themen 3
JEP1 Java Dialog Fenster schließen Spiel Java Basics - Anfänger-Themen 0
I Simples Risiko-Spiel Java Basics - Anfänger-Themen 5
Hallolu Pong-Spiel: Schläger schneller werden lassen Java Basics - Anfänger-Themen 9
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
T Startbildschirm für ein Spiel erstellen Java Basics - Anfänger-Themen 0
Z Kein überprüfen des gesamten Arrays möglich.(Viergewinnt Spiel) Java Basics - Anfänger-Themen 6
G Ufo Spiel programmieren Java Basics - Anfänger-Themen 13
C Java Spiel Java Basics - Anfänger-Themen 3
J Spiel programmieren Java Basics - Anfänger-Themen 16
S Spiel-Programmieren. Wenn ein Objekt den anderen berührt. Java Basics - Anfänger-Themen 6
B Memory Spiel Java Basics - Anfänger-Themen 29
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
Kamy Ein einfaches "Vier Gewinnt" Spiel für Anfängerin Java Basics - Anfänger-Themen 51
A Breakout-Spiel , Ball mit Platten abprallen lassen Java Basics - Anfänger-Themen 1
S Spiel programmieren mit Java Java Basics - Anfänger-Themen 11
Olis Erste Schritte Simples Memory Spiel möglich? Java Basics - Anfänger-Themen 1
J Spiel mit Button klick starten Java Basics - Anfänger-Themen 9
C Rekursives Backtracking beim Spiel Peg Java Basics - Anfänger-Themen 22
M Spiel programmieren Java Basics - Anfänger-Themen 16
Spencer Reid Feedback zu kleinem Spiel Java Basics - Anfänger-Themen 4
kokojamboo92 Spiel programmieren Java Basics - Anfänger-Themen 1
R Kleines Java Spiel funktioniert nicht. Java Basics - Anfänger-Themen 2
I Spiel Java Basics - Anfänger-Themen 34
H ein einfaches Tic Tac Toe Spiel Java Basics - Anfänger-Themen 1
I Spiel programmieren. Java Basics - Anfänger-Themen 16
B Hilfe bei Escape - Spiel Java Basics - Anfänger-Themen 6
S Java-Spiel Java Basics - Anfänger-Themen 2
M Nim-Spiel geht in den negativen Bereich Java Basics - Anfänger-Themen 1
K Klassen Registrierungsseite für ein Spiel Java Basics - Anfänger-Themen 6
J Programmierung Quiz Spiel Java Basics - Anfänger-Themen 3
J Programmierung Quiz Spiel Java Basics - Anfänger-Themen 2
M Brauche Tipps für ein Spiel Java Basics - Anfänger-Themen 4
S Probleme mit GamGrid Spiel-Erstellung => Actor reagiert nicht auf Tastatur Java Basics - Anfänger-Themen 2
Mxxxt Mosaik Spiel - Steuerpanel wird nicht angezeigt Java Basics - Anfänger-Themen 5
M Erste Schritte Zufallszahl Spiel Problem Java Basics - Anfänger-Themen 7
Z Erste Schritte Kleines 2D. Spiel Objekt Bewegung funktioniert nicht Java Basics - Anfänger-Themen 2
H Spiel Kniffel: Gesamtes Array untersuchen. Java Basics - Anfänger-Themen 15
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
C Klassen Sudoku-Spiel Werte werden nicht gesetzt Java Basics - Anfänger-Themen 4
K Kleines Spiel auf Java programmieren Java Basics - Anfänger-Themen 2
W Tic Tac Toe Spiel ohne Arrays Java Basics - Anfänger-Themen 7
S Im objektorientiertem "Spiel" kämpfen Java Basics - Anfänger-Themen 3
I Klassen Umsetzungsfrage zu Spiel "Zuul" Java Basics - Anfänger-Themen 3
F Mastermind Spiel Java Basics - Anfänger-Themen 9
H Liste ausgeben (Spiel Hey Fisch (software-challenge) ändern Anzahl Fische) Java Basics - Anfänger-Themen 1
F Game-Engine für textbasierendes Spiel: Architektur? Java Basics - Anfänger-Themen 9
K Erste Schritte Frage Antwort Spiel - Fragen zur Planung Java Basics - Anfänger-Themen 2
J Java Spiel Zufallsauswahl für Zugbeginn Java Basics - Anfänger-Themen 3
J Frage Antwort Spiel - Wie Zeitcountdown realisieren? Java Basics - Anfänger-Themen 2
L Erste Schritte Spiel: Glückliches Sieben Java Basics - Anfänger-Themen 3
J 2 Pc's - Spiel gegeneinander ?! Java Basics - Anfänger-Themen 3
V Spiel Programmieren Java Basics - Anfänger-Themen 9
P 2D-Spiel und Bildschirmgröße Java Basics - Anfänger-Themen 2
O Methoden Fehlermeldung(Illegal start of expression) bei 4-Gewinnt-Spiel Java Basics - Anfänger-Themen 5
T Blöcke für ein Jump and Run Spiel Java Basics - Anfänger-Themen 8
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
S 2D-Spiel im Vollbild an größe anpassen? Java Basics - Anfänger-Themen 3
K JTextField in ein Spiel einfügen Java Basics - Anfänger-Themen 2
S Mosaik Spiel Java Basics - Anfänger-Themen 19
pinar memory spiel Java Basics - Anfänger-Themen 10
T OOP Mein erstes Java-Spiel - Schiffe versenken! Java Basics - Anfänger-Themen 2
K Erste Schritte Wie mache ich weiter? (Spiel-Menü) Java Basics - Anfänger-Themen 9
C Java Applet in html. Pong - old school Spiel Java Basics - Anfänger-Themen 10
J Variablen Invalid Character - Error -> Spiel mit Variablenergebnissen Java Basics - Anfänger-Themen 8
K Schere Stein Papier Spiel Java Basics - Anfänger-Themen 3
A Feedback zum Spiel Java Basics - Anfänger-Themen 5
F Hilfe bei meinem Spiel Java Basics - Anfänger-Themen 3
C Lotto Spiel Java Basics - Anfänger-Themen 23
Jagson Dotcom Spiel - Dots Random setzen Java Basics - Anfänger-Themen 8
Dogge Farben-Spiel Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben