# TicTacToe



## ESEL3000 (23. Mrz 2009)

Hallo,

ich bin in der 13 und mache gerad mein abi.. dummerweise hab ich info noch als grundkurs und überhaupt keinen plan davon (absolut garnichts).
Ich muss ein TicTacToe spiel als applet programmieren und in einer woche abgeben, danach werd ich dieses fach nie wieder in meinem leben brauchen und wiedersehen.

Wenn ichs nicht hab, gibts ein defiziet...

Ich weiß nicht ob das vieleicht zu viel verlangt ist aber ich brauch das hier komplett programmiert:

Projekt TicTacToe

Anforderungen:
- als Applet
- mit MouseListener Kreis oder Kreuz in Spielfeld setzen
- beginnend mit Kreuz
- Rechner setzt automatisch das richtige Zeichen
- Rechner überprüft nach jedem Zug, ob ein Gewinner vorliegt
- es wird geprüft, ob ein Feld schon gesetzt ist
- es wird geprüft, ob das Spielfeld voll ist
- Wiederholung wird angeboten
- Kommentare im Quelltext


----------



## Schandro (23. Mrz 2009)

Das es jemand extra für dich Programmiert ist unwahrscheinlich, aber hier haben mit Sicherheit viele das schon irgendwann mal programmiert und müssten nurnoch wenig am Code ändern, könnt also schon sein das dir jemand hilft.

Nur der Vollständigkeit halber, damit du eventuell von jemanden ne bessere Lösung bekommst:
- Brauch der Computergegner ne KI oder kann der einfach per Zufall irgendwo hinsetzen?
- Einfache Kommentare oder Javadoc Kommentare?

Ist übrigens immer wieder erstaunlich wie wenig man nach 3 Jahren Informatik in der Schule können muss...


----------



## Marco13 (23. Mrz 2009)

ESEL3000 hat gesagt.:


> Wenn ichs nicht hab, gibts ein *defiziet...*


Das hast du schon :lol:


----------



## 0x7F800000 (23. Mrz 2009)

Schandro hat gesagt.:


> Das es jemand extra für dich Programmiert ist unwahrscheinlich, aber hier haben mit Sicherheit viele das schon irgendwann mal programmiert und müssten nurnoch wenig am Code ändern, könnt also schon sein das dir jemand hilft.


Die wahrscheinlichkeit kannst du dir in etwa mit der formel
*p(kohle) = 1-exp(-alpha/kohle)*
ausrechnen . 
(Für mich persönlich beträgt das alpha grob geschätzt 13.8629€, da ich die Lösung hier inkl. unbesiegbare KI schon rumliegen hab^^)

Als Hilfe zählt es nicht, da keine Eigeninitiative vorhanden ist, so eine geschenkte Lösung würde eher schaden: dann stehst du doch am ende da, hast 0 Schimmer von nix, und zu dir kommt dann dein Lehrer, und fragt dich, woher du die Sache mit den Strategy-Patterns gelernt hast, woher du soviel Plan von Backtracking hast, wie genau man in Java2D Antialiasing einschalten kann, und wieso dein dispatch thread nirgends irgendwelche exceptions verursacht. Was sagst du dann? *öhm... hab's irgendwie vergessen?*... :noe:


----------



## Schandro (23. Mrz 2009)

Ich würd ihm trotzdem eine (einfach gehaltenere) Lösung geben. Innerhalb 1 Woche schafft er es eh nicht sich das noch beizubringen.
Ich bin grad in derselben Situation in der Schule, nur halt mit Latein (beschistenste Fach ever). Deswegen kann ich ihn seeehr gut nachvollziehen.^^


----------



## 0x7F800000 (23. Mrz 2009)

Ja, kann das prinzipiell auch gut nachvollziehen. Hab solchen Krempel wie Ethik und Geschichte gehasst wie die Pest (und verfluche das immer noch jeden Tag)... Was soll's... Hab's drei jahre lang einfach ignoriert, wenn's kritisch wurde einfach irgendein buntes Referat vorgetragen, und fertig^^ Das war ecklig, ich hab da auch nichts gemacht, aber ich habe mich auch nicht beschwert, als ich dafür meine 4'er und 5'er kassieren musste. Wieso soll ich das jemand anders ersparen? Ich hab mir dieses System nicht ausgedacht.:bahnhof: Mir haben die Schweine auch Drecksfächer wie Deutsch in den (Mathe-Physik-Info-Chemie-Biologie)-Tupel untergemischt, als ob ich mich deswegen nicht aufgeregt hätte


