Spielfelder auch über die Tastatureingabe (1…9) ansteuern (Tic Tac Toe)

josef333

Neues Mitglied
Hallo zusammen, ich habe ein Tic Tac Toe Spiel programmiert, das mit dem Maus gespielt wird. Ich möchte aber neben der Maus auch über die Tastatureingabe die Spielfelder ansteuern, z.B bei Eingabe von '7' wird die linke obere Ecke vom Spielfeld gekreuzt.

Das ist mein Buttonplacement Klasse:
Java:
package tic_tac_toe;


public class buttonplacement {
  
    public static void place()
    {
        GUI.btn[0].setBounds(175,50,150,150);
        GUI.btn[1].setBounds(325,50,150,150);
        GUI.btn[2].setBounds(475,50,150,150);
      
        GUI.btn[3].setBounds(175,200,150,150);
        GUI.btn[4].setBounds(325,200,150,150);
        GUI.btn[5].setBounds(475,200,150,150);;
      
        GUI.btn[6].setBounds(175,350,150,150);
        GUI.btn[7].setBounds(325,350,150,150);
        GUI.btn[8].setBounds(475,350,150,150);
    }
  
}

GUI Klasse:
Java:
package tic_tac_toe;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class GUI {
  
    JFrame jf ;
    Draw draw ;
    JButton  btnreset ;
  

   static JButton btn[] = new JButton[9];
   static int state[]= new int[9];
   static int player = 0 ;
   static int gwinner = 0 ;
   public GUI()
    {
        jf = new JFrame();
        jf.setSize(800, 600);
        jf.setLocationRelativeTo(null);
        jf.setResizable(false);
        jf.setTitle("tic tac toe");
      
        for (int i=0; i<btn.length; i++)
        {
            btn[i]= new JButton();
            btn[i].setVisible(true);
            btn[i].addActionListener(new actionshandler());
            btn[i].setFocusPainted(false);
            btn[i].setContentAreaFilled(false);
            btn[i].setBorder(null);
            jf.add(btn[i]);
        }
      
        buttonplacement.place();
      
      
        btnreset = new JButton("Play again");
        btnreset.setBounds(675,300,100,40);
        btnreset.setVisible(true);
        btnreset.setBackground(new Color(51,102,153));
        btnreset.setForeground(Color.white);
        btnreset.setFocusPainted(false);
        btnreset.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent ae) {
                funktion.reset();
            }
          
        });
  
        jf.add(btnreset);
        draw = new Draw () ;
        draw.setBounds(0, 0, 800, 600);
        draw.setVisible(true);
        jf.add(draw);
      
      
        jf.setVisible(true);
    
    }
  
  
  
}

Actionhandler Klasse:

Java:
package tic_tac_toe;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

