import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.util.LinkedList;
import java.util.List;
import javax.print.DocFlavor.READER;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import de.fernschulen.hangman.Score.Liste;
public class HangManGui extends JFrame{
//automatisch über Eclipse eingefügt
private static final long serialVersionUID = -6079145268505563748L;
//ein Array mit Zeichenketten(!) für die Buchstaben
private String [] zeichen = new String[26];
//ein StringBuilder für die Darstellung des Suchwortes
private StringBuilder anzeige;
//ein String für das gesuchte Wort im Klartext
private String suchwort;
//für die verbleibenden Durchläufe
private int restDurchlauefe;
//Label für die Anzeige
private JLabel ausgabeText, anzVersuche;
//für die Auswahl
private JComboBox auswahl;
//zum Beenden
private JButton schaltflaecheBeenden;
//für das Bild
private HangManBildPanel anzeigeBild;
//für die Punkte
private Score spielpunkte;
private JLabel punktAusgabe;
//die innere Klasse für den ActionListener
class MeinListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//wer hat das Ereignis ausgelöst?
//die Schaltfläche
if (e.getSource() instanceof JButton) {
if (e.getActionCommand().equals("ende"))
System.exit(0);
}
//das Kombinationsfeld
if (e.getSource() instanceof JComboBox) {
//der aktuell ausgewählte Eintrag wird übergeben und ausgewertet
pruefen(auswahl.getSelectedItem());
//ist das Spiel zu Ende oder nicht?
gewinnerOderNicht();
}
}
}
//der Konstruktor
public HangManGui(String titel) {
super(titel);
//Initialwerte setzen
init();
//ein BorderLayout
setLayout(new BorderLayout());
//in die Mitte kommt das Panel mit der Grafik
anzeigeBild = new HangManBildPanel();
add(anzeigeBild,BorderLayout.CENTER);
//nach unten die Bedienelemente
add(bedienPanel(), BorderLayout.SOUTH);
//nach oben die Anzeigen
add(ausgabePanel(), BorderLayout.NORTH);
//ein Wort ermitteln
//neuesWort();
readShit();
//Größe setzen, Größenveränderungen verhindern, Standard-Aktion festlegen und anzeigen
setMinimumSize(new Dimension(350,350));
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void readShit() {
// TODO Auto-generated method stub
}
//die Methode setzt die Initialwerte
private void init() {
int tempIndex = 0;
//es geht los mit 9 verbleibenden Durchläufe
restDurchlauefe = 9;
//die Liste für das Kombinationsfeld füllen
for (char temp = 'a'; temp <= 'z'; temp++) {
zeichen[tempIndex] = Character.toString(temp);
tempIndex++;
}
//eine neue Instanz der Klasse Score für die Punkteverwaltung erzeugen
//als Parent wird this übergeben und modal ist true
spielpunkte = new Score(this, true);
}
class MyGame{
private List<String> woerter; //membervariable
//konstruktor
public void MyHangman(){
readShit(); //hier muss die liste mit wörtern eingelesen werden
}
//einlesen:
private void readListe(){
woerter=new LinkedList<String>();
String line;
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(new File("liste.bin")));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
while((line=reader.readLine())!=null){
woerter.add(line.trim());
}
} catch (IOException e) {
e.printStackTrace();
}
}
//irgendwas mit den wörtern machen
private String getRandomWord(){
return woerter.get( (new java.util.Random()).nextInt()%woerter.size() );
}
}
/*//die Methode ermittelt zufällig ein Wort
private void neuesWort() {
int zufall = 0;
String[] woerter ={"Test", "Automobil", "Versuch", "Hund", "Katze",
"Ziege", "Maus", "Elefant", "Isopropylalkohol", "Schwimmbad"};
//ein zufälliges Wort ermitteln
//dazu wird eine zufällige Zahl zwischen 0 und 1 ermitteln und mit der Länge von woerter - 1 mulitpliziert
zufall = (int)(Math.random() * (woerter.length-1));
//das Suchwort und die Zeichen für die Anzeige setzen
suchwort = new String(woerter[zufall]);
anzeige = new StringBuilder(suchwort);
//alle Zeichen in der Anzeige ersetzen durch *
for (int zeichen = 0; zeichen < suchwort.length(); zeichen++)
anzeige.setCharAt(zeichen, '*');
//die Sternchen anzeigen
ausgabeText.setText(anzeige.toString());
}*/
//die Methode erstellt ein Panel für die Bedienung
//Sie verbindet auch die Komponenten mit dem Listener
private JPanel bedienPanel() {
//ein neues Panel
JPanel bedienung = new JPanel();
//für den ActionListener
MeinListener listener = new MeinListener();
//mit linksbündigem FlowLayout
bedienung.setLayout(new FlowLayout(FlowLayout.LEFT));
//ein Label mit beschreibendem Text
bedienung.add(new JLabel("Ihre Auswahl:"));
//die Auswahl als Kombinationsfeld
auswahl = new JComboBox(zeichen);
bedienung.add(auswahl);
auswahl.addActionListener(listener);
//die Beenden-Schaltfläche
schaltflaecheBeenden = new JButton("Beenden");
schaltflaecheBeenden.setActionCommand("ende");
bedienung.add(schaltflaecheBeenden);
schaltflaecheBeenden.addActionListener(listener);
//das Panel zurückgeben
return bedienung;
}
//die Methode erstellt ein Panel für die Ausgaben
private JPanel ausgabePanel() {
//ein neues Panel
JPanel ausgabe = new JPanel();
//mit einem 2-spaltigen GridLayout
ausgabe.setLayout(new GridLayout(0,2));
//ein Label mit beschreibendem Text
ausgabe.add(new JLabel("Das gesuchte Wort"));
//ein leeres Label für die Ausgabe
ausgabeText = new JLabel();
ausgabe.add(ausgabeText);
//für die Anzahl der verbleibenden Versuche
ausgabe.add(new JLabel("Verbleibende Versuche:"));
anzVersuche=new JLabel(Integer.toString(restDurchlauefe));
ausgabe.add(anzVersuche);
ausgabe.add(new JLabel("Ihre Punkte:"));
punktAusgabe= new JLabel("0");
ausgabe.add(punktAusgabe);
//das Panel zurückgeben
return ausgabe;
}
//die Methode zum Prüfen
private void pruefen(Object auswahlZeichen) {
char zeichen;
int treffer = 0;
//das ausgewählte Zeichen aus dem Kombinationsfeld wieder umbauen
zeichen = auswahlZeichen.toString().charAt(0);
//gibt es das Zeichen auch im Suchwort?
//dabei vergleichen wir nur die Kleinbuchstaben
treffer = suchwort.toLowerCase().indexOf(zeichen);
//wenn wir nichts gefunden haben
if (treffer < 0) {
//1 von den verbleibenden Durchläufen abziehen
restDurchlauefe--;
//die restlichen Durchläufe anzeigen
anzVersuche.setText(Integer.toString(restDurchlauefe));
//die Fehler für die Anzeige erhöhen
anzeigeBild.erhoeheFehler(1);
//einen Punkt abziehen
punktAusgabe.setText(Integer.toString(spielpunkte.veraenderePunkte(-1)));
//und das Panel mit dem Bild neu zeichnen
anzeigeBild.repaint();
}
else {
//nach weiteren Vorkommen suchen
while (treffer >= 0) {
//das Zeichen aus der entsprechenden Position im Suchwort anzeigen
anzeige.setCharAt(treffer, suchwort.charAt(treffer));
//treffer erhöhen und dann weitersuchen
treffer++;
treffer = suchwort.toLowerCase().indexOf(zeichen,treffer);
//Punkte erhöhen
punktAusgabe.setText(Integer.toString(spielpunkte.veraenderePunkte(5)));
}
//das geänderte Wort anzeigen
ausgabeText.setText(anzeige.toString());
}
//den ausgewählten Buchstaben aus dem Feld entfernen
//damit verändert sich dann auch die Auswahl
auswahl.removeItem(auswahlZeichen);
}
private void gewinnerOderNicht() {
//ende steuert, ob das Spiel zu Ende ist
//nur dann wird die Liste geprüft und die Anwendung geschlossen
boolean ende = false;
//ist das Spiel zu Ende?
if (restDurchlauefe == 0) {
JOptionPane.showMessageDialog(this, "Sie haben leider verloren!\nDas gesuchte Wort war: " + suchwort);
ende = true;
}
//ist das Wort erraten worden?
if (anzeige.toString().equals(suchwort)) {
//pro verbleibendem Durchlauf gibt es noch 10 Punkte extra
spielpunkte.veraenderePunkte(restDurchlauefe * 10);
JOptionPane.showMessageDialog(this, "Hurra! Sie haben gewonnen!");
ende = true;
}
if (ende == true) {
//hat es für einen neuen Eintrag in der Bestenliste gereicht?
if (spielpunkte.neuerEintrag() == true)
// hier zeigen wir die liste an .
spielpunkte.listeZeigen();
System.exit(0);
}
}
}