----------



## andre111 (23. Mrz 2009)

Ich hätt da auch noch n TicTacToe, aber einfach so - ohne dass er wenigstens versucht das zu schaffen - sehe ich keinen Grund das zu schicken. Geht mit in der Schule auch nicht anders (siehe Deutsch und Religion^^)


----------



## ESEL3000 (23. Mrz 2009)

Schandro hat gesagt.:


> Nur der Vollständigkeit halber, damit du eventuell von jemanden ne bessere Lösung bekommst:
> - Brauch der Computergegner ne KI oder kann der einfach per Zufall irgendwo hinsetzen?
> - Einfache Kommentare oder Javadoc Kommentare?



Erstmal danke für eurer Verständniss gut zu wissen, dass ich nicht der einzige in so ner situation bin..
ne KI braucht das ding nicht, mein lehrer würde mir nicht in 1000jahren glauben, dass ich das allein gemacht hätte..
Einfache kommentare sollen es sein.

Wie gesagt, das ist die letzte abgabe in info, danach ist gott sei dank für immer vorbei damit..


----------



## Ark (23. Mrz 2009)

Wer sich nicht für Mathe begeistern kann, sollte Informatik gar nicht erst versuchen. (Und mit Mathe meine ich nicht Rechnen wie bis zur 10. Klasse, sondern Mathematik ab der Oberstufe, und Informatik ist mehr als nur Text mit Word formatieren zu können.) Kann es sein, dass hier aber ein solcher Fall vorliegt?

Nichts für ungut, ich kenne da einige, die sich mit so was sehr schwer tun. Es ist halt nicht jedermanns Fach, deshalb hoffe ich, dass du da glücklich wieder rauskommst. 

Ark


----------



## 0x7F800000 (23. Mrz 2009)

Ark hat gesagt.:


> Wer sich nicht für Mathe begeistern kann, sollte Informatik gar nicht erst versuchen.


Öhm, Ark? Du hast hier irgendwas falsch gelesen: der mensch will kein Info studieren, der braucht nur noch ein kleines projektchen, und ist dann froh, dass er sich das nie weider antun muss.


----------



## Schandro (23. Mrz 2009)

So, hab ein älteren Code von mir herausgekramt und ihn schnell angepasst. Er ist sehr dreckig und einfach gehalten, deswegen wird
dir dein Lehrer glauben das du ihn selber geschrieben hast 

Einzig die Rechtschreibung könntest du versuchen zu verbessern...

Um ihn rauszukopieren solltest du auf "Zitieren" klicken, da kannst du ihn besser rauskopieren, ist ein bug hier im Forum. Zum formatieren einfach in Eclipse einfügen und auf "clean Up" drücken...
[highlight=Java]import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

/**
*    Einfaches Tic Tac Toe Spiel
*    Der Spieler fängt immer an. Seine Felder werden mit einem Kreuz markiert
*    Der Computer setzt einfach per Zufall auf irgendein Feld
*/

public class TicTacToe extends JApplet{

    private Feld[][] felder = new Feld[3][3];
    private JPanel panel;

    public void init(){

        panel = new JPanel();
// durch den Layoutmanager werden die Felder im Format 3x3 angeordnet, außerdem sind jeweils 2 Pixel Abstand zwischen ihnen 
        panel.setLayout(new GridLayout(3,3,2,2));
        this.add(panel);

        // initialisiert die Felder
        for(int i=0;i<felder.length;++i){
            for(int e=0;e<felder_.length;++e){
                // ist final, damit es auch in dem Object der anonymen ActionListener Klasse benutzt werden kann
                final Feld actualFeld = new Feld();
                felder[e] = actualFeld;
                panel.add(actualFeld);
                felder[e].addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        if(actualFeld.getStatus() == Feld.LEER){
                            actualFeld.setStatus(Feld.KREUZ);
                            nächsteRunde();
                        }
                        else{
                            // macht nichts, Benutzer hat auf ein bereits benutzes Feld geklickt
                        }
                    }
                });
            }
        }
    }

 // Kontrolliert, ob der Spieler gewonnen hat. Wenn nicht, guckt er ob das Spiel zuende ist weil das Spielfeld voll ist. Wenn das auch nicht zutrifft, lässt er den Computer setzen und kontrolliert, ob dieser Gewonnen hat.
    private void nächsteRunde(){
        if(!kreuzGewonnen()){
            if(!spielfeldVoll()){
                lassComputerSetzen();
                kreisGewonnen();
            }
            else{
                frageBenutzerNachWiederholung("Keiner hat gewonnen. Wollen Sie es nochmal versuchen?");
            }
        }
    }

    private void lassComputerSetzen(){
        // Endlosschleife, bis ein zufällig unbesetztes Feld gefunden wurde
        while(true){
            Feld feld = getRandomFeld();
            if(feld.getStatus() == Feld.LEER){
                feld.setStatus(Feld.KREIS);
                return;
                // bricht die Methode und damit die Endlosschleife ab
            }
        }
    }

    private Feld getRandomFeld(){
        return felder[(int)(Math.random()*3)][(int)(Math.random()*3)];
    }

    private boolean kreuzGewonnen(){

        // kontrolliert, ob irgendwo 3 Kreuze horizontal, vertical oder diagonal gesetzt sind
        boolean kreuzGewonnen = false;


        // vertical
 if (felder[0][0].getStatus() == Feld.KREUZ && felder[1][0].getStatus() == Feld.KREUZ && felder[2][0].getStatus() == Feld.KREUZ){
            kreuzGewonnen = true;}
else if(felder[0][1].getStatus() == Feld.KREUZ && felder[1][1].getStatus() == Feld.KREUZ && felder[2][1].getStatus() == Feld.KREUZ){
            kreuzGewonnen = true;}
else if(felder[0][2].getStatus() == Feld.KREUZ && felder[1][2].getStatus() == Feld.KREUZ && felder[2][2].getStatus() == Feld.KREUZ){
            kreuzGewonnen = true;}

        // horizontal
 else if(felder[0][0].getStatus() == Feld.KREUZ && felder[0][1].getStatus() == Feld.KREUZ && felder[0][2].getStatus() == Feld.KREUZ){
            kreuzGewonnen = true;}
else if(felder[1][0].getStatus() == Feld.KREUZ && felder[1][1].getStatus() == Feld.KREUZ && felder[1][2].getStatus() == Feld.KREUZ){
            kreuzGewonnen = true;}
else if(felder[2][0].getStatus() == Feld.KREUZ && felder[2][1].getStatus() == Feld.KREUZ && felder[2][2].getStatus() == Feld.KREUZ){
            kreuzGewonnen = true;}

        // diagonal
 else if(felder[0][0].getStatus() == Feld.KREUZ && felder[1][1].getStatus() == Feld.KREUZ && felder[2][2].getStatus() == Feld.KREUZ){
            kreuzGewonnen = true;}
else if(felder[2][0].getStatus() == Feld.KREUZ && felder[1][1].getStatus() == Feld.KREUZ && felder[0][2].getStatus() == Feld.KREUZ){
            kreuzGewonnen = true;}



        if(kreuzGewonnen){
            frageBenutzerNachWiederholung("Sie haben gewonnen. Noch eine Runde?");
            return true; // hat gewonnen
        }

        return false; // hat nicht gewonnen
    }


    private boolean kreisGewonnen(){

        // kontrolliert, ob irgendwo 3 Kreise horizontal, vertical oder diagonal gesetzt sind
        boolean kreisGewonnen = false;


        // vertical
 if (felder[0][0].getStatus() == Feld.KREIS && felder[1][0].getStatus() == Feld.KREIS && felder[2][0].getStatus() == Feld.KREIS){
            kreisGewonnen = true;}
else if(felder[0][1].getStatus() == Feld.KREIS && felder[1][1].getStatus() == Feld.KREIS && felder[2][1].getStatus() == Feld.KREIS){
            kreisGewonnen = true;}
else if(felder[0][2].getStatus() == Feld.KREIS && felder[1][2].getStatus() == Feld.KREIS && felder[2][2].getStatus() == Feld.KREIS){
            kreisGewonnen = true;}

        // horizontal
 else if(felder[0][0].getStatus() == Feld.KREIS && felder[0][1].getStatus() == Feld.KREIS && felder[0][2].getStatus() == Feld.KREIS){
            kreisGewonnen = true;}
else if(felder[1][0].getStatus() == Feld.KREIS && felder[1][1].getStatus() == Feld.KREIS && felder[1][2].getStatus() == Feld.KREIS){
            kreisGewonnen = true;}
else if(felder[2][0].getStatus() == Feld.KREIS && felder[2][1].getStatus() == Feld.KREIS && felder[2][2].getStatus() == Feld.KREIS){
            kreisGewonnen = true;}

        // diagonal
 else if(felder[0][0].getStatus() == Feld.KREIS && felder[1][1].getStatus() == Feld.KREIS && felder[2][2].getStatus() == Feld.KREIS){
            kreisGewonnen = true;}
else if(felder[2][0].getStatus() == Feld.KREIS && felder[1][1].getStatus() == Feld.KREIS && felder[0][2].getStatus() == Feld.KREIS){
            kreisGewonnen = true;}



        if(kreisGewonnen){
            frageBenutzerNachWiederholung("Sie haben verloren. Noch eine Runde?");
            return true; // hat gewonnen
        }

        return false; // hat nicht gewonnen
    }


    private boolean spielfeldVoll(){
        boolean voll = true;

        for(int i=0;i<felder.length;++i){
            for(int e=0;e<felder.length;++e){
                if(felder[e].getStatus() == Feld.LEER){
                    return false;
                    // Methode wird durch das return abgebrochen
                }
            }
        }
        return true;
    }

    private void frageBenutzerNachWiederholung(String text){
        int result = JOptionPane.showConfirmDialog(null,text,"Neustart?",JOptionPane.YES_NO_OPTION);
        if(result == JOptionPane.YES_OPTION){
            // setzt alle 9 Felder auf Feld.LEER
            for(int i=0;i<felder.length;++i){
                for(int e=0;e<felder.length;++e){
                    felder[e].setStatus(Feld.LEER);
                }
            }
        }
        else{
            this.remove(panel);
            this.repaint();
            // zeigt das panel, auf dem sich das Speilfeld befindet, nicht mehr an
        }
    }

}

