- weiterempfehlen
Hi, ich hab mir ne kleine version von Hangman geschrieben. Allerdings läuft das Programm immer nur 1. mal durch bis ein Wort erraten/nicht errate wurde. Find das ganze nen bischen unpraktisch und hab mir überlegt das es ja sinnvoller wäre wenn das Programm solangge weiterläuft, bis der Benutzer auf "Ende" klickt oder ein Wort nicht erraten wurde. Wollte das mit ner For Schleife machen, aber alles was ich probiert habe führte nur zum kompletten chaos. Könnte ,mir vielleicht mal jemand einen Tipp/ansatz geben wie man das realisieren könnte?
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.AbstractAction;
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 java.io.IOException;
import java.util.Arrays;
public class Hangman extends JPanel implements ActionListener {
private static final long serialVersionUID = -1844350059334672767L;
// 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
double runde = 0;
static int ende = 0;
KL control;
char c;
String ename = new String();
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 suche ien wort ist...
myword = stmp; // setze myword auf gerade gelesenen
break;// String
}
}
}
f.close(); // Datei wieder schließen
}// Ende von try
catch (IOException ioe){ // Falls ein Fehler auftreten sollte
System.out.println("IOException: " + ioe.toString()); // Fehlermeldungausgeben
System.out.println(" Fehler 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 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);
if (mistakes<6){
runde++;
}
new SortArray();
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
mistakes++; // schon einmal 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
mistakes = -1;// Lösungswort sind
if (mistakes >= 6)// wenn mehr als 5 Fehler gemacht wurden
mistakes = 6;
repaint(); // Grafikfenster neuzeichnen
}
}// Ende class KL
public class highscoreliste{
public void highscore(){
File hsfile = new File("highscore.dat");
if (hsfile.exists()) {//prüfen, ob die Datei existiert
try {
JDialog highscored = new JDialog();
JTextArea highscoreta = new JTextArea();
highscoreta.setEditable(false);
highscoreta.setLineWrap(true);
highscoreta.setBackground(Color.black);
highscoreta.setWrapStyleWord(true);
highscoreta.setForeground(Color.white);
highscored.add(highscoreta);
highscored.setTitle(".:Hangman:. - Highscore");
highscored.setSize( 300, 450 );
highscored.setResizable(false);
highscored.setLocation (450, 0);
FileReader hsfileR = new FileReader(hsfile);
//FileReader liest ein array of char und keinen String
char[] c = new char[(int) hsfile.length()];
hsfileR.read(c); //und in das erstellte char-array einlesen
String s = new String(c);//aus dem char-array einen string erzeugen
highscoreta.setText(s);
highscored.setVisible( true );
highscoreta.setVisible( true );
hsfileR.close(); //den FileReader wieder schließen
} catch (FileNotFoundException e) { //falls Fehler beim
e.printStackTrace(); //Einlesen auftreten,
} catch (IOException e) { //diese ausgeben
e.printStackTrace();
}
}
else {
}
};
};
public class SortArray { //In Objekten dieser inneren Klasse werden die einzelnen
//Highscore-einträge (Paare aus Spieler und Punkten) abgelegt
private class HighscoreEintrag implements Comparable<Object> {
private String name; //Speichert den Namen
private double punkte; //Speichert die Punkte
//Erzeugt einen neuen HighscoreEintrag
public HighscoreEintrag(String name, double punkte) {
this.name = name;
this.punkte = punkte;
}
public int compareTo(Object o) { //Vergleich des eigenen
HighscoreEintrag hE = (HighscoreEintrag) o;//Objekts mit dem übergebenen
if (this.punkte > hE.getPunkte()) {
return 1;
} else if (this.punkte < hE.getPunkte()) {
return -1;
}
return 0;
}
public String getName() { //Es folgen drei Funktionen, um die Werte auszulesen
name=ename;
return name;
}
public double getPunkte() {
punkte=runde;
return punkte;
}
public String toString() {
return this.name + ": " + this.punkte;
}
}//Ende der inneren Klasse
//Der Konstruktor, hier geht es richtig los
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.dat");
//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 (ohne dass Du es merkst)
Arrays.sort(highscore);
//Ausgabe der Liste
for (int i = 0; i < highscore.length; i++) {
System.out.println(highscore[i]);
}
//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();
}
}
}
@Override
public void actionPerformed(ActionEvent arg0) {
}
public static void main(String[] args){ // Main
Hangman Jpanel = new Hangman(); // Neuer Panel
Jpanel.setLayout(null);
final JFrame f = new JFrame("JFrame"); // Frame vereinbaren
Button endeb = new Button("Ende");
endeb.setBounds(320,175,80,20);
Jpanel.setFocusable(true);
Jpanel.requestFocusInWindow(); // Focus in Panel setzen
Jpanel.add(endeb);
ActionListener al = new ActionListener() {
public void actionPerformed( ActionEvent e ) {
ende=1;
System.out.println(ende);