public class actionshandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent ae) {
         int mode = Tic_tac_toe.mode;
     if (mode == 1)
     {
        if(GUI.gwinner == 0){
            if(ae.getSource() == GUI.btn[0])
            {
                if(GUI.state[0]==0 && GUI.player==0){
                    GUI.state[0]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[0]==0 && GUI.player==1){
                    GUI.state[0]=2;
                    GUI.player=0;
                }
            }else if (ae.getSource() == GUI.btn[1])
            {
                if(GUI.state[1]==0 && GUI.player==0){
                    GUI.state[1]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[1]==0 && GUI.player==1){
                    GUI.state[1]=2;
                    GUI.player=0;
                    }
        
            }
           else if (ae.getSource() == GUI.btn[2])
            {
                if(GUI.state[2]==0 && GUI.player==0){
                    GUI.state[2]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[2]==0 && GUI.player==1){
                    GUI.state[2]=2;
                    GUI.player=0;
                    }
        
            }
            else if (ae.getSource() == GUI.btn[3])
            {
                if(GUI.state[3]==0 && GUI.player==0){
                    GUI.state[3]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[3]==0 && GUI.player==1){
                    GUI.state[3]=2;
                    GUI.player=0;
                    }
        
            }
            else if (ae.getSource() == GUI.btn[4])
            {
                if(GUI.state[4]==0 && GUI.player==0){
                    GUI.state[4]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[4]==0 && GUI.player==1){
                    GUI.state[4]=2;
                    GUI.player=0;
                    }
        
            }
            else if (ae.getSource() == GUI.btn[5])
            {
                if(GUI.state[5]==0 && GUI.player==0){
                    GUI.state[5]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[5]==0 && GUI.player==1){
                    GUI.state[5]=2;
                    GUI.player=0;
                    }
        
            }
            else if (ae.getSource() == GUI.btn[6])
            {
                if(GUI.state[6]==0 && GUI.player==0){
                    GUI.state[6]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[6]==0 && GUI.player==1){
                    GUI.state[6]=2;
                    GUI.player=0;
                    }
        
            }
            else if (ae.getSource() == GUI.btn[7])
            {
                if(GUI.state[7]==0 && GUI.player==0){
                    GUI.state[7]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[7]==0 && GUI.player==1){
                    GUI.state[7]=2;
                    GUI.player=0;
                    }
        
            }
            else if (ae.getSource() == GUI.btn[8])
            {
                if(GUI.state[8]==0 && GUI.player==0){
                    GUI.state[8]=1;
                    GUI.player=1;
                    
                }else if(GUI.state[8]==0 && GUI.player==1){
                    GUI.state[8]=2;
                    GUI.player=0;
                    }
        }
     }
            }

Vielen Dank!

bild.png
 
K

kneitzel

Gast
Da könntest Du einen KeyListener für verwenden, den Du dann den Componenten, die den Focus haben können, zuordnest.

Und den Code kannst Du deutlich vereinfachen:

a) Du hast viele Blöcke, die so aussehen:
Java:
if(ae.getSource() == GUI.btn[0])
            {
                if(GUI.state[0]==0 && GUI.player==0){
                    GUI.state[0]=1;
                    GUI.player=1;
                  
                }else if(GUI.state[0]==0 && GUI.player==1){
                    GUI.state[0]=2;
                    GUI.player=0;
                }
            }
Und das dann 9 mal. Das kann man optimieren über eine Schleife (Ansatz 1). Also einfach eine schleife von 0-9 drüber laufen lassen mit dem Inhalt wie gehabt.

Die Alternative könnte aber auch sein, dass man die Zuweisung heraus nimmt. Du hast dann nur etwas wie:
- Index bekommen
- Dann umsetzen.

b) Du hast da immer dieses if/else:
Java:
                if(GUI.state[0]==0 && GUI.player==0){
                    GUI.state[0]=1;
                    GUI.player=1;
                }else if(GUI.state[0]==0 && GUI.player==1){
                    GUI.state[0]=2;
                    GUI.player=0;
                }
Wenn GUI.player immer nur 0 oder 1 sein kann, dann wäre das GUI.state[0] immer GUI.player+1.
Und der Wechsel wäre dann auch über ein ähnliches Konstrukt denkbar.

Generell gilt aber auch:
- Sieh zu, dass Du das static los wirst. Du hast ja eine Instanz von GUI und in der bewegst Du Dich. Damit hättest Du dann nur noch player. statt GUI.player. (Und du könntest ohne Static auch mehrere GUI Instanzen haben ...).
- Evtl. weiter unterteilen und ggf. eigene Klassen / Typen erzeugen. Also z.B. ein enum Player { NONE; PLAYER_ONE, PLAYER_TWO), das dann benutzt werden kann. Und das hätte dann auch eine Methode next() oder so. Dann würde so Code oben einfach sein:

Java:
                if(state[i]==Player.NONE) {
                    state[i]=player;
                    player=player.next();
                }