class Feld extends JButton{
    public final static int LEER = 0;
    public final static int KREIS = 1;
    public final static int KREUZ = 2;

    public static ImageIcon iconLeer;
    public static ImageIcon iconKreis;
    public static ImageIcon iconKreuz;

    // lädt beim starten des Programmes die Bilder
    static{
        try{iconLeer = new ImageIcon(ImageIO.read(new File("feldLeer.JPG")));}catch(IOException e){e.printStackTrace();}
        try{iconKreis = new ImageIcon(ImageIO.read(new File("feldKreis.JPG")));}catch(IOException e){e.printStackTrace();}
        try{iconKreuz = new ImageIcon(ImageIO.read(new File("feldKreuz.JPG")));}catch(IOException e){e.printStackTrace();}
    }

    private int status;

    public Feld(){
        setStatus(LEER);
    }

    // setter, ändert auch das Aussehen des Buttons
    public void setStatus(int status){
        this.status = status;

        switch(status){
            case LEER:
                this.setIcon(iconLeer);
                break;
            case KREIS:
                this.setIcon(iconKreis);
                break;
            case KREUZ:
                this.setIcon(iconKreuz);
                break;
            default: throw new IllegalArgumentException("Falscher status");
        }
    }

    // getter
    public int getStatus(){
        return this.status;}
}[/highlight]_


----------



## Ark (23. Mrz 2009)

0x7F800000 hat gesagt.:


> Öhm, Ark? Du hast hier irgendwas falsch gelesen: der mensch will kein Info studieren, der braucht nur noch ein kleines projektchen, und ist dann froh, dass er sich das nie weider antun muss.


Ich habe schon richtig gelesen.  Aber auf meinem Gymnasium konnte man _wählen,_ ob man Info ab der 11. Klasse macht oder nicht. Und tatsächlich wurde ich da mit Dingen wie Reihenentwicklungen, Zellularautomaten, relationalen Datenbanken oder Turingmaschinen beglückt - sehr zum Leidwesen anderer, die sich gerade mit der 13. Klasse wünschten, sie hätten dieses Fach niemals gewählt gehabt.

Aber dass Informatik auf einem allgemeinbildenden Gymnasium Pflicht wäre, wäre mir neu.

Ark


----------



## 0x7F800000 (23. Mrz 2009)

Ark hat gesagt.:


> Aber auf meinem Gymnasium konnte man _wählen,_ ob man Info ab der 11. Klasse macht oder nicht.


