Tic Tac Toe mit ImageIcons

Rebecca1203

Mitglied
Hallo an alle,

Da Java ziemlich neu für mich ist, benötige ich Hilfe bei der Umsetzung von Tic Tac Toe mit Smileys in Java. Mein Spielfeld steht und es funktioniert auch alles, jedoch habe ich noch einige Fragen.
Da ich mein Spiel nicht mit X's & O's aufbaue, sondern mit ImageIcons weiß ich zum Beispiel nicht wie ich bei if else Abfragen vorgehen muss. Im Beispiel zum Beispiel zu sehen bei Wer an der Reihe ist, etc. Außerdem bereitet mir der EndDialog aktuell Probleme. Aktuell gebe ich aus X (Devil Smiley) oder O (Sun Smiley) gewonnen hat. Meine Frage: Gibt es da vielleicht auch eine Möglichkeit den passenden Smiley auszugeben oder andere Lösungsvorschläge?

Außerdem würde es mich interessieren, was es für Gründe haben kann, dass meine ImageIcons wenn ein Button gedrückt wird dunkel sind, obwohl Sie normal bunt sind..

Ich bin über Antworten zu diesen Fragen, aber auch über allgemeine Verbesserungsvorschläge sehr dankbar.

Liebe Grüße

Java:
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class Gui implements ActionListener {

    // Variables
    private static int[][] winCombos = new int[][] // Possible win combinations
    { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, // horizontal wins
            { 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 }, // vertical wins
            { 0, 4, 8 }, { 2, 4, 6 } // diagonal wins
    };

    static JButton btn[] = new JButton[9];
    private int count = 0;
    private String player = "";
    private boolean win = false;
    private ImageIcon devil; // devil= spieler X
    private ImageIcon sun; // sun = spieler O

    public Gui() {

        // Create Window
        JFrame jf = new JFrame();

        jf.setSize(400, 400);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setResizable(false);
        jf.setTitle("Tic-Tac-Toe Playfield");
        jf.setLayout(new GridLayout(3, 3));
        devil = new ImageIcon(getClass().getResource("devil.png")); // X
        sun = new ImageIcon(getClass().getResource("sun.png")); // O

        // Add Buttons to the Window
        for (int i = 0; i < btn.length; i++) {
            btn[i] = new JButton();
            btn[i].setVisible(true);
            btn[i].setFocusPainted(false);
            btn[i].addActionListener(this);
            jf.add(btn[i]);
        }
        jf.setVisible(true);
    }

    public void actionPerformed(ActionEvent a) {
        count++;

        // Who's turn is it
        if (count % 2 == 0) {
            player = "O";
      
        } else {
            player = "X";
          
        }

        // Change button to letter
        if (player == "X") {
            JButton pressedButton = (JButton) a.getSource();
            pressedButton.setIcon(devil);
            pressedButton.setEnabled(false);
        } else if (player == "O") {
            JButton pressedButton = (JButton) a.getSource();
            pressedButton.setIcon(sun);
            pressedButton.setEnabled(false);
        }

        // Search for Winner
        for (int i = 0; i <= 7; i++) {
            if (btn[winCombos[i][0]].getIcon() != null
                    && btn[winCombos[i][0]].getIcon().equals(btn[winCombos[i][1]].getIcon())
                    && btn[winCombos[i][1]].getIcon() != null
                    && btn[winCombos[i][1]].getIcon().equals(btn[winCombos[i][2]].getIcon())
               )

            {
                win = true;
            }
        }

        // Dialog at the end of the game
        if (win) {
            JOptionPane.showMessageDialog(null, player + " wins the game");
            System.exit(0);
        } else if (count == 9 && !win) {
            JOptionPane.showMessageDialog(null, "There is no winner.");
            System.exit(0);
        }
    }
}
 
Zuletzt bearbeitet:

Robat

Top Contributor
Ein paar Anregungen:

Du disablest ja die Buttons. Kann gut sein dass dadurch auch die Icons ausgegraut werden

Wegen dem Dialog würde ich dir empfehlen dir deinen eigenen, custom Dialog anzulegen. Einfach mal nach JDialog googeln :)

Strings vergleicht man inhaltlich nicht mit == sondern mit der Methode equals()
 

Rebecca1203

Mitglied
Vielen Dank. Das mit dem disablen der Buttons ist der Grund für die Verfärbung, allerdings weiß ich nicht, was ich stattdessen verwenden kann, damit der Button nicht mehrfach gedrückt werden kann..

Die Methode equals() habe ich übernommen. Danke! :)
 

Rebecca1203

Mitglied
Code:
if (player.equals("X")) {
            JButton pressedButton = (JButton) a.getSource();
            pressedButton.setIcon(devil);
            //pressedButton.setEnabled(false);
            pressedButton.setDisabledIcon(devil);
           
        } else if (player.equals("O")) {
            JButton pressedButton = (JButton) a.getSource();
            pressedButton.setIcon(sun);
            //pressedButton.setEnabled(false);
            pressedButton.setDisabledIcon(sun);
        }

Habe ich nicht ganz verstanden..
 

Robat

Top Contributor
Sollte aber funktionieren, oder?

Habe ich nicht ganz verstanden..
Ein JButton kann an sich 6 verschiedene Icons/Bilder haben.
  1. Hauptimage - das was du mittels setIcon() setzt
  2. Ein Bild was benutzt wird, wenn der Button gedrückt wird setPressedIcon()
  3. -,,- , wenn mit der Maus über den Button gefahren wird setRolloverIcon()
  4. -,,- , wenn der Button selected ist setSelectedIcon()
  5. -,,- , wenn der Button disabled ist setDisabledIcon()
  6. -,,- , wenn mit der Maus über den Button gefahren wird und der Button selected ist setRolloverSelectedIcon()
Hoffe ich hab keins vergessen ;)
Wenn du bspw. das 5. Icon nicht setzt wird aufgrund des 1. Icons automatisch ein Bild mit gray-scale generiert.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben