Hi, bin momentan dabei Hangman zu programmieren. Das Spiel selbst läuft bei mir auch soweit, allerdings hab ich da noch ein paar kleine Probleme. Ich habe jetzt probiert eine Highscore Funktion ein zu bauen.... allerdings funktioniert das ganze nicht so wirklich. Ich hätte es gerne so, das nach dem Ende des Spiels ein Dialog aufgeht in dem die Highscore Liste steht und man seinen namen eingeben kann, der dann mit der erreichten Punktzahl in die Highscoreliste geschrieben wird. das klappt bei mir noch nicht so ganz... hat jemand ne idee woran es liegen könnte und kann mir vielleicht weiterhelfen?
mfg moe_joe
Code:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
public class Hangman extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
// Globale Variablen
final static int WND_B = 425, WND_H = 360;
final static int EXIT_ON_CLOSE = 0;
final int SX = 50, SY = 50;
RandomAccessFile file;
String myword = null; // das zu erratene wort
char xyword[]; // das ungelöste Wort
char probed[];
char notprobed[];
char alphab[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'Ä', 'Ö', 'Ü', 'ß' };
int mistakes = 0; // Anzahl der Fehler
int tries = 0; // Anzahl der Versuche
KL control;
char c;
public Hangman() // Hauptroutine
{
String stmp = new String();
try {
int wordcount = 0; // neuer Integer für Wörterzahl
int wordseek = 0; // ~ für Zielwort-Position
RandomAccessFile f = new RandomAccessFile("hangman.dat", "r");
while ((stmp = f.readLine()) != null) {
wordcount++;
}
if (wordcount == 0) {
System.out
.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden.");
System.exit(0);
}
System.out.println("Woerter in Datendatei: " + wordcount); // Statusbericht
while (wordseek == 0) // Solange wordseek noch 0 ist, tue ...
{
wordseek = (int) (Math.random() * wordcount) + 1; // hol' Dir
// einen
// Integer-Wert
}
System.out.print("Ausgewaehltes Wort: #" + wordseek); // Statusbericht
f.seek(0); // Position auf Dateianfang setzen
wordcount = 0; // Wieder auf NULL
while ((stmp = f.readLine()) != null) // und das ganze von vorne
{
if (stmp.charAt(0) != '#') {
wordcount++;
if (wordcount == wordseek) // wenn an der Position, die wir
// suchen ...
{
myword = stmp; // setze myword auf gerade gelesenen
// String
break;
}
}
}
f.close(); // Datei wieder schließen
}// Ende von try
catch (IOException ioe) // Falls ein Fehler auftreten sollte
// Fehlermeldung ausgeben
{
System.out.println("IOException: " + ioe.toString()); // Fehlermeldung
System.out
.println("\n\nFehler beim Bearbeiten der Datendatei. Stellen Sie sicher," +
" daß die Datei HANGMAN.DAT auch existiert und lesbar ist.");
System.exit(0);// Beenden
}
KeyListener control = new KL(); // neuer KeyListener: CONTROL
addKeyListener(control); // hinzufügen
xyword = new char[myword.length()]; // array erstellen
for (int i = 0; i < myword.length(); i++) {
xyword[i] = '_';
}
probed = new char[alphab.length]; // array erstellen
notprobed = new char[alphab.length];
for (int i = 0; i < alphab.length; i++) {
probed[i] = '-';
notprobed[i] = alphab[i];
}
}// Ende Public Hangman () Hauptroutine
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) // die Grafiken
{
Toolkit tk = Toolkit.getDefaultToolkit();
g.setColor(Color.black); // Setzt Farbe auf Schwarz
g.fillRect(0, 0, WND_B, WND_H);
g.drawImage(tk.getImage("images/bg.gif"), 1, 1, this);
g.drawString("Wort: " + new String(xyword), 40, 215);
if (mistakes != -1) {
g.drawString("Buchstaben: ", 40, 260);
for (int i = 0; i < alphab.length; i++) {
g.drawChars(probed, i, 1, 118 + i * 8, 260);
g.drawChars(notprobed, i, 1, 118 + i * 8, 275);
}
g.drawString("Fehler: " + mistakes, 40, 230);
}
updatehangman(g); // Hangman updaten
}// Ende pain(Graphics g)
public static void highscore() {
File highscorefile = new File("highscore.txt");
FileReader highscorefilereader = new FileReader(highscorefile);
JDialog highscoredialog = new JDialog();
JTextField highscoretextfield = new JTextField();
JTextArea highscoretextarea = new JTextArea();
JButton hsbutton = new JButton("Hinzufügen");
char[] highscore = new char[(int) highscorefile.length()];
highscorefilereader.read(highscore);
String hss =highscoretextarea.getText();
highscoredialog.add(hsbutton);
highscoredialog.setDefaultCloseOperation
(
WindowConstants.DISPOSE_ON_CLOSE
);
highscoredialog.add(highscoretextfield);
highscoredialog.add(highscoretextarea);
highscoretextarea.setEditable(false);
highscoretextarea.setSize(300, 400);
String (highscore)= highscoretextarea.getText();
highscoredialog.setTitle(".:Hangman:. - Highscore");
highscoredialog.setSize( 300, 450 );
highscoredialog.setResizable(false);
highscoredialog.setLocation (450, 0);
highscoredialog.setBackground(Color.black); // Hintergrund schwarz
hsbutton.setLocation (450, 0);
highscoretextfield.setLocation (450, 0);
highscoretextfield.setVisible(true);
highscoretextarea.setVisible(true);
highscoredialog.setVisible(true);
ActionListener hsb = new ActionListener() {
public void actionPerformed( ActionEvent e ) {
System.exit( 0 );
}
};
hsbutton.addActionListener(hsb);
}
public void updatehangman(Graphics g) {
Toolkit tk = Toolkit.getDefaultToolkit(); // Toolkit für grafikdateien
switch (mistakes) // Verschiedenen Fälle für Fehlermeldungen
{
case 6:
g.drawImage(tk.getImage("images/hm6.gif"), SX, SY, this);
g.setColor(Color.red);
g.drawString(">>> VERLOREN <<<", WND_B / 2 - 70, WND_H / 2 + 10);
g.setColor(Color.white);
g.drawString("Das gesuchte Wort war '" + myword + "'!",
WND_B / 4 - 100, WND_H / 2 - 10);
removeKeyListener(control);
break;
case 5:
g.drawImage(tk.getImage("images/hm5.gif"), SX, SY, this);
break;
case 4:
g.drawImage(tk.getImage("images/hm4.gif"), SX, SY, this);
break;
case 3:
g.drawImage(tk.getImage("images/hm3.gif"), SX, SY, this);
break;
case 2:
g.drawImage(tk.getImage("images/hm2.gif"), SX, SY, this);
break;
case 1:
g.drawImage(tk.getImage("images/hm1.gif"), SX, SY, this);
break;
case 0:
g.drawImage(tk.getImage("images/hm0.gif"), SX, SY, this);
break;
case -1:
g.drawImage(tk.getImage("images/hm.gif"), SX, SY, this);
g.setColor(Color.green);
g.drawString(">>> GEWONNEN <<<", WND_B / 2 - 70, WND_H / 2 + 10);
removeKeyListener(control);
break;
}// Ende Switch
}// Ende UpdateHangMan (Graphics g)
class KL implements KeyListener {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
c = e.getKeyChar(); // Taste holen
c = Character.toUpperCase(c);
int i;
boolean status = false;
boolean check = false;
for (i = 0; i < alphab.length; i++) {
if (c == alphab[i]) {
if (probed[i] != c)
probed[i] = c;
else
check = true;
if (notprobed[i] == c)
notprobed[i] = '-';
}
}
int underscores = 0; // Integer für Anzahl der "_" im bisherigen
// Wort
for (i = 0; i < myword.length(); i++) // "Verschlüsseln" des
// Ratewortes
{
if (c == Character.toUpperCase(myword.charAt(i))) {
xyword[i] = myword.charAt(i);
status = true;
}
if (xyword[i] == '_')
underscores++;
}
if (!status && !check)// wenn der Buchstabe Falsch ist und nicht
// schon einmal
mistakes++; // Getippt wurde Fehler +1
if (!check)
tries++;
if (underscores == 0 || mistakes >= 6) {
System.out.println(" (" + myword + ")");
System.out.println("Anzahl Versuche: " + tries
+ " davon falsch: " + mistakes);
System.out
.println("Getippte Buchstaben: " + new String(probed));
System.out.println("Anzahl versch. Buchstaben im Wort: "
+ (tries - mistakes));
System.out.println("Trefferquote: "
+ (((tries - mistakes) * 100) / tries) + "%");
}
if (underscores == 0) // wenn keine fehlenden Zeichen im
// Lösungswort sind
mistakes = -1;
if (mistakes >= 6)// wenn mehr als 5 Fehler gemacht wurden
mistakes = 6;
repaint(); // Grafikfenster neuzeichnen
}
}// Ende class KL
public class sortArray {
//In Objekten dieser inneren Klasse werden die einzelnen
//Highscore-einträge abgelegt
private class HighscoreEintrag implements Comparable {
//Speichert den Namen
private String name;
//Speichert die Punkte
private double punkte;
//Erzeugt einen neuen HighscoreEintrag
public HighscoreEintrag(String name, double punkte) {
this.name = name;
this.punkte = punkte;
}
//Vergleichsfunktio
public int compareTo(Object o) {
HighscoreEintrag hE = (HighscoreEintrag) o;
if (this.punkte > hE.getPunkte()) {
return 1;
} else if (this.punkte < hE.getPunkte()) {
return -1;
}
return 0;
}
//Es folgen drei Funktionen, um die Werte auszulesen
public String getName() {
String eingabe = highscoretextfield.getText();
return name;
}
public double getPunkte() {
String trefferquote = "Trefferquote: "
+ (((tries - mistakes) * 100) / tries) + "%";
return punkte;
}
public String toString() {
return this.name + ": " + this.punkte;
}
}//Ende der inneren Klasse
//Der Konstruktor
public sortArray() {
//Ein Array mit 10 einträgen vom Type HighScoreEintrag wird erstellt
//In diesem Array werden die einzenen Paare aus Spieler und Punktestand
//gespeichert
HighscoreEintrag[] highscore = new HighscoreEintrag[10];
//Ein neue "Dateiverbindung" erstellen
File f = new File("highscore.txt");
//prüfen, ob die Datei existiert
if (f.exists()) {
try {
//Wenn sie existiert werden wir sie mit dem FileReader auslesen
FileReader fR = new FileReader(f);
//FileReader liest ein array of char und keinen String
char[] c = new char[(int) f.length()];
//und in das erstellte char-array einlesen
fR.read(c);
//aus dem char-array einen string erzeugen, der dann den
//Dateinhalt enthält
String s = new String(c);
//Den String bei Zeilenumbruch teilen und die einzelnen
//Teile (=Zeilen) in ein array of string schreiben
String[] entrys = s.split("\n");
////jede Zeile der Datei abarbeiten
for (int i = 0; i < entrys.length; i++) {
//Jede einzelene Zeile bei : trennen
//dieser wurde als Trennzeichen zwischen Spieler und
//Punktestand gewählt
if (i < 10) {
String[] entry = entrys[i].split(":");
//einen neuen Highscoreeintrag mit den eingelesenen
//Erzeugen, an der entsprechenden stelle im oben
//defineirten Array
highscore[i] = new HighscoreEintrag(entry[0], Double
.parseDouble(entry[1]));
}
}
//den FileReader wieder schließen
fR.close();
} catch (FileNotFoundException e) { //falls Fehler beim
e.printStackTrace(); //Einlesen auftreten,
} catch (IOException e) { //diese ausgeben
e.printStackTrace();
}
} else
{
//Wenn die Datei nicht existiert werden Beispieleinträge angelegt
highscore[0] = new HighscoreEintrag("a", 10);
highscore[1] = new HighscoreEintrag("b", 90);
highscore[2] = new HighscoreEintrag("c", 55);
highscore[3] = new HighscoreEintrag("d", 5);
highscore[4] = new HighscoreEintrag("e", 20);
highscore[5] = new HighscoreEintrag("f", 50);
highscore[6] = new HighscoreEintrag("g", 40);
highscore[7] = new HighscoreEintrag("h", 80);
highscore[8] = new HighscoreEintrag("i", 30);
highscore[9] = new HighscoreEintrag("j", 70);
}
//Das Array wird sortiert!
//Dabei wird die in dem HighscoreEintrag implementierte
//Vergleichsfunktion verwendet
Arrays.sort(highscore);
//Ausgabe der Liste
for (int i = 0; i < highscore.length; i++)
{
highscoretextarea.append(highscore[i].toString());
}
//Der FileWriter ist analog zum FileReader
try {
FileWriter fW = new FileWriter(f);
for (int i = 0; i < highscore.length; i++) {
if (i < highscore.length - 1) {
fW.write(highscore[i].toString() + "\n");
} else {
fW.write(highscore[i].toString());
}
}
fW.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) // Main
{
Hangman Jpanel = new Hangman(); // Neuer Panel
final JFrame frame = new JFrame("JFrame"); // Frame vereinbaren
Jpanel.setFocusable(true);
Jpanel.requestFocusInWindow(); // Focus in Panel setzen
frame.setTitle(".:Hangman:."); // Titel setzen
frame.add(Jpanel, BorderLayout.CENTER); // Frame den Panel zuweisen
frame.setSize(425, 360); // Größe setzen
frame.setResizable(false);
frame.setBackground(Color.white); // Hintergrund schwarz
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Beim Klicken
JMenuBar menuBar = new JMenuBar(); // Menübar erstellen
frame.setJMenuBar(menuBar); // Menü dem Frame zuweisen
JMenu datei = new JMenu("Datei"); // Menüpunkt "Datei" Vereinbaren
menuBar.add(datei); // Menüpunkt "Datei" der Menübar hinzufügen
JMenu hilfe = new JMenu("Hilfe"); // Menüpunkt "Hilfe" vereinbaren
menuBar.add(hilfe); // Menüpunkt "Hilfe" der Menübar hinzufügen
datei.add(new AbstractAction("Nochmal") {
public void actionPerformed(ActionEvent arg0) {
System.out.print("Nochmal...");
frame.dispose();
initializeNewWindow();
}
private void initializeNewWindow() {
// TODO Auto-generated method stub
}
});
datei.add(new AbstractAction("Beenden") {
public void actionPerformed(ActionEvent e) {
System.out.println("Beenden...");
System.exit(0);
}
});
hilfe.add(new AbstractAction("Spielregeln") {
public void actionPerformed(ActionEvent e){
System.out.println("Spielregeln...");
JDialog d = new JDialog();
JTextArea ta = new JTextArea();
ta.setEditable(false);
ta.setLineWrap(true);
ta.setBackground(Color.black);
ta.setWrapStyleWord(true);
ta.setForeground(Color.white);
ta.setText(" .:Hangman:. Spielregeln" +
" " +
"Wenn das spiel startet erscheint eine Kette von Strichen, " +
"die so viele Elemente enthält wie das zu erratene Wort lang ist. " +
"Nun geben Sie einen beliebigen Buchstaben des Alphabets ein (A-Z, ü, ä, ö, ß). " +
"Falls der Buchstabe vorkommt, wird er über jeden Strich geschrieben, " +
"der an einer Position steht, an der der Buchstabe im Wort verwendet wird. " +
"Falls der Buchstabe nicht vorkommt, wird ein Galgen mit einem Strichmännchen " +
"um ein weiteres von insgesamt 6 Elementen vervollständigt. Im unteren teil " +
"des Fensters sehen Sie die von ihnen schon getippten Buchstaben. Wurde das " +
"Wort erraten, bevor der Galgen komplett gezeichnet werden konnte, ist das S" +
"piel gewonnen. Andernfalls ist das spiel beendet und der Computer hat Gewonnen." +
" Viel Spaß!");
d.add(ta);
d.setTitle(".:Hangman:. - Spielregeln");
d.setSize( 300, 450 );
d.setResizable(false);
d.setLocation (450, 0);
d.setVisible( true );
}});
hilfe.add(new AbstractAction("Highscore") {
public void actionPerformed(ActionEvent e){
System.out.println("Highscore...");
highscore();
}});
frame.setVisible(true);// Frame sichtbar machen
}// Ende Main
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}// Ende public class Hangman
mfg moe_joe