# Tic-Tac-Toe: Problem



## Verzweifelter (18. Jul 2009)

Hallo zusammen!
Bin mit n paar Schulkameraden des Spiel Tic-Tac-Toe in BlueJ am programmieren und leider gibt's da jetz im Moment ein Problem: Wir bekommens nicht hin, dass nicht bei einem Tastendruck(auf "p1" q,w,e,a,s,d,<,y,x) ein Kreis erscheint und bei Tasten "p2" 1-9 Kreuze.. Im Moment wird bei 1-9 gar nix angezeigt und wenn man anschließend einen der "p1"-Buchstaben drückt, erscheinen auch nur Kreise und zwar auch an den Stellen, wo eig Kreuze "gedrückt" wurden.. Joa.. Vorerst des wichtigste Problem, bitte um eure Hilfe!

```
public class AJBOY {
    public static void main(String[] args) {
        AJBOY big = new AJBOY();
    }
    private Frame window;
    private boolean[][] fields;
    
    public AJBOY(){
        window = new Frame();
        window.add(panel);
        
        fields = new boolean[3][3]; // per default sind alle Elemente des boolean-Arrays false
        
        window.addKeyListener(new KeyAdapter(){
            public void keyReleased(KeyEvent event){
                int number = event.getKeyChar()-'0';
                if(number > 0 && number < 10){
                    fields[(number-1)%3][2-(number-1)/3] = true;
                    panel.repaint();
                }
            }
        });
        window.setBounds(100,100,300,300);
        window.setBackground(new Color(108, 194, 247));
        window.setVisible(true);  
        
        window.addKeyListener(new KeyAdapter(){
            public void keyReleased(KeyEvent event){
                char letter = event.getKeyChar();
                if((letter == 'q'))
                {
                    fields[0][0] = true;
                    
                    panel2.repaint();

                }
                if((letter == 'w'))
                {
                    fields[1][0] = true;
                    panel2.repaint();
                }
                if((letter == 'e'))
                {
                    fields[2][0] = true;
                    panel2.repaint();
                }
                if((letter == 'a'))
                {
                    fields[0][1] = true;
                    panel2.repaint();
                }
                if((letter == 's'))
                {
                    fields[1][1] = true;
                    panel2.repaint();
                }
                if((letter == 'd'))
                {
                    fields[2][1] = true;
                    panel2.repaint();
                }
                if((letter == '<'))
                {
                    fields[0][2] = true;
                    panel2.repaint();
                }
                if((letter == 'y'))
                {
                    fields[1][2] = true;
                    panel2.repaint();
                }
                if((letter == 'x'))
                {
                    fields[2][2] = true;
                    panel2.repaint();
                }
            }
        });
        window.setBounds(100,100,300,300);
        window.setVisible(true);    
        window.setBackground(new Color(108, 194, 247));
    }
    
    JPanel panel = new JPanel() {
        
        public void paintComponent(Graphics g){
            super.paintComponent(g);

            
            final int fieldSize = getSize().width<getSize().height? getSize().width/3 : getSize().height/3;
 
            g.drawLine(fieldSize, 0, fieldSize, fieldSize*3);
            g.drawLine(fieldSize*2, 0, fieldSize*2, fieldSize*3);
 
            g.drawLine(0,fieldSize,fieldSize*3,fieldSize);
            g.drawLine(0,fieldSize*2,fieldSize*3,fieldSize*2);
            
    
            for(int i=0;i<fields.length;++i){
                for(int e=0;e<fields[i].length;++e){
                    if(fields[i][e]){
                      g.drawOval(i*fieldSize,e*fieldSize,fieldSize-1,fieldSize-1);
                    }
                }
            }
            
        }
      
    };
    JPanel panel2 = new JPanel() {
        
        public void paintComponent(Graphics g2){
            super.paintComponent(g2);

            
            final int fieldSize = getSize().width<getSize().height? getSize().width/3 : getSize().height/3;
 
            g2.drawLine(fieldSize, 0, fieldSize, fieldSize*3);
            g2.drawLine(fieldSize*2, 0, fieldSize*2, fieldSize*3);
 
            g2.drawLine(0,fieldSize,fieldSize*3,fieldSize);
            g2.drawLine(0,fieldSize*2,fieldSize*3,fieldSize*2);
            
    
            for(int i=0;i<fields.length;++i){
                for(int e=0;e<fields[i].length;++e){
                    if(fields[i][e]){
                      g2.drawLine(i*fieldSize,e*fieldSize,i*fieldSize+90,e*fieldSize+90);
                      g2.drawLine(i*fieldSize,e*fieldSize+90,i*fieldSize+90,e*fieldSize);
                    }
                }
            }
            
        }
      
    };
    
    
}
```


