package hangman;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class Hangman extends JApplet implements ActionListener {
private static final long serialVersionUID = -1844350059334672767L;
// Globale Variablen
final static int WND_B = 640, WND_H = 480; // Fenstergröße setzen
final static int EXIT_ON_CLOSE = 0;//
final static int SX = 70, SY = 90;// position der anzuzeigenden Bilder
String myword = null; // das zu erratene wort
String myquestion;
String myanswer;
char xyword[]; // das ungelöste Wort
char probed[];// getippte Buchstaben
char notprobed[];// nicht getippte Buchstaben
static final 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', 'Ä', 'Ö', 'Ü', 'ß' };
// Vereinbarung der Buchstaben
int mistakes; // Anzahl der Fehler
int tries; // Anzahl der Versuche
int maximum=5;
int ende=0;
int label;
int i=0;
boolean los=false;
boolean ergebnis=false;
KL control;// Keylistener Control vereinbaren
Vector<String> v_fragen = new Vector<String>();// Vector vereinbaren
Vector<String> v_woerter = new Vector<String>();// Vector vereinbaren
Vector<String> v_antworten = new Vector<String>();// Vector vereinbaren
Vector<String> v_image = new Vector<String>();// Vector vereinbaren
String stmp = new String();// String vereinbaren
// Konstruktor
public Hangman() {
control = new KL(); // neuer KeyListener: CONTROL
System.out.println("konstruktor");
}
public void init(){
final JButton start = new JButton("Los geht's...");
getContentPane().setLayout(new BorderLayout());
getContentPane().add(start, BorderLayout.CENTER);
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
los=true;
addKeyListener(control); // hinzufügen
getContentPane().remove(start);
requestFocus(); //setzt den Focus noch ..
repaint();
}
};
start.addActionListener(al);
System.out.println("init");
};
public void start(){
File f_fragen = new File("fragen.dat");// File
File f_woerter = new File("woerter.dat");// File
File f_antworten = new File("antworten.dat");// File
File f_image = new File("image.dat");
try {
FileReader fr_fragen = new FileReader(f_fragen);
FileReader fr_woerter = new FileReader(f_woerter);
FileReader fr_antworten = new FileReader(f_antworten);
FileReader fr_image = new FileReader(f_image);
char[] c_fragen = new char[(int) f_fragen.length()];
char[] c_woerter = new char[(int) f_woerter.length()];
char[] c_antworten = new char[(int) f_antworten.length()];
char[] c_image = new char[(int) f_image.length()];
fr_fragen.read(c_fragen);
fr_woerter.read(c_woerter);
fr_antworten.read(c_antworten);
fr_image.read(c_image);
String smtp_fragen =new String(c_fragen);
String smtp_woerter =new String(c_woerter);
String smtp_antworten =new String(c_antworten);
String smtp_image = new String (c_image);
// Den String bei Zeilenumbruch teilen und die einzelnen
// Teile (=Zeilen) in ein array of string schreiben
String[] entrys_woerter = smtp_woerter.split("#");
String[] entrys_antworten = smtp_antworten.split("\\|");
String[] entrys_fragen = smtp_fragen.split("\\|");
String[] entrys_image = smtp_image.split("\\#");
for (int i=0; i<entrys_image.length; i++){
v_image.addElement(entrys_image[i]);
}
for (int i=0; i<entrys_woerter.length; i++){
v_woerter.addElement(entrys_woerter[i]);
}
for (int i=0; i<entrys_fragen.length; i++){
v_fragen.addElement(entrys_fragen[i]);
}
for (int i=0; i<entrys_woerter.length; i++){
v_antworten.addElement(entrys_antworten[i]);
}
}catch (IOException ioe) { // Falls ein Fehler auftreten sollte
System.out.println("IOException: " + ioe.toString()); // Fehlermeldungausgeben
System.out.println(" Fehler beim Bearbeiten der Datendatei!");
System.exit(0);// Beenden
}
System.out.println("start");
neue_runde();
requestFocus(); //setzt den Focus
}
public void neue_runde(){
int wordseek = 0;
wordseek = (int) (Math.random() * v_fragen.size()); // hol' Dir einen
System.out.println ("Zufallszahl: "+ wordseek);
label=wordseek;
myword = v_woerter.elementAt(wordseek);
v_woerter.removeElementAt(wordseek);
myanswer = v_antworten.elementAt(wordseek);
v_antworten.removeElementAt(wordseek);
myquestion =v_fragen.elementAt(wordseek);
v_fragen.removeElementAt(wordseek);
reinitVariables();
repaint();// Fenster neu zeichnen
}
public void reinitVariables(){
if (myword == null)
{
myword = "Hallo";
}
mistakes = 0;
tries = 0;
xyword = new char[myword.length()];
Arrays.fill(xyword,'_');
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];
}
}
public void paint( Graphics g) { // die Grafiken
g.setFont( new Font("Arial", Font.BOLD, 12));
if(los){
g.setColor(new Color (199, 225, 242)); // Setzt Farbe
g.fillRect(0, 0, WND_B, WND_H);
g.setColor(Color.BLACK);
g.drawImage(getImage(getCodeBase(),"images/eingabe_feld.gif"), 50, 275, this);
g.drawString("Wort: " + new String(xyword), 85, 310);// Das Ratewort
if (mistakes != -1) {// Wenn noch kein Fehler gemacht wurde...
g.drawString("Buchstaben: ", 85, 375);// Buchstaben zeichnen
g.drawString("Versuche: " + (6-mistakes), 85, 340);// falsche Buchstaben
for (int i = 0; i < alphab.length; i++) {
g.drawChars(probed, i, 1, 175 + i * 8, 365);// getippte Buchstaben
g.drawChars(notprobed, i, 1, 175 + i * 8, 380);// Nicht getippte Buchstaben
}
}
if(mistakes !=-1){
if(mistakes !=6){
g.setFont( new Font("Arial", Font.BOLD, 16));
g.drawString(myquestion, 100, 50);
g.setFont( new Font("Arial", Font.BOLD, 12));
}
}
if(mistakes==5){
g.setColor(Color.red);
g.drawString("Achtung: Sie haben nur noch einen Versuch", 180, 402 );
g.setColor(Color.black);
}
g.setColor(Color.black);
g.drawString("Hinweis: Buchstabeneingabe erfolgt über die Tastatur!", 155, 450);
}
updatehangman(g); // Hangman updaten
}// Ende pain(Graphics g)
@Override
public void update(Graphics g) {
paint(g);
}
public void updatehangman(Graphics g) {
switch (mistakes) { // Verschiedenen Fälle für anzahl der nciht erratnen
// Buchstaben
case 6:// Wort nicht erraten
g.drawImage(getImage(getCodeBase(),"images/falsch.gif"), 450, 85, this);
g.setColor(Color.red); // Textfarbe auf Rot setzen
g.setFont( new Font("Arial", Font.BOLD, 14));
g.drawString(">>> FALSCH <<<", WND_B / 2 - 70, (WND_H / 2)+30);
g.setFont( new Font("Arial", Font.BOLD, 12));
g.setColor(Color.black); // Textfarbe auf Weiß setzen
g.drawString("Das gesuchte Wort war '" + myword + "'!",
WND_B / 4 + 50, WND_H / 2 + 70); // nicht erratenes Wort
ergebnis=false;
break;
case 5: // 5 Falsch getippte Buchstabe
g.drawImage(getImage(getCodeBase(),"images/hm5.gif"), SX, SY, this);
break;
case 4:// 4 Falsch getippte Buchstabe
g.drawImage(getImage(getCodeBase(),"images/hm4.gif"), SX, SY, this);
break;
case 3:// 3 Falsch getippte Buchstabeccc
g.drawImage(getImage(getCodeBase(),"images/hm3.gif"), SX, SY, this);
break;
case 2:// 2 Falsch getippte Buchstabe
g.drawImage(getImage(getCodeBase(),"images/hm2.gif"), SX, SY, this);
break;
case 1:// 1 Falsch getippter Buchstabe
g.drawImage(getImage(getCodeBase(),"images/hm1.gif"), SX, SY, this);
break;
case 0:// Noch kein Buchstabe falsch getippt
if(los){
g.drawImage(getImage(getCodeBase(),"images/hm0.gif"), SX, SY, this);
}
break;
case -1:// Wort erraten
g.drawImage(getImage(getCodeBase(),"images/richtig.gif"), 450, 85, this);
g.setColor(Color.green);// Textfarbe auf Grün setzen
g.setFont( new Font("Arial", Font.BOLD, 14));
g.setColor(new Color (21, 167, 21)); // Setzt Farbe auf Hellblau
g.drawString(">>> RICHTIG <<<", WND_B / 2 - 70, WND_H / 2+30);
g.setFont( new Font("Arial", Font.BOLD, 12));
g.setColor(Color.black); // Setzt Farbe auf Schwarz
ergebnis=true;
break;
}// Ende Switch
}// Ende UpdateHangMan (Graphics g)
// KeyListener
class KL implements KeyListener {// Keylistener
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
char c;
c = e.getKeyChar(); // Taste holen
c = Character.toUpperCase(c);
boolean status = false;// status den Wert "false" zuweisen
boolean check = false;// Check den Wer "false" zuweisen
int underscores = 0; // Integer für Anzahl der "_" im bisherigen
// Wort
for (int i = 0; i < myword.length(); i++) { // "Verschlüsseln" des
// Ratewortes
if (c == Character.toUpperCase(myword.charAt(i))) {
xyword[i] = myword.charAt(i);
status = true;// Status auf "true" setzen
}
if (xyword[i] == '_')// Wenn Ratewort Array
underscores++;// "_"+1
}
if(mistakes ==-1){
JPanel p_weiter = new JPanel();
p_weiter.setLayout(null);
final JTextArea antwort = new JTextArea(myanswer);
antwort.setFont( new Font("Arial", Font.BOLD, 15));
antwort.setBackground(new Color (199, 225, 242)); // Setzt Farbe 199, 225, 242
antwort.setEditable(false);
antwort.setBounds(40, 270, 575, 185);
antwort.setLineWrap(true);
final JLabel l1 = new JLabel( new ImageIcon(getImage(getCodeBase(),v_image.elementAt(label))));
l1.setBounds(50, 50, 100, 100);
System.out.println("Bild: "+v_image.elementAt(label));
getContentPane().add(antwort);
p_weiter.add(antwort);
p_weiter.add(l1);
final JButton weiter = new JButton("Weiter geht's");
weiter.setBounds(200, 450, 105, 20);
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
addKeyListener(control); // hinzufügen
getContentPane().remove(weiter);
getContentPane().remove(antwort);
requestFocus(); //setzt den Focus noch ..
if(v_fragen.isEmpty()){
ende=1;
remove(antwort);
remove(l1);
remove(weiter);
}
else{
neue_runde();
reinitVariables();
repaint();
}
}
};
p_weiter.add(weiter);
weiter.addActionListener(al);
antwort.setVisible(true);
weiter.setVisible(true);
l1.setVisible(true);
getContentPane().add(p_weiter);
p_weiter.requestFocus();
}
if (ende==1){
final JButton weiter = new JButton("Exit");
weiter.setBounds(200, 450, 105, 20);
ActionListener a2 = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
weiter.addActionListener(a2);
repaint();
}
for (int i = 0; i < alphab.length; i++) {// For-Schleife
// initialisieren
if (c == alphab[i]) {// wenn Buchstabe im Alphabet ist
if (probed[i] != c)
probed[i] = c;
else
// anderfalls
check = true;// Check auf "true" setzten
if (notprobed[i] == c)
notprobed[i] = '-';
if (!status && !check)// wenn der Buchstabe Falsch ist und nicht
mistakes++; // schon einmal Getippt wurde Fehler +1
System.out.println(status);
}
}
if (!check) // Wenn getippter Buchstabe falsch ist
tries++;// Versuche +1
if (underscores == 0 || mistakes >= 6) {// wenn keine "_" mehr im
// Wort sind und Fehler >=6
System.out.println(" (" + myword + ")");// das Ratewort ausgeben
System.out.println("Anzahl Versuche: " + tries
+ " davon falsch: " + mistakes);// Anzahl der Versuche
// ausgeben
System.out
.println("Getippte Buchstaben: " + new String (probed));// getippte
// Buchstaben
// ausgeben
System.out.println("Anzahl versch. Buchstaben im Wort: "
+ (tries - mistakes));// Anzahl der verschiedenen
// Buchstaben ausgeben
System.out.println("Trefferquote: "// Trefferquote ausgeben
+ (((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;// Fehler auf 6 setzen
repaint(); // Grafiken neuzeichnen
}// Ende Keytyped
}
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
}// Ende class KL