Jaja, "wählen", ist klar...Bei mir hockten in Informatik auch leute, die es "freiwillig" gewählt haben, und zwar weil sie physik und bio mehr hassten^^  :bloed:Genau dasselbe in Chemie, und in Bio auch... Gelernt haben die da nichts (wie ich in Geschichte), sondern gingen denjenigen, die wirklich was lernen wollten, nur auf den Sack (wie ich in Geschichte^^). Ein Haufen praktisch erwachsener Leute, die nichts miteinander zu tun haben wollen, werden in eine Gruppe gequetscht und gehen sich dort 3 Jahre lang gegenseitig auf die Nerven. Tolles System, chapeau... :autsch:

[ich glaub ich sollte langsam das abonemment dieses themas löschen, sonst gehe ich gleich zum offenen rumtrollen über ]


----------



## ESEL3000 (23. Mrz 2009)

Riesen Dank an Schandro! Du rettest mir den arsch

Ich nehme mal an die feldLeer.JPG, feldKreuz.JPG und feldKreis.JPG bilder muss ich in den projekt ordner einfügen?
Ginge das auch mit g.drawOval, g.grawLine? Also das Feld und die kreuze und kreise damit zu malen würde ich sogar auch noch hinkriegen^^ Nur wo ich das einfügen müsste bleibt mir ein Rätsel:bahnhof:


----------



## ESEL3000 (23. Mrz 2009)

0x7F800000 hat gesagt.:


> Jaja, "wählen", ist klar...Bei mir hockten in Informatik auch leute, die es "freiwillig" gewählt haben, und zwar weil sie physik und bio mehr hassten^^  :bloed:Genau dasselbe in Chemie, und in Bio auch... Gelernt haben die da nichts (wie ich in Geschichte), sondern gingen denjenigen, die wirklich was lernen wollten, nur auf den Sack (wie ich in Geschichte^^). Ein Haufen praktisch erwachsener Leute, die nichts miteinander zu tun haben wollen, werden in eine Gruppe gequetscht und gehen sich dort 3 Jahre lang gegenseitig auf die Nerven. Tolles System, chapeau... :autsch:
> 
> [ich glaub ich sollte langsam das abonemment dieses themas löschen, sonst gehe ich gleich zum offenen rumtrollen über ]



Du sprichst mir aus der Seele:toll:


----------



## Schandro (23. Mrz 2009)

Du müsstest dir innerhalb des Programmes eigene Bilder malen. Müsste so gehen: (habs nicht compilt)

        [highlight=Java]BufferedImage img = new BufferedImage(/*breite*/ 50, /*höhe*/ 50, BufferedImage.TYPE_INT_RGB);
        Graphics g = img.createGraphics();

        g.drawLine(2,8,34,36);
        g.fillRect(2,2,6,6);
        // usw...

        iconKreuz = new ImageIcon(img);[/highlight]

wenn du das dreimal hintereinander schreiben willst, musst du ab dem 2. mal statt 
BufferedImage img = ...
folgendes schreiben:
img = ...

und dassselbe bei Graphics, beim 1. mal:
Graphics g = ...
danach immer:
g = ...


----------



## Spacerat (24. Mrz 2009)

Schandro hat gesagt.:
			
		

> Das es jemand extra für dich Programmiert ist unwahrscheinlich.


Naja... hat doch schon jemand... "%JDK_HOME%/demo/applets/TicTacToe"... Solange ich das JDK kenne ist es dabei...
@ESEL3000: Hoffe du kommst jetzt nicht auf dumme Gedanken.


----------



## Schandro (24. Mrz 2009)

Erstens hat er ja schon ne Lösung, zweitens wär der Lehrer von ihm wahrscheinlich auch net soo blöd und 3. Ist der Code von Sun irgendwie ein bisschen... komisch.


----------



## ESEL3000 (24. Mrz 2009)

ich bekomm bei

```
BufferedImage img = new BufferedImage(/*breite*/ 50, /*höhe*/ 50, BufferedImage.TYPE_INT_RGB);
```

beim compilen den fehler:

cannot find symbol -class BufferedImage


----------



## Schandro (24. Mrz 2009)

dann schreib oben zu den anderen imports:
*[SIZE=-1]import java.awt.image.*;[/SIZE] *


----------



## ESEL3000 (24. Mrz 2009)

ok danke, und jetzt noch eine frage:


