import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
public class Hangman extends JPanel implements ActionListener
{
private static final long serialVersionUID = 1L;
// Globale Variablen
final static int WND_B=435, WND_H=360;
private static final 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;
private static JMenu bar = null;
private static JMenu datei = null;
private static JMenu info = null;
private static JMenuItem nochmal = null;
private static JMenuItem beenden = null;
private static JMenuItem spielregeln = null;
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) //Einlesen der Datensätze
{
wordcount++;
if (wordcount==0) //Wenn kein Wort gefunden wurde, Fehlermeldung ausgeben
{
System.out.println("ACHTUNG! In der Datendatei sind keine gültigen Wörter zu finden!");
}
System.out.println("Woerter in Datendatei: "+wordcount); // Statusbericht über Anzahl der Wörter
}
if (wordseek==0)
{
wordseek=(int)(Math.random()*wordcount)+1;// Bestimmt zufälliges Wort aus den Eingelesenen Wörtern
}
System.out.print("Ausgewaehltes Wort: #"+wordseek); // Gibt Statusbericht über ausgewähltes Wort
wordcount=0; // Setzt anzahl der Wörter wieder auf NULL
while ((stmp=f.readLine())!=null)
{
wordcount++;
if (wordcount==wordseek)
{
myword=stmp;
break;
}
}
}//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();
addKeyListener(control);
xyword=new char[myword.length()]; // array erstellen
for (int i=0;i<myword.length();i++) // array initialisieren
{
xyword[i]='_';
}
// array erstellen
probed=new char[alphab.length];
notprobed=new char[alphab.length];
// array initialisieren
for (int i=0;i<alphab.length;i++)
{
probed[i]='-';
notprobed[i]=alphab[i];
}
}//Ende der Hauptroutine
private static void initializeNewWindow()
{
final JFrame frame = new JFrame("Hangman");
frame.setTitle(".:Hangman:."); // Titel setzen
frame.setSize(435,360); // Größe setzen
frame.setBackground(Color.black);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
Hangman Jpanel = new Hangman();
frame.add(Jpanel,BorderLayout.CENTER);
Jpanel.requestFocusInWindow();
final JMenuBar hauptMenue = new JMenuBar();
Jpanel.add(hauptMenue);
getContentPane().add(Jpanel);
frame.setVisible(true);
bar = new JMenu();
datei = new JMenu("Datei");
info = new JMenu("Info");
nochmal = new JMenuItem("Neu starten");
beenden = new JMenuItem("Beenden");
spielregeln = new JMenuItem("Hilfe");
hauptMenue.add(bar);
bar.add(datei);
bar.add(info);
datei.add(nochmal);
datei.add(beenden);
info.add(spielregeln);
beenden.addActionListener(null);
nochmal.addActionListener(null);
spielregeln.addActionListener(null);
initializeNewWindow();
}
private static Container getContentPane()
{
// TODO Auto-generated method stub
return null;
}
public void actionPerformed(ActionEvent evt)
{
if (evt.getSource() == nochmal)
{
System.out.println("Neu starten");
}
else if (evt.getSource() == beenden)
{
System.exit(0);
}
else if (evt.getSource() == spielregeln)
{
System.out.println("Spielregeln");
}
}
public static void main(String[] args)
{
Hangman test = new Hangman();
test.setVisible(true);
initializeNewWindow();
}
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); // Fenster Weiß machen
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
}
public void UpdateHangMan(Graphics g)
{
Toolkit tk=Toolkit.getDefaultToolkit(); // Toolkit (für
// Grafikdatei-Support)
// zuweisen
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 public void UpdateHangMan
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); // Buchstabe(?) evtl.
// GROß machen
int i;
boolean status=false; // Booleans
boolean check=false; // für versch.
// Status-Werte
for (i=0;i<alphab.length;i++)
{
if (c==alphab[i]) // wenn c = einer der Buchstaben
{ //des Alphabets ist
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 public void keyTyped(KeyEvent e)
}// Ende class KL
}//Ende public class Hangman