TicTacToe

Status
Nicht offen für weitere Antworten.

ESEL3000

Mitglied
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

Top Contributor
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...
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
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 :D.
(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:
 
Zuletzt bearbeitet:

Schandro

Top Contributor
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

Top Contributor
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 :mad:
 
Zuletzt bearbeitet:

andre111

Bekanntes Mitglied
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

Mitglied
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:D 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

Top Contributor
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
 

Schandro

Top Contributor
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]
 
Zuletzt bearbeitet:

Ark

Top Contributor
Ö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

Top Contributor
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 :D]
 

ESEL3000

Mitglied
Riesen Dank an Schandro! Du rettest mir den arsch:D

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

Mitglied
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 :D]

Du sprichst mir aus der Seele:toll:
 

Schandro

Top Contributor
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 = ...
 
Zuletzt bearbeitet:
S

Spacerat

Gast
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

Top Contributor
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

Mitglied
ich bekomm bei
Code:
BufferedImage img = new BufferedImage(/*breite*/ 50, /*höhe*/ 50, BufferedImage.TYPE_INT_RGB);

beim compilen den fehler:

cannot find symbol -class BufferedImage
 

ESEL3000

Mitglied
ok danke, und jetzt noch eine frage:D:

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

was muss ich dann hier ändern?
 

Schandro

Top Contributor
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

Bekanntes Mitglied
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 -.-'

Code:
//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

Top Contributor
Code:
//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"
Brutaaal!
69.gif
http://www.smileygarden.de/smilie/Crazy/69.gif
 

Lexi

Bekanntes Mitglied

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
Code:
private Feld[] spielFeld;
wäre das vllt etwas eleganter und OO-näher gelöst, er war wohl anderer Meinung...
 

Ark

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

Ark
 

hdi

Top Contributor
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.
 
Zuletzt bearbeitet:

ESEL3000

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

Code:
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
 

Schandro

Top Contributor
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

Top Contributor
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

Bekanntes Mitglied
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.

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

Schandro

Top Contributor
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

Mitglied
Ok hab jetzt:
Code:
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

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

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

hdi

Top Contributor
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 ?
 
Zuletzt bearbeitet:

ESEL3000

Mitglied
Danke an euch und speziell an Schandro und seine geduld:D

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

hdi

Top Contributor
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

Top Contributor
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

Top Contributor
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.
 
Zuletzt bearbeitet:

hdi

Top Contributor
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

Top Contributor
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]
 
Zuletzt bearbeitet:

hdi

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

Ähnliche Java Themen

Neue Themen


Oben