```
try{iconKreis = new ImageIcon(ImageIO.read(new File("feldKreis.JPG")));}catch(IOException e){e.printStackTrace();}
```

was muss ich dann hier ändern?


----------



## Schandro (24. Mrz 2009)

wenn du dir dein bild selbst malst mit den Code den ich gestern (glaub ich) gepostet hab, dann brauchst du diese Zeile nicht mehr (bzw. alle 3 Zeilen, die kommen ja 3 mal in ähnlicher Fassung direkt nacheinander vor)


----------



## Lexi (24. Mrz 2009)

Ark hat gesagt.:


> Ich habe schon richtig gelesen.  Aber auf meinem Gymnasium konnte man _wählen,_ ob man Info ab der 11. Klasse macht oder nicht. Und tatsächlich wurde ich da mit Dingen wie Reihenentwicklungen, Zellularautomaten, relationalen Datenbanken oder Turingmaschinen beglückt - sehr zum Leidwesen anderer, die sich gerade mit der 13. Klasse wünschten, sie hätten dieses Fach niemals gewählt gehabt.
> Ark



Ich habe Informatik auch seit der 11, jetzt ca ein 3/4 Jahr. Mittlerweile fange ich an meinen Lehrer zu verbessen -.-'


```
//Versuch des besagten Lehrers ein 2dimensionales Array zu initialisieren:

int[] zeile = new int[10];
zeile[] reihe = new zeile[10]; // nein es gab keine Klasse "zeile"
```


----------



## 0x7F800000 (24. Mrz 2009)

Lexi hat gesagt.:


> ```
> //Versuch des besagten Lehrers ein 2dimensionales Array zu initialisieren:
> 
> int[] zeile = new int[10];
> ...


Brutaaal! 
	

	
	
		
		

		
			



http://www.smileygarden.de/smilie/Crazy/69.gif


----------



## Lexi (24. Mrz 2009)

0x7F800000 hat gesagt.:


> Brutaaal!
> 
> 
> 
> ...



Danach kam eine Aussage, er wolle mit uns jetzt weiter objektorientiert arbeiten.
Wir wollen Minesweeper Programmieren und das Spielfeld anlegen indem wir ein 2d Array implementieren und dieses dann mit int Zahlen füllen. 
0 - Feld hat keine Bombe
1 - Feld wurde betreten
2 - Feld hat eine Bombe

Ich dachte mit einem

```
private Feld[] spielFeld;
```
wäre das vllt etwas eleganter und OO-näher gelöst, er war wohl anderer Meinung...


----------



## Ark (24. Mrz 2009)

Vielleicht sollte das besser in einen eigenen Thread à la "Unfähige Lehrer" oder so. ^^

Ark


----------



## hdi (24. Mrz 2009)

> er war wohl anderer Meinung...


Er hat finde ich auch Recht.
Das mit dem 2d-array ist auf jeden Fall typisch, gut und intuitiv für so ein Spiel.
Das mit den integern als Zustand.. in diesem Falle auch okay!

Du hast zwar Recht, dass die Verwendug einer eigenen Klasse, die den Zustand speichert,
"OOer" ist, aber das ist schon fast übertrieben für Minesweeper.

Per switch auf einen int mit 3 möglichen Werten zu gehen, ist auf jeden Fall i.O.

edit:
[HIGHLIGHT="Java"]zeile[] reihe = new zeile[10];[/HIGHLIGHT]
ach komm der Arme  Wem ist das nich schon mal passiert? Also mir schon.


----------



## ESEL3000 (25. Mrz 2009)

Ich hab jetzt diese 3 zeilen mit dem jpg bild entfernt und statt dessen das hier geschrieben:


```
public void paint( Graphics g ) 
{
 
BufferedImage img = new BufferedImage(/*breite*/ 50, /*höhe*/ 50, BufferedImage.TYPE_INT_RGB);
 
            g = img.createGraphics();
            g.setColor(Color.RED);
            g.drawLine(30,30,34,36);
   
            g.fillRect(2,2,6,6);
   
             
 
            iconKreuz = new ImageIcon(img);

img = new BufferedImage(/*breite*/ 50, /*höhe*/ 50, BufferedImage.TYPE_INT_RGB);
 
            g = img.createGraphics();
               g.setColor(Color.RED);
            g.drawOval(2,8,34,36);
            g.fillRect(2,2,6,6);
   
            
 
            iconKreis = new ImageIcon(img);
            
img = new BufferedImage(/*breite*/ 50, /*höhe*/ 50, BufferedImage.TYPE_INT_RGB);
 
            g = img.createGraphics();
   
            g.fillRect(2,2,6,6);
   
           
 
            iconLeer = new ImageIcon(img);
            

        }