----------



## Waxe (18. Jul 2009)

Meiner Meinung nach war es ja ein großer Fehler, dass du und deine Freunde, vorallem dein Gruppenleiter das Thema TIC TAC TOE gewählt habt.
Aber Trotzdem möchte ich dir meine altuelle Version zeigen. 
(diese Klasse anstatt AJ und AJGirl einfügen!!
	
	
	
	





```
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.*;
import java.awt.*;
import java.awt.Toolkit;
import javax.swing.JPanel;
import javax.swing.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.plaf.*;


 
public class Spielfeld {
    private boolean maleq = false;
    private boolean malew = false;
    private boolean malee = false;
    private boolean malea = false;
    private boolean males = false;
    private boolean maled = false;
    private boolean male = false;
    private boolean maley = false;
    private boolean malex = false;
    
    private boolean male7 = false;
    private boolean male8 = false;
    private boolean male9 = false;
    private boolean male4 = false;
    private boolean male5 = false;
    private boolean male6 = false;
    private boolean male1 = false;
    private boolean male2 = false;
    private boolean male3 = false;
    static Frame window;
    Button bk;
 
    public static void main(String[] args) {
      }
      
    public Spielfeld(){
        
        window = new Frame();
        window.add(panel);
        window.setBounds(100,100,310, 400);
        window.setVisible(true); 
        window.setLayout(null);
      
        
        window.addKeyListener(new KeyAdapter(){
            public void keyReleased(KeyEvent event){
                char letter = event.getKeyChar();
                if((letter == 'q'))
                {
                    maleq = true;
                    panel.repaint();
                }
                if((letter == 'w'))
                {
                    malew = true;
                    
                    panel.repaint();
                }
                if((letter == 'e'))
                {
                    malee =true;

                    panel.repaint();
                }
                if((letter == 'a'))
                {
                    malea = true;

                    panel.repaint();
                }
                if((letter == 's'))
                {
                    males = true;

                    panel.repaint();
                }
                if((letter == 'd'))
                {
                    maled = true;

                    panel.repaint();
                }
                if((letter == '<'))
                {
                    male = true;
                    panel.repaint();
                }
                if((letter == 'y'))
                {
                    maley= true;
                    panel.repaint();
                }
                if((letter == 'x'))
                {
                    malex = true;
                    panel.repaint();
                }
                
              if((letter == '7'))
                {

                    male7 = true;
                    panel.repaint();

                }
                if((letter == '8'))
                {
                    male8 = true;
                    
                    panel.repaint();
                }
                if((letter == '9'))
                {
                    male9 =true;

                    panel.repaint();
                }
                if((letter == '4'))
                {
                    male4 = true;

                    panel.repaint();
                }
                if((letter == '5'))
                {
                    male5 = true;

                    panel.repaint();
                }
                if((letter == '6'))
                {
                    male6 = true;

                    panel.repaint();
                }
                if((letter == '1'))
                {
                    male1 = true;
                    panel.repaint();
                }
                if((letter == '2'))
                {
                    male2= true;
                    panel.repaint();
                }
                if((letter == '3'))
                {
                    male3 = true;
                    panel.repaint();
                }    
            }
        });
    
        
    }
        
        JPanel panel = new JPanel() {
        
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            
            g.drawLine(100, 0, 100, 300);
            g.drawLine(200, 0, 200, 300);
            g.drawLine(0, 100, 300, 100);
            g.drawLine(0, 200, 300, 200);
            g.drawLine(0, 300, 300, 300);
            if (maleq) g.drawOval(1, 1, 98, 98);
            if (malew) g.drawOval(101, 1, 98, 98);
            if (malee) g.drawOval(201, 1, 98, 98);
            if (malea) g.drawOval(1, 101, 98, 98);
            if (males) g.drawOval(101, 101, 98, 98);
            if (maled) g.drawOval(201, 101, 98, 98);
            if (male)  g.drawOval(1, 201, 98, 98);
            if (maley) g.drawOval(101, 201, 98, 98);
            if (malex) g.drawOval(201, 201, 98, 98);
    
            if (male7) g.drawLine(1, 1, 99, 99);
            if (male7) g.drawLine(99, 1, 1, 99);
            if (male8) g.drawLine(101, 1, 199, 99);
            if (male8) g.drawLine(101, 99, 199, 1);
            if (male9) g.drawLine(201, 1, 299, 99);
            if (male9) g.drawLine(201, 99, 299, 1);
            if (male4) g.drawLine(1, 101, 99, 199);
            if (male4) g.drawLine(99, 101, 1, 199);
            if (male5) g.drawLine(101, 101, 199, 199);
            if (male5) g.drawLine(101, 199, 199, 101);
            if (male6) g.drawLine(201, 101, 299, 199);
            if (male6) g.drawLine(201, 199, 299, 101);
            if (male1) g.drawLine(1, 201, 99, 299);
            if (male1) g.drawLine(99, 201, 1, 299);
            if (male2) g.drawLine(101, 201, 199, 299);
            if (male2) g.drawLine(101, 299, 199, 201);
            if (male3) g.drawLine(201, 201, 299, 299);
            if (male3) g.drawLine(201, 299, 299, 201);
        }
    };
}
```
)