(Wenn man also das gewählte Feld identifiziert hat .. Das wäre aber dann auch eine eigenständige Methode, denn die brauchst du dann jan icht nur beim click sondern auch bei der Eingabe über Tastatur.

Edit: Ich habe natürlich vergessen zu erwähnen: Der separate ActionHandler würde da dann auch entfallen. Das wandert dann mit in die Klasse GUI. Anders wäre ja auch der Zugriff nicht möglich auf die Instanzvariablen....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
MoxxiManagarm JavaFX Auch ich versuche mit JavaFX warm zu werden AWT, Swing, JavaFX & SWT 9
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
I Swing JMenuBar auch unten am JFrame? AWT, Swing, JavaFX & SWT 2
M JavaFX - Bild in Jar einbinden, sodass es auch außerhalb der IDE geladen wird. AWT, Swing, JavaFX & SWT 2
D Swing Schließen von JDialog soll auch JFrame schließen. AWT, Swing, JavaFX & SWT 4
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
B Event Handling Mausbewegung auch außerhalb eines JFrames registrieren AWT, Swing, JavaFX & SWT 2
A LayoutManager Statusleiste auch nach Verkleinerung des Fensters anzeigen AWT, Swing, JavaFX & SWT 1
N Swing Alle Objekte anzeigen auch bei JPanel-Überlappung AWT, Swing, JavaFX & SWT 6
S g.setStroke verändert auch Buttonrahmen AWT, Swing, JavaFX & SWT 2
B Play Button auch als Stop Button benutzen, MP3 Player AWT, Swing, JavaFX & SWT 7
P Swing In JTable Header auch an der linken Seite AWT, Swing, JavaFX & SWT 2
GUI-Programmer LayoutManager NullLayout - Ist es auch in diesem Fall schlecht? AWT, Swing, JavaFX & SWT 3
T Rectangle Namen geben? Alternativen auch gerne gesehen. AWT, Swing, JavaFX & SWT 2
T jPanels im jFrame bewegen - Auch ohne Textfield? AWT, Swing, JavaFX & SWT 4
A Defaults auch für SWT AWT, Swing, JavaFX & SWT 7
JuliaOne Komponenten innerhalb eine JScrollpane werden auch ausserhalb davon gezeichnet! AWT, Swing, JavaFX & SWT 7
H GridBagLayout spinnt beim vergrößern des Fensters als auch beim Maximieren AWT, Swing, JavaFX & SWT 4
Private Void LayoutManager Cardwechsel im CardLayout auch von Card aus? AWT, Swing, JavaFX & SWT 6
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
Spin Auch JTable - checkboxes AWT, Swing, JavaFX & SWT 8
R Swing Warum wird der Inhalt auch Transparent? AWT, Swing, JavaFX & SWT 8
? Tabelle formatieren - auch ohne CellRenderer? AWT, Swing, JavaFX & SWT 6
S Tabelle soll sich auch in der Höhe resizen? AWT, Swing, JavaFX & SWT 4
G fireTableDataChanged() geht das auch ohne vector? AWT, Swing, JavaFX & SWT 13
C JTextField auch für zahlenwerte? AWT, Swing, JavaFX & SWT 5
R Frage zu Listfeld oder jTable, auch andere Fragen AWT, Swing, JavaFX & SWT 5
T Auf Fenster innerhalb der Anwendung zugreifen-auch elegant? AWT, Swing, JavaFX & SWT 2
B fire methoden auch bei defaultTableModel? AWT, Swing, JavaFX & SWT 5
F gibt etwas wie frames in html auch in java? AWT, Swing, JavaFX & SWT 19
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
M kann man in ein Jtable auch bilder machen? AWT, Swing, JavaFX & SWT 15
K insertHTMLTextAction auch mit Attributen? AWT, Swing, JavaFX & SWT 3
M JFileChooser und multiple Selektierung auch für Verz? AWT, Swing, JavaFX & SWT 2
Z FileChooer auch mit SWT benutzen? AWT, Swing, JavaFX & SWT 2
P Scrollbar/Pane auch mit negativen x,y - Werten AWT, Swing, JavaFX & SWT 2
M auch JScrollPane aber mit Zoomen, wie wird der View gesetzt AWT, Swing, JavaFX & SWT 2
G auch mit rechter Maustaste in einer Tabelle markieren? AWT, Swing, JavaFX & SWT 3
I JTextfield senden über Enter AWT, Swing, JavaFX & SWT 1
T Scene wechseln über ManuItem AWT, Swing, JavaFX & SWT 7
I JavaFX - Pane wechseln über 2. Controller AWT, Swing, JavaFX & SWT 5
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
A Layoutwechsel über RadioButtons AWT, Swing, JavaFX & SWT 3
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Performance / ImageView in TableView über TimeLine AWT, Swing, JavaFX & SWT 1
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
C Swing Aufruf der Funktion (die ein Dialog anzeigt) über Symbol anzeigen lassen AWT, Swing, JavaFX & SWT 4
G LayoutManager Panels anordnen über Schleifenvariablen AWT, Swing, JavaFX & SWT 7
F Verzeichnis über GUI erstellen AWT, Swing, JavaFX & SWT 2
T GUI über Tastatur bedienen AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
L JavaFX TreeView Edit Mode über F2 AWT, Swing, JavaFX & SWT 13
J Schriftart über einen Button ändern AWT, Swing, JavaFX & SWT 1
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
A 2D-Grafik Zeichen werden über unabhängingen JRadioButton nicht gefüllt AWT, Swing, JavaFX & SWT 28
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
C JavaFX ScrollPane schießt über das Ziel hinaus... AWT, Swing, JavaFX & SWT 1
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
R Ausgabe über JOptionPane.showMessageDialog funktioniert nicht AWT, Swing, JavaFX & SWT 2
L JavaFX button über andere Klasse ändern AWT, Swing, JavaFX & SWT 7
K über Button andere Java Klasse aufrufen AWT, Swing, JavaFX & SWT 15
T .jar-Datei lässt sich unflexibler ausführen als über die IDE AWT, Swing, JavaFX & SWT 11
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
L JavaFX Hover Effekt über das Parent Element AWT, Swing, JavaFX & SWT 4
C JavaFX GUI - Entscheidung über Framework AWT, Swing, JavaFX & SWT 4
A Swing Gemaltes Bild über saveDialog speichern unter AWT, Swing, JavaFX & SWT 15
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
Augenblau JavaFX Externe Schriftart über CSS ansprechen und zuweisen AWT, Swing, JavaFX & SWT 5
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
Z JAVAFX Stage über Controller weitergeben um css-file zu laden AWT, Swing, JavaFX & SWT 4
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
wolfgang63 JavaFX Zugriff auf Guiobjekte die über FXML erstellt wurden AWT, Swing, JavaFX & SWT 2
O JTextfield wird über'drawed'.. AWT, Swing, JavaFX & SWT 6
K JavaFX Fenster aufrufen über Menü AWT, Swing, JavaFX & SWT 1
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
kaoZ Swing JFrame lässt sich nicht über dispose() abbauen AWT, Swing, JavaFX & SWT 0
P Vorteile von Tooltip nutzen (wird über allen anderen Objekten angezeigt) AWT, Swing, JavaFX & SWT 3
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
B Swing Borderlayout East über North AWT, Swing, JavaFX & SWT 5
D Swing Letzte Zeile einer JTable nicht über RowSorter sotieren AWT, Swing, JavaFX & SWT 2
C Methode über Buttonklick starten AWT, Swing, JavaFX & SWT 8
P Swing Panel-austausch über einen MenuListener AWT, Swing, JavaFX & SWT 2
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
P Swing Button über gesamtes Panel AWT, Swing, JavaFX & SWT 2
3 JDialog über einem Vollbildfenster anzeigen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
A Bild über Imageviewer auf GUI anzeigen AWT, Swing, JavaFX & SWT 3
K 2D-Grafik Kontrastanpassung über einen JSlider AWT, Swing, JavaFX & SWT 2
G JScrollPane über JScrollPane AWT, Swing, JavaFX & SWT 2
L Button über/auf JTextField AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben