# Tic Tac Toe mit ImageIcons



## Rebecca1203 (21. Jun 2017)

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


```
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);
        }
    }
}
```


----------



## Robat (21. Jun 2017)

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 (21. Jun 2017)

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!


----------



## Robat (21. Jun 2017)

Schau dir mal `button.setDisabledIcon(imageIcon);`  an


----------



## Rebecca1203 (21. Jun 2017)

```
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 (21. Jun 2017)

Sollte aber funktionieren, oder?



Rebecca1203 hat gesagt.:


> Habe ich nicht ganz verstanden..


Ein JButton kann an sich 6 verschiedene Icons/Bilder haben.

Hauptimage - das was du mittels `setIcon()` setzt
Ein Bild was benutzt wird, wenn der Button gedrückt wird `setPressedIcon()`
          -,,-                      , wenn mit der Maus über den Button gefahren wird `setRolloverIcon()`
          -,,-                      , wenn der Button selected ist `setSelectedIcon()`
          -,,-                      , wenn der Button disabled ist `setDisabledIcon()`
          -,,-                      , 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.


----------



## Rebecca1203 (21. Jun 2017)

Es funktioniert! Danke.


----------