```

Aber nach dem compilieren wird nichts angezeigt, das fenster ist einfach nur grau


----------



## hdi (25. Mrz 2009)

Bist du sicher dass die Bilder korrekt geladen werden?


----------



## Schandro (25. Mrz 2009)

*ersetze* ganz oben das
"public void paint( Graphics g )"
*durch*
"static"


und beime *ersten* mal, wo folgender Code auftaucht:

            g = img.createGraphics();

schreibst du *stattdessen*

            Grapihcs g = img.createGraphics();


----------



## hdi (25. Mrz 2009)

Schandro das musst du mir erklären, bitte.
Du willst die Bilder beim Initialisieren der Klasse malen?

Also entweder ich versteh hier grad gar nich worum's geht, oder... 
naja ich versteh nich worum's bei _dir_ geht 

Er will doch n Spiel machen oder, also hat er n Frame oder Applet mit nem Panel,
denke ich mal.

Was ist das denn für ein Ansatz mit dem static? Falls das überhaupt funktioniert,
weil man keine eigene Instanz der Klasse erstellt (sondern davon ableitet),
dann malt er ja auch nur ein einziges mal. Verschieben vom Fenster usw. bringt dann
Probleme.

Oder was is hier los ???:L Versteh den Code grad gar nich, den du hier vorschlägst.


----------



## Lexi (25. Mrz 2009)

hdi hat gesagt.:


> Er hat finde ich auch Recht.
> Das mit dem 2d-array ist auf jeden Fall typisch, gut und intuitiv für so ein Spiel.
> Das mit den integern als Zustand.. in diesem Falle auch okay!
> 
> ...



Wenn du mir jetzt die Anzahl der BombenNachbarn jedes Feldes in das int-Array reinquetscht, bin ich zufrieden


----------



## Schandro (25. Mrz 2009)

hdi, guck dir doch einfach meinen großen Code auf Seite 1 an.
im static-initializer werden 3 ImageIcon Objecte erzeugt, damit jeder Button sich die später mit setImageIcon zuweisen kann. Eigentlich sollten da externe jpg's geladen werden, aber er brauchte eine Lösung wo man keine externen Dateien braucht...


----------



## ESEL3000 (25. Mrz 2009)

Ok hab jetzt:

```
static
{
 
BufferedImage img = new BufferedImage(/*breite*/ 50, /*höhe*/ 50, BufferedImage.TYPE_INT_RGB);
 
            Grapihcs g = img.createGraphics(); 
            g.setColor(Color.RED);
            g.drawLine(30,30,34,36);
```

es kommt aber jetzt der fehler "cannot find symbol - class Graphics" beim compilen?


----------



## 0x7F800000 (25. Mrz 2009)

dann tipp mal da oben "Java API Graphics" ins browserfensterchen ein, und schau nach welches package du vergessen hast... 

...und außerden steht da nirgends "Graphics", sondern eher sowas wie "Garpcihs" :autsch:


----------



## Schandro (25. Mrz 2009)

*€dit: Doppelpost*


----------



## Schandro (25. Mrz 2009)

€dit:

Ach komm, was solls:
Lad dir hier einfach deine HA runter:
File-Upload.net - TicTacToe.java

toller Service^^ hab grad einfach nix besseres zu tun...


----------



## hdi (26. Mrz 2009)

Also das Laden der Bilder im static Block ist das eine, aber was ich nicht verstehe sind
diese Zeichen-Vorgänge (Aufrufe auf dem Graphics-Objekt).
Was soll das denn bitte in einem static Block?



> Wenn du mir jetzt die Anzahl der BombenNachbarn jedes Feldes in das int-Array reinquetscht, bin ich zufrieden


Naja jedes Feld hat ja eben den integern, ob bomb oder nicht oder sonstwas.
D.h. willst du die Nachbarn rausfinden, schauste dir einfach alle drumrum an.
Äh... wo is nun dein Problem?

Man klickt auf ein Feld, die mouseClicked Methode kann über den Mauspoint rausfinden
welches Feld geklickt wurde (Zeile und Spalte).

Nun überprüfst du alle Felder drumrum auf ihren Status, fertig.

edit: Geht es hier eigentlich um TicTacToe oder Minesweeper ?


----------



## ESEL3000 (26. Mrz 2009)

Danke an euch und speziell an Schandro und seine geduld 

Jetzt muss ich nur noch hoffen, dass ich den code nicht meinem lehrer erklären muss


----------



## hdi (26. Mrz 2009)

Ich hab mir Schandors Code nicht angesehen, aber du solltest wissen dass ein
geschultest Auge (dein Lehrer) Code von fortgeschrittenen Javaianern auf den ersten
Blick von Anfänger-Code unterscheiden kann. 
Alleine schon eine @Override Annotation, eine kleine inner class oder die Art und Weise
wie der Code kommentiert ist kann dich entlarven... Also Vorsicht


----------



## 0x7F800000 (26. Mrz 2009)

hdi hat gesagt.:


> Alleine schon eine @Override Annotation, eine kleine inner class oder die Art und Weise
> wie der Code kommentiert ist kann dich entlarven... Also Vorsicht


super, jetzt geht er los und killt erstmal alle annotationen, löscht alle kommentare und jagt den code durch nen obfuscator :lol: Dann kann sich Schandro umso mehr freuen, dass seine Mühe geschätzt wird


----------



## Schandro (26. Mrz 2009)

> Ich hab mir Schandors Code nicht angesehen, aber du solltest wissen dass ein
> geschultest Auge (dein Lehrer) Code von fortgeschrittenen Javaianern auf den ersten
> Blick von Anfänger-Code unterscheiden kann.


Wie gesagt, ist ein etwas älterer Code von mir den auch nur schnell angepasst hab, Annotations kommen nicht vor und die einzige innere Klasse ist der ActionListener^^ Sollte also nicht sofort auffallen. Ich werd meinen Code auf der ersten Seite aber mal rauseditieren, nicht das der Lehrer so schlau ist und Codeteile der Schüler googelt...
€dit:
Ok geht nicht, da der Post bereits zu alt ist. Könnte ein Mod den bitte löschen?
Wahrscheinlich kommt jetzt gleich einer und sagt: Hey ist doch des TO's Pech wenn er erwischt wird. Seh ich nicht so...




> Also das Laden der Bilder im static Block ist das eine, aber was ich nicht verstehe sind
> diese Zeichen-Vorgänge (Aufrufe auf dem Graphics-Objekt).
> Was soll das denn bitte in einem static Block?


Ob man im static Block ein Image herstellt, indem man es aus ner externen Datei lädt, oder ob man createGraphics aufruft und damit ein bisschen rummalt, ist doch fast dasselbe. Wahrscheinlich siehst du nur "Graphics" und musst sofort an "paintComponent" denken, hat in diesem Fall aber nix miteinander zu tun.


----------



## hdi (26. Mrz 2009)

> Wahrscheinlich siehst du nur "Graphics" und musst sofort an "paintComponent" denken, hat in diesem Fall aber nix miteinander zu tun.



So ungefähr ist es. Mich verwundert aber nicht das Graphics-Object, sondern eben
das Zeichnen-
Ich frag mich hier worauf wird gezeichnet?

Wenn man ne Klasse hat extends JPanel

und macht sowas wie g.drawRect() im static-Block, funktioniert das überhaupt?
Ich meine ist das wie wenn man auf dem Panel malt?
Der static-Block kommt doch vor allen nicht-statischen Dingen dran, also irgendwie
kann ich mir nicht vorstellen, was da passiert...


----------



## Schandro (26. Mrz 2009)

Das Graphics Object erstellst du mit:
img.createGraphics();
infolgedessen bezieht sich "g" auf dein img.
Immer wenn du "g" etwas malen lässt, malt es auf "img". 

Das ganze hat absolut nichts mit Vererbung, Panels, paintComponent oder sonst was zu tun.


Graphics ist in diesem Fall einfach nur eine Möglichkeit, sich sein BufferedImage zu bemalen ohne in dessen WritableRaster rumpfuschen zu müssen.[SIZE=-1]http://java.sun.com/javase/6/docs/api/java/awt/image/WritableRaster.html[/SIZE]


----------



## hdi (26. Mrz 2009)

Ah ok, du lädst also Bilder und malt sie gleich um für den weiteren Gebrauch in der Klasse.
Jetzt hab ichs, danke


----------

