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;
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 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 public void keyTyped(KeyEvent e)
}// Ende class KL
public static void main(String[] args) // Main
{
Hangman Jpanel = new Hangman(); // Neuer Panel
final JFrame frame = new JFrame("JFrame"); // Frame vereinbaren
JMenuBar menuBar = new JMenuBar();// Menübar erstellen
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
frame.setVisible(true);// Frame sichtbar machen
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")
d.add(ta);
d.setTitle(".:Hangman:. - Spielregeln");
d.setSize( 300, 450 );
d.setResizable(false);
d.setLocation (450, 0);
d.setVisible( true );
}
});
}// Ende Main
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}// Ende public class Hangman