----------



## Schandro (18. Jul 2009)

```
private boolean maleq = false;
    private boolean malew = false;
    private boolean malee = false;
    private boolean malea = false;
    private boolean males = false;
    private boolean maled = false;
    private boolean male = false;
    private boolean maley = false;
    private boolean malex = false;
    
    private boolean male7 = false;
    private boolean male8 = false;
    private boolean male9 = false;
    private boolean male4 = false;
    private boolean male5 = false;
    private boolean male6 = false;
    private boolean male1 = false;
    private boolean male2 = false;
    private boolean male3 = false;
```
Mach doch lieber 2 Arrays statt 18 einzelne Variablen. Damit kannst du dir *extrem* viel Code sparen (vorallem in der paintComponent und der keyReleased-Methode) und er wird übersichtlicher, dynamischer und kann einfacher erweitert werden 

warum ist eigentlich window static?


----------



## Waxe (18. Jul 2009)

ehrlich gesagt: keine Ahnung
was bewirkt denn static?


----------



## Verzweifelter (18. Jul 2009)

des heißt doch, dass des fenster ne feste position hat oder?


----------



## SebiB90 (18. Jul 2009)

Verzweifelter hat gesagt.:


> des heißt doch, dass des fenster ne feste position hat oder?


:lol: :lol: :lol: :lol: :lol: ich kann nicht mehr :lol: *aufBodenLieg*

sorry, aber du liegst total daneben. Das static bedeutet, dass die variable statisch ist. Eine statische Variable ist an Klassen gebunden. Also es gibt pro Klasse nur einmal diese Variable, im gegensatz zu den instanz variablen male1 usw die pro Instanz einmal da sind. Und daraus folgt auch, dass man auf statische Variablen ohne instanz der klasse zugreifen kann.


----------



## Verzweifelter (18. Jul 2009)

tja.. des passiert, wenn man sich nicht mit gewissen grundlegenden dingen beschäftigt.. 
kannst du mir vielleicht auch sagen, wie wir des hinbekommen, dass man nicht kreuz und kreis in ein feld "schreiben" kann? also praktisch, wenn ein zeichen steht, das nicht überschrieben werden kann..?
danke schonmal


----------



## SebiB90 (18. Jul 2009)

also, bau es erstmal um auf array. am besten du nimmst ein 2d int array das 3 x 3 groß ist. Am Anfang sind alle Felder 0 und 0 soll dann freies feld bedeuten. Wenn da nen Kreis drin ist speicherst du einfach eine 1 drin und wenn es ein Kreuz ist eine 2. Und du setzt nur 1 oder 2 wenn das Feld auf 0 steht.


----------

