Konstruktor für "Vier Gewinnt"

francisca93

Mitglied
Hallo,

ich soll ein "Vier gewinnt"-Spiel in der Größe 8x8 programmieren. Die grundlegende Graphik für das Spielfeld hab ich schon hinbekommen (64 Kästchen mit drawRect in verschachtelter for-Schleife angelegt, darüber 8 Buttons); jetzt muss ich irgendwie die Funktionalität reinbekommen.
Mein Ansatz ist: Jedes Spielfeld ist eine Instanz der Klasse "Feld", Attribute sind die beiden Koordinaten und ein int "Zustand" (0=leer, 1=weiß, 2=schwarz). Nun überlege ich, wie ich den Konstruktor so hinbekomme, dass er am Anfang des Spiels ein Array von den 64 Feldern anlegt, jedes Feld mit den Koordinaten und Zustand auf 0. Bisher hab ich folgendes:
Code:
package praktikum_4;

public class Feld {
    int x,y;
    int zustand;
   
    public Feld(){
        Feld f[][] = new Feld[8][8];
        for(int i=1; i<9; i++)
            for (int j=1; j<9; j++){
                f[j][i].x=j ;f[j][i].y=i; f[j][i].zustand=0;            
            }
       }
}
Beschwert hat er sich nicht, aber ich hab keine Ahnung ob das dann so Sinn macht. Kann der Konstruktor sofort ein Array konstruieren? Oder soll ich ihn nur für ein einzelnes Feld machen, dem i und j als Parameter übergeben werden, und dann mit einer for-Schleife aufrufen und so die 64 Felder bilden?

Danke schonmal für die Hilfe
 

Robat

Top Contributor
Warum sollte denn die Klasse Feld, welche wenn ich dich richtig verstanden habe ein einzigen Spielstein darstellen soll [Name mMn ungünstig gewählt], auch das gesamte Spielfeld beinhalten?

Gruß Robert
 

francisca93

Mitglied
Naja, mit "Feld" meine ich so eine Stelle im Spielbrett, wo ein Spielstein liegen kann oder eben auch keiner. Und von diesen Feldern soll dann ein 8x8 - Array angelegt werden.

Jetzt hab ich den Konstruktor erstmal für ein einzelnes Feld geschrieben:
Code:
public class Feld {
    int x,y;
    int zustand;
   
    public Feld(int i, int j){
        x = j;
        y = i;
        zustand = 0;            
    }
}

Und in der init-Methode soll er dann das Array bilden und auffüllen:
Code:
Feld f[][] = new Feld[8][8];
        for(int i=1; i<9; i++)
            for (int j=1; j<9; j++) {
                f[i][j] = new Feld(i,j);
                }
Ich würde halt nur gern wissen, ob das im Prinzip so funktionieren könnte, bevor ich weitermache, oder ob da ein grober Denkfehler drin ist (testen kann ich ja jetzt noch nichts).
 

X5-599

Top Contributor
Ich denke schon, dass man das so machen könnte. Allerdings würde ich das Array mit den Feld-Objekten in einer eigenen Klasse packen. Diese könnte z.B. "SpielBrett" heissen. Nebenbei: die for-Schleifen sollten von 0 bis < 8 gehen. Die erste Position eines Arrays ist immer mit "0" anzusprechen.
 

francisca93

Mitglied
O.k., ich versuch es dann mal so. Leider gibt es ein neues Problem: Ich will die Buttons mit einem actionListener ausrüsten, damit bei einem "Einwurf" eines Spielsteins die Reihe von unten nach oben aufgefüllt wird. Versuchsweise hab ich das für die linkeste Reihe so gemacht:
Code:
btn1 = new JButton("1");
        btn1.setBounds(18, 12, 40, 26);
        contentPane.add(btn1);
        btn1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {            
                 for(int i=8; i>0; i--){
                    if (f[i][1].zustand==0){
                        public void paint(Graphics g) {
                            super.paint(g);
                            g.fillOval(21+(1-1)*50, 81+(i-1)*50, 48, 48);
                        }
                    }               
                }
            }
        });
Er beschwert sich aber in der Zeile public void paint(Graphics g) { mit folgender Meldung:
- Syntax error on token "(", ; expected
- Syntax error on token ")", ; expected
Versteh ich nicht, weiter oben hab ich es genauso gemacht (mit "drawRect"), und da läuft es. Oder will er im actionListener keine Grafik haben?
 

VfL_Freak

Top Contributor
Moin,

außerdem:
Java:
g.fillOval(21+(1-1)*50, 81+(i-1)*50, 48, 48);
Was soll '1-1' ergeben ???

VG Klaus
 

francisca93

Mitglied
Aber wenn ich public void paint(Graphics g) und super.paint(g) weglasse, beschwert er sich mit "g cannot be resolved".

Dabei hab ich weiter oben (direkt in der Klassendefinition) schon mit paint das Spielfeld konstruiert, und da funktioniert es:
Code:
public void paint(Graphics g) {
        super.paint(g);
        g.drawRect(20,80,400,400);
       
        for(int i=1; i<9; i++)
            for (int j=1; j<9; j++){
                g.drawRect(21+(j-1)*50, 81+(i-1)*50, 48, 48);
            }
     }
Wie muss man das den machen, wenn man im actionListener etwas zeichnen lassen will?
 

Robat

Top Contributor
Das was du da oben gemacht hast wird nicht funktionieren. Die paint(Graphics g) Methode gehört zu der JComponent Klasse und nicht zum ActionListener. Daher meckert er auch rum eben weil er keine Methode finden kann die so im ActionListener definiert ist.

Du gehst auch schon mit dem falschen Grundgedanken an die Sache heran. Du solltest nicht im ActionListener zeichnen. Gezeichnet wird nur in der paint Methode. (wobei ich dir empfehlen würde lieber die paintComponent(Graphics g) Methode zu überschreiben.. Wenn man sich den JavaDoc durchliest sieht man auch warum:
"This is invoked during a printing operation. This is implemented to invoke paintComponent on the component. Override this if you wish to add special painting behavior when printing.").

Im ActionListener sollte nur der State des gezeichneten verändert werden. Nehmen wir also folgendes Minimalbeispiel:
Java:
/**
 * Du hast eine Klasse welche dein JPanel repräsentiert auf dem du zeichnen möchtest.
 * Dort überschreibst du die paintComponent(Graphics g) Methode wo du alles zeichnen lässt, was du zeichnen willst.
 * Außerdem enthält die Klasse die Parameter die bestimmen was gezeichnet werden soll, wie gezeichnet werden soll, eventuell 
 * welche Farbe etc etc etc.
 * Außerdem enthält sie die passenden Methoden um das gezeichnete anzupassen wie in diesem Fall die Länge der Linie.
 * Jedesmal wenn du was angepasst hast (also die Linie verlängert wurde) muss das Panel via repaint() neugezeichnet werden.
 */
public class MyDrawyPanel extends JPanel
{
    private int lineLength;

    public MyDrawyPanel(int lineLength)
    {
        this.lineLength = lineLength;
    }

    public void incrementLineLength(int lineLength)
    {
        // Linienlänge anpassen und das Bild neuzeichnen.
        this.lineLength += lineLength;
        repaint();
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
     
        // Farbe setzen und die Linie zeichnen
        g.setColor(Color.RED);
        g.drawLine(5, 5+lineLength, 5, 5);
    }
   
   /**
    * In der main Methode wird dann einfach nur ein Test-Frame angelegt mit einem Button der die Linienlänge ändern soll.
    * Im ActionListener des Buttons wird dann die incrementLineLength(int) Methode des MyDrawyPanel aufgerufen und
    * somit auf Knopfdruck die Länge verändert.
    */
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       
        JPanel contentPane = new JPanel(new BorderLayout());
       
        MyDrawyPanel drawContent = new MyDrawyPanel(30);
        drawContent.setBackground(Color.WHITE);
       
        JButton btnChangeLine = new JButton("Länge Ändern");
        btnChangeLine.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                drawContent.incrementLineLength(20);
            }
        });
       
        contentPane.add(drawContent, BorderLayout.CENTER);
        contentPane.add(btnChangeLine, BorderLayout.SOUTH);
        frame.add(contentPane);
        frame.setVisible(true);
    }


}

Das ganze ist wie gesagt nur ein Minimalbeispiel. Mit dem Prinzip solltest du dein Vorhaben aber ganz gut umsetzen können :)
Du könntest so bspw. dein Spielfeld zeichnen lassen und eine Methode anlegen mit der du ein überarbeitetes Spielfeld übergeben kannst.

Gruß Robert
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
H JavaFX aus der .fxml Datei einen Konstruktor bedienen AWT, Swing, JavaFX & SWT 3
S Swing Konstruktor wird nicht rechtzeitig fertig? AWT, Swing, JavaFX & SWT 4
A JTable in Konstruktor? AWT, Swing, JavaFX & SWT 2
K Swing Gegner Konstruktor Problem AWT, Swing, JavaFX & SWT 2
MiMa Grafikfenster mit Konstruktor AWT, Swing, JavaFX & SWT 5
M Swing JButton-Konstruktor Icon-Parameter (Verständnisfrage) AWT, Swing, JavaFX & SWT 7
S Konstruktor kürzen AWT, Swing, JavaFX & SWT 4
S SWT Konstruktor anonyme Klasse AWT, Swing, JavaFX & SWT 10
C Kann Konstruktor von eigenem TableModel nicht nutzen AWT, Swing, JavaFX & SWT 2
J Konstruktor soll was zurueckgeben AWT, Swing, JavaFX & SWT 3
K falscher konstruktor? AWT, Swing, JavaFX & SWT 2
D Konstruktor von TableLayout AWT, Swing, JavaFX & SWT 8
F Fenster über Konstruktor neu laden? AWT, Swing, JavaFX & SWT 11
M JComboBox Konstruktor mit Objektfeld AWT, Swing, JavaFX & SWT 2
J JDialog und dessen Konstruktor JDialog(JFrame owner) AWT, Swing, JavaFX & SWT 2
G JTable mit Vektor-Konstruktor erzeugen?! AWT, Swing, JavaFX & SWT 3
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
R Swing Welche LayoutManager sind die richtigen für mich? AWT, Swing, JavaFX & SWT 11
L Event Handling Gui für Taschenrechner AWT, Swing, JavaFX & SWT 27
C Slider für Zeitauswahl AWT, Swing, JavaFX & SWT 3
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
OnDemand Gui Themes für FX AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P JavaFX Kalender mit Kacheln für Ereignisse AWT, Swing, JavaFX & SWT 4
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
J Swing Neuen Command für "show"? AWT, Swing, JavaFX & SWT 2
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
H Swing JFileChooser für nicht existierendes Unterverzeichnis AWT, Swing, JavaFX & SWT 3
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
D GUI-Bau für ein Auswertungs-Tool AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
RalleYTN Swing Menü für Texteditor (Rechtsklick) AWT, Swing, JavaFX & SWT 4
H Applet Flappy Bird für Noobs AWT, Swing, JavaFX & SWT 4
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben