Fehler bei TicTacToe

info=)

Mitglied
Woran könnte es liegen, dass die ArrayVariable und die new Methode sich hier nicht vertragen?
Weil Dreieck kein Array als Attribut hat?

Weil SpielendeTesten() ja laut Vorgabe vom Typ boolean sein muss, würde ich Folgendes ändern:
Java:
public void SpielendeTesten(){
boolean prüfung;
prüfung=false;
for(int i=0, i<3; i++){
  String text1;
  text1=istSpalteEinfarbig(i);
   if (text1!=null){
       prüfung=true;
   }
  String text2;
  text2=istZeileEinfarbig(i)
   if (text2!=null){
       prüfung=true;
   }
   if (istDiagonale1Einfarbig()) {
            prüfung = true;
        }
        if (istDiagonale2Einfarbig()) {
            prüfung = true;
        }
        
        if (prüfung){
            System.out.println("Das Spiel ist beendet!");
        }else{ 
            System.out.println("Es steht noch kein Sieger fest!");
        }
        return prüfung;
    }

Aber bekomme ich bei istSpalteEinfarbig() nicht ein Problem mit der Konsolenausgabe, wo ich eindeutig ausgeben lassen muss, wer der Gewinner ist, z.B. 'Anna, du hast das Spiel gewonnen!'

Auch wenn wir aufgrund des allgemein eher miserablen Vortschritts in der Klasse vielleicht Abgabeaufschub bekommen, wäre ich wirklich froh, das jetzt bald abhaken zu können. Muss ja auch noch Physik lernen...=)
 

AquaBall

Top Contributor
Weil Dreieck kein Array als Attribut hat?
Nein. "Type mismach" heißt: Typen passen nicht zusammen.
Also schau die die beiden beteiligten Typen in der Zeile an!

Weil SpielendeTesten() ja laut Vorgabe vom Typ boolean sein muss, würde ich Folgendes ändern:
Aber bekomme ich bei istSpalteEinfarbig() nicht ein Problem mit der Konsolenausgabe, wo ich eindeutig ausgeben lassen muss, wer der Gewinner ist, z.B. 'Anna, du hast das Spiel gewonnen!'
Naürlich musst du die Ausgabe machen. aber
1) nicht in der Prüfroutine, (Logik und Ausgabe gehört getrennt)
2) nicht x-mal (Daten zuerst sammeln und dann 1x ausgeben!)
Probier mal:
Java:
public void SpielendeTesten() {
	String sieger = null;
	for (int i = 0; i < 3; i++) {
		if (sieger == null) sieger = istSpalteEinfarbig(i);
		if (sieger == null) sieger = istZeileEinfarbig(i);
	}
	if (sieger == null) sieger = istDiagonale1Einfarbig();
	if (sieger == null) sieger = istDiagonale2Einfarbig();

	if (sieger == null) {
		System.out.println("Es steht noch kein Sieger fest!");
	} else {
		System.out.println( ... );
	}
	return prüfung;
}
 

njans

Top Contributor
Ich hab mich gestern noch mal fix hingesetzt und ein TicTacToe geschrieben (siehe Anhang). Ich mir auch die mühe gemacht es marginal zu kommentieren.
 

Anhänge

  • TicTacToe.zip
    9,9 KB · Aufrufe: 8

info=)

Mitglied
Vielen Dank, njans.
Habe nur ein kleines Problem: Kann den Anhang nicht mit BlueJ öffnen.
Welches Programm hast du verwendet? Könntest du mir bitte den Code irgendwie zukommen lassen?
 

njans

Top Contributor
Das ganze ist ein Eclipse Projekt, allerdings sind die .java Files alle dort enthalten und du kannst diese einfach dort hinpacken, wo du magst, du musst vermutlich das "package" am Anfang jeder Klasse ändern, sollte kein Problem sein. ;)
 

pl4gu33

Top Contributor
Das ganze ist ein Eclipse Projekt, allerdings sind die .java Files alle dort enthalten und du kannst diese einfach dort hinpacken, wo du magst, du musst vermutlich das "package" am Anfang jeder Klasse ändern, sollte kein Problem sein. ;)

ich glaub er meint das ZIP :D

damit geht das z.b. ;)
7-Zip (32 Bit) - Download - CHIP Online

[EDIT]okay Anhang hat sich nämlich irgendwie nach dem Zip angehört :D [/EDIT]
 
Zuletzt bearbeitet:

info=)

Mitglied
Nein, ZIP ist an sich nicht das Problem, ich kann den Ordner schon extrahieren. Aber sobald ich ihn öffnen möchte, kommt die Meldung, dass die Datei nicht geöffnet werden konnte.
 

njans

Top Contributor
Du versuchst das bestimmt direkt zu importieren. Das wird wohl nicht gehen, aber ich lad mir mal BlueJay runter und schaue mir das mal eben an.

Hier hast du mal eine Version ohne Packages, die dann für BlueJ funktioniert.
 

Anhänge

  • TTT.zip
    8,2 KB · Aufrufe: 2
Zuletzt bearbeitet:

info=)

Mitglied
Zunächst einmal Danke für Deine Mühe. =)))
Aber der Code ist in Englisch geschrieben und mein Lehrer wird sich sehr darüber wundern, dass ich seine Vorgaben (siehe Seite 2) so sehr erweitert und großzügig ausgelegt habe.:(
Wir sind dafür immer noch zu sehr Anfänger...
 

njans

Top Contributor
Zumindest hast du da ein funktionsfähiges Beispiel welches ich, so hoffe ich, doch ausreichen kommentiert habe. Du kannst ja mal reinschauen und versuchen nachzuvollziehen, was ich da mache. Startpunkt ist die Klasse "Games" mit der main-Methode.
 

info=)

Mitglied
Hallo,
ich komme einfach nicht drauf, warum er mir bei [c] spielfigurK[feld] = new Dreieck (60, 60, (feld%3)*70+50, (feld/3)*70+20, "gelb"); [/c] incompatibletypes ausgibt. Im Konstruktor von Dreieck heißt es: [c] public Dreieck(int h, int b, int x, int y, String f) [/c].
Könnte mir bitte jemand auf die Sprünge helfen?
 

info=)

Mitglied
Oh, Ok, hab mich verschaut und aus Versehen K und D bei Spielfigur vertauscht.
Aber ein neues Problem:
Ich habe die beiden Methoden programmiert:
[c]
public void setzeDreieck(int feld) {
spielfigurD[feld] = new Dreieck (60, 60, (feld%3)*70+50, (feld/3)*70+20, "gelb");
spielfigur[feld]=Dreieck;
}
[/c]

[c]

public void setzeKreis(int feld) {
spielfigurK[feld] = new Kreis (60, 60, (feld%3)*70+50, (feld/3)*70+20, "blau");
spielfigur[feld]=Kreis;
}
[/c]

Er sagt für die Zeile [c] spielfigur[feld]=Dreieck; [/c] acnnot find symbol variable Dreieck, dabei ist spielfigur ein Array vom typ String.
 

njans

Top Contributor
Ja, weil du keine Variable mit dem Namen hast. Anstelle eine Variable zu deklarieren, weißt du deinem Array das Objekt doch direkt zu:
Java:
public void setzeDreieck(int feld) { 
  Dreieck dreieck = new Dreieck (60, 60, (feld%3)*70+50, (feld/3)*70+20, "gelb"); 
  spielfigurD[feld] =  dreieck 
  spielfigur[feld]= dreieck ; 
}

Oder:

Java:
public void setzeDreieck(int feld) { 
  spielfigurD[feld] = new Dreieck (60, 60, (feld%3)*70+50, (feld/3)*70+20, "gelb"); 
  spielfigur[feld]= spielfigurD[feld]; 
}
 

info=)

Mitglied
Deine zweite Lösung hat auch die Meldung incompatible types, da spielfigurD ein Array vom Typ Dreieck und spielfigur ein Array vom Typ String ist!?
Und bei der ersten kommt immer noch die Meldung, dass er die Variable nicht findet.
 

njans

Top Contributor
Wenn das die 2te Methode hat, dann haben das beide, da beide das gleiche machen (sofern man hier keine Polymorphie ansetzt ;)).

Java:
public void setzeDreieck(int feld) { 
  spielfigurD[feld] = new Dreieck (60, 60, (feld%3)*70+50, (feld/3)*70+20, "gelb"); 
  spielfigur[feld]= "Dreieck";  // Willst du hier nur einen String hinzufügen? 
}
 

info=)

Mitglied
Hallo,
also ich habe jetzt nochmal einen Code geschrieben, aber er verweigert SpielzugAusführen(int feldnummer), zeichnet überhaupt nicht und auch die Konsolenausgabe stimmt noch nicht so richtig. Muss das jetzt zum Laufen bekommen, könntest Du es also mal in BlueJ ausprobieren und dir die Unstimmigkeiten anschauen? Komme einfach nicht dahinter...:(
SPIELER:
Java:
public class SPIELER{

public SPIEL spiel1;
public String name;
public int spielsymbol;
public SPIELFELD spielfeldJetzt; 

 


public SPIELER(String NeuerName){
name=NeuerName;
}

public void SpielBekanntmachen(SPIEL spiel){
spiel1=spiel;
}


public void SpielsymbolSetzen(int symbol){
spielsymbol=symbol;
}

public String NameGeben(){
return name;
}

public int SpielsymbolGeben(){
return spielsymbol;
}

public void SpielzugAusführen(int feldnummer){
spiel1.SpielzugVerarbeiten(feldnummer);
}
}

SPIEL:
Java:
public class SPIEL {
 
    private SPIELER     aktuellerSpieler;
    private SPIELFELD   spielfeld1;
    private int[]       aktuellesSpielfeld;
    private SPIELER     spieler1;
    private SPIELER     spieler2;
 
    private Dreieck []    spielfigurD;
    private String  []   spielfigur;
    private Kreis  []     spielfigurK;
 
    public SPIEL(SPIELER NeuerSpieler1, SPIELER NeuerSpieler2) {
        spieler1 = NeuerSpieler1;
        spieler2 = NeuerSpieler2;
        spieler1.SpielBekanntmachen(this);
        spieler2.SpielBekanntmachen(this);
        spielfeld1 = new SPIELFELD(this);
        spieler1.SpielsymbolSetzen(1);
        spieler2.SpielsymbolSetzen(2);
        aktuellesSpielfeld = new int[9];
        spielfigur=  new String[9];
        spielfigurD= new Dreieck[9];
        spielfigurK= new Kreis [9];
    }
 
    private void SpielfeldZeichnen() {
        for (int i=0; i<9; i++) {
            setzeDreieck(i);
            setzeKreis(i);
        }
    }
 
    public void setzeDreieck(int feld)   {
        spielfigurD[feld-1] = new Dreieck (60, 60, ((feld-1)%3)*70+50, ((feld-1)/3)*70+20, "gelb");
        spielfigur[feld-1]= "Dreieck";
    }
    
    public void setzeKreis(int feld)   {
        spielfigurK[feld-1] = new Kreis  (60, ((feld-1)%3)*70+20, ((feld-1)/3)*70+20, "blau");
        spielfigur[feld-1]="Kreis";
    }
    
    public void SpielStarten() {
        aktuellerSpieler = spieler1;
        spielfeld1.SpielbrettZeichnen();
        System.out.println("Spiel beginnt!");
        String name;
        name = aktuellerSpieler.NameGeben();
        System.out.println(name + " beginnt! ");
    }
 
    public void SpielzugVerarbeiten(int feldnummer) {
        int symbol;
        symbol = aktuellerSpieler.SpielsymbolGeben();
        if (aktuellesSpielfeld[feldnummer] == 0) {
            aktuellesSpielfeld[feldnummer] = symbol;
            spielfeld1.NeuGesetztenSteinZeichnen(feldnummer, aktuellerSpieler);
        } else {
            System.out.println("Das gewählte Feld ist leider bereits besetzt!");
        }
 
        if (SpielendeTesten()) {
            String text;
            text = aktuellerSpieler.NameGeben();
            System.out.println(text + " , du hast das Spiel gewonnen. Herzlichen Glückwunsch!");
        } else {
            if (aktuellerSpieler == spieler1) {
                aktuellerSpieler = spieler2;
            } else {
                aktuellerSpieler = spieler1;
            }
            String neu = aktuellerSpieler.NameGeben();
            System.out.println(neu + " , jetzt bist du dran. Bitte wähle ein neues Feld aus!");
        }
    }
 
    
    public String istSpalteEinfarbig(int spalte) {
        if (spielfigur[spalte]==spielfigur[spalte+3] && spielfigur[spalte+3]==spielfigur[spalte+6]){
                return aktuellerSpieler.NameGeben();
            }else{ return null;}
    }
    
    public String istZeileEinfarbig(int zeile){
           //if( spielfigur[zeile+2*zeile]==spielfigur[zeile+2*zeile+1] && spielfigur[zeile+2*zeile+1]==spielfigur[zeile+2*zeile+2])
        if(spielfigur[3*zeile]==spielfigur[3*zeile+1] && spielfigur[3*zeile+1]==spielfigur[3*zeile+2]){
        return aktuellerSpieler.NameGeben();
       }else{ return null;
        }
    }
    
    public String istDiagonale1Einfarbig(){
        if(spielfigur[0]==spielfigur[4] && spielfigur[4]==spielfigur[8]){
        return aktuellerSpieler.NameGeben();
        }else{
        return null;
       }
    }
    
    public String istDiagonale2Einfarbig(){
        if(spielfigur[2]==spielfigur[4] && spielfigur[4]==spielfigur[6]){
        return aktuellerSpieler.NameGeben();
        }else{
        return null;
       }
    }
    
    public boolean SpielendeTesten() {
       boolean prüfung;
       String sieger = null;
        for (int i = 0; i < 3; i++) {
        if (sieger == null){
            sieger = istSpalteEinfarbig(i);
        }
        if (sieger == null){
            sieger = istZeileEinfarbig(i);
        }
       }
       if (sieger == null){
           sieger = istDiagonale1Einfarbig();
        }
       if (sieger == null){
           sieger = istDiagonale2Einfarbig();
        }
 
       if (sieger == null) {
        prüfung=false;
        System.out.println("Es steht noch kein Sieger fest!");
       } else {
        prüfung=true;
        System.out.println("Das Spiel ist beendet!");
       }
    return prüfung;
    }
    
    
    
}

SPIELFELD:
Java:
public class SPIELFELD{
     
    private int [] spielfeld;
    private SPIEL aktuellesSpiel;
    private SPIELER spieler;
    private Quadrat hintergrund;
    private Quadrat [] quadrat;
     
    public SPIELFELD(SPIEL a){
        spielfeld=new int [9];
        quadrat= new Quadrat [9];
        aktuellesSpiel=a;
        for (int i=0; i<9; i++){
            spielfeld[i]=0;
        }
    }
      
    public void BelegungAendern(int feldnummer, int spielfigur){
        if (spielfeld[feldnummer]==0){
            spielfeld[feldnummer]=spielfigur;
        }else{
            System.out.println("Das gewünschte Feld ist leider bereits belegt!");
        }
    }
     
    public void SpielbrettZeichnen(){
        hintergrund= new Quadrat(220, 10, 10, "schwarz");
        for (int i=0; i<9; i++) {
            quadrat[i] = new Quadrat(60, (i%3)*70+20, (i/3)*70+20, "rot");
        }
    }
    
    public void NeuGesetztenSteinZeichnen(int feldnummer, SPIELER sp){
        sp.SpielzugAusführen(feldnummer);
        if(spielfeld[feldnummer]==1)
            {aktuellesSpiel.setzeDreieck(feldnummer-1);}
        if(spielfeld[feldnummer]==2) 
            {aktuellesSpiel.setzeKreis  (feldnummer-1);}
    }
}

Vorgegeben waren:
Dreieck:
Java:
import java.awt.Polygon;

/**
 * Ein Dreieck, das manipuliert werden kann und sich selbst auf einer Leinwand
 * zeichnet.
 * 
 * @author Michael Kölling und David J. Barnes
 * @version 2006.03.30
 */

public class Dreieck {
	private int hoehe;

	private int breite;

	private int xPosition;

	private int yPosition;

	private String farbe;

	private boolean istSichtbar;

	/**
	 * Erzeuge ein Dreieck mit einer Standardfarbe an einer Standardposition.
	 */
	public Dreieck(int h, int b, int x, int y, String f) {
		hoehe = h;
		breite = b;
		xPosition = x;
		yPosition = y;
		farbe = f;
		istSichtbar = false;
		sichtbarMachen();
	}

	/**
	 * Mache dieses Dreieck sichtbar. Wenn es bereits sichtbar ist, tue nichts.
	 */
	public void sichtbarMachen() {
		istSichtbar = true;
		zeichnen();
	}

	/**
	 * Mache dieses Dreieck unsichtbar. Wenn es bereits unsichtbar ist, tue
	 * nichts.
	 */
	public void unsichtbarMachen() {
		loeschen();
		istSichtbar = false;
	}

	/**
	 * Bewege dieses Dreieck einige Bildschirmpunkte nach rechts.
	 */
	public void nachRechtsBewegen() {
		horizontalBewegen(20);
	}

	/**
	 * Bewege dieses Dreieck einige Bildschirmpunkte nach links.
	 */
	public void nachLinksBewegen() {
		horizontalBewegen(-20);
	}

	/**
	 * Bewege dieses Dreieck einige Bildschirmpunkte nach oben.
	 */
	public void nachObenBewegen() {
		vertikalBewegen(-20);
	}

	/**
	 * Bewege dieses Dreieck einige Bildschirmpunkte nach unten.
	 */
	public void nachUntenBewegen() {
		vertikalBewegen(20);
	}

	/**
	 * Bewege dieses Dreieck horizontal um 'entfernung' Bildschirmpunkte.
	 */
	public void horizontalBewegen(int entfernung) {
		loeschen();
		xPosition += entfernung;
		zeichnen();
	}

	/**
	 * Bewege dieses Dreieck vertikal um 'entfernung' Bildschirmpunkte.
	 */
	public void vertikalBewegen(int entfernung) {
		loeschen();
		yPosition += entfernung;
		zeichnen();
	}

	/**
	 * Bewege dieses Dreieck langsam horizontal um 'entfernung'
	 * Bildschirmpunkte.
	 */
	public void langsamHorizontalBewegen(int entfernung) {
		int delta;

		if (entfernung < 0) {
			delta = -1;
			entfernung = -entfernung;
		} else {
			delta = 1;
		}

		for (int i = 0; i < entfernung; i++) {
			xPosition += delta;
			zeichnen();
		}
	}

	/**
	 * Bewege dieses Dreieck langsam vertikal um 'entfernung' Bildschirmpunkte.
	 */
	public void langsamVertikalBewegen(int entfernung) {
		int delta;

		if (entfernung < 0) {
			delta = -1;
			entfernung = -entfernung;
		} else {
			delta = 1;
		}

		for (int i = 0; i < entfernung; i++) {
			yPosition += delta;
			zeichnen();
		}
	}

	/**
	 * Ändere die Höhe in 'neueHoehe' und die Breite in 'neueBreite'. Beide
	 * Angaben müssen größer gleich Null sein.
	 */
	public void groesseAendern(int neueHoehe, int neueBreite) {
		loeschen();
		hoehe = neueHoehe;
		breite = neueBreite;
		zeichnen();
	}

	/**
	 * Ändere die Farbe dieses Dreiecks in 'neueFarbe'. Gültige Angaben sind
	 * "rot", "gelb", "blau", "gruen", "lila" und "schwarz".
	 */
	public void farbeAendern(String neueFarbe) {
		farbe = neueFarbe;
		zeichnen();
	}

	/**
	 * Zeichne dieses Dreieck mit seinen aktuellen Werten auf den Bildschirm.
	 */
	private void zeichnen() {
		if (istSichtbar) {
			Leinwand leinwand = Leinwand.gibLeinwand();
			int[] xpoints = { xPosition, xPosition + (breite / 2),
					xPosition - (breite / 2) };
			int[] ypoints = { yPosition, yPosition + hoehe, yPosition + hoehe };
			leinwand.zeichne(this, farbe, new Polygon(xpoints, ypoints, 3));
			leinwand.warte(10); 
		}
	}

	/**
	 * Lösche dieses Dreieck vom Bildschirm.
	 */
	private void loeschen() {
		if (istSichtbar) {
			Leinwand leinwand = Leinwand.gibLeinwand();
			leinwand.entferne(this);
		}
	}
}

Kreis:
Java:
import java.awt.geom.Ellipse2D;

/**
 * Ein Kreis, der manipuliert werden kann und sich selbst auf einer Leinwand
 * zeichnet.
 * 
 * @author Michael Kölling und David J. Barnes
 * @version 2006.03.30
 */

public class Kreis {
	private int durchmesser;

	private int xPosition;

	private int yPosition;

	private String farbe;

	private boolean istSichtbar;

	/**
	 * Erzeuge einen neuen Kreis an einer Standardposition mit einer
	 * Standardfarbe.
	 */
	public Kreis(int d, int x, int y, String f) {
		durchmesser = d;
		xPosition = x;
		yPosition = y;
		farbe = f;
		istSichtbar = false;
		sichtbarMachen();
	}

	/**
	 * Mache diesen Kreis sichtbar. Wenn es bereits sichtbar ist, tue nichts.
	 */
	public void sichtbarMachen() {
		istSichtbar = true;
		zeichnen();
	}

	/**
	 * Mache diesen Kreis unsichtbar. Wenn es bereits unsichtbar ist, tue
	 * nichts.
	 */
	public void unsichtbarMachen() {
		loeschen();
		istSichtbar = false;
	}

	/**
	 * Bewege diesen Kreis einige Bildschirmpunkte nach rechts.
	 */
	public void nachRechtsBewegen() {
		horizontalBewegen(20);
	}

	/**
	 * Bewege diesen Kreis einige Bildschirmpunkte nach links.
	 */
	public void nachLinksBewegen() {
		horizontalBewegen(-20);
	}

	/**
	 * Bewege diesen Kreis einige Bildschirmpunkte nach oben.
	 */
	public void nachObenBewegen() {
		vertikalBewegen(-20);
	}

	/**
	 * Bewege diesen Kreis einige Bildschirmpunkte nach unten.
	 */
	public void nachUntenBewegen() {
		vertikalBewegen(20);
	}

	/**
	 * Bewege diesen Kreis horizontal um 'entfernung' Bildschirmpunkte.
	 */
	public void horizontalBewegen(int entfernung) {
		loeschen();
		xPosition += entfernung;
		zeichnen();
	}

	/**
	 * Bewege diesen Kreis vertikal um 'entfernung' Bildschirmpunkte.
	 */
	public void vertikalBewegen(int entfernung) {
		loeschen();
		yPosition += entfernung;
		zeichnen();
	}

	/**
	 * Bewege diesen Kreis langsam horizontal um 'entfernung' Bildschirmpunkte.
	 */
	public void langsamHorizontalBewegen(int entfernung) {
		int delta;

		if (entfernung < 0) {
			delta = -1;
			entfernung = -entfernung;
		} else {
			delta = 1;
		}

		for (int i = 0; i < entfernung; i++) {
			xPosition += delta;
			zeichnen();
		}
	}

	/**
	 * Bewege diesen Kreis langsam vertikal um 'entfernung' Bildschirmpunkte.
	 */
	public void langsamVertikalBewegen(int entfernung) {
		int delta;

		if (entfernung < 0) {
			delta = -1;
			entfernung = -entfernung;
		} else {
			delta = 1;
		}

		for (int i = 0; i < entfernung; i++) {
			yPosition += delta;
			zeichnen();
		}
	}

	/**
	 * Ändere den Durchmesser dieses Kreises in 'neuerDurchmesser' (Angabe in
	 * Bildschirmpunkten). 'neuerDurchmesser' muss größer gleich Null sein.
	 */
	public void groesseAendern(int neuerDurchmesser) {
		loeschen();
		durchmesser = neuerDurchmesser;
		zeichnen();
	}

	/**
	 * Ändere die Farbe dieses Kreises in 'neueFarbe'. Gültige Angaben sind
	 * "rot", "gelb", "blau", "gruen", "lila" und "schwarz".
	 */
	public void farbeAendern(String neueFarbe) {
		farbe = neueFarbe;
		zeichnen();
	}

	/**
	 * Zeichne diesen Kreis mit seinen aktuellen Werten auf den Bildschirm.
	 */
	private void zeichnen() {
		if (istSichtbar) {
			Leinwand leinwand = Leinwand.gibLeinwand();
			leinwand.zeichne(this, farbe, new Ellipse2D.Double(xPosition,
					yPosition, durchmesser, durchmesser));
			leinwand.warte(10); 
		}
	}

	/**
	 * Lösche diesen Kreis vom Bildschirm.
	 */
	private void loeschen() {
		if (istSichtbar) {
			Leinwand leinwand = Leinwand.gibLeinwand();
			leinwand.entferne(this);
		}
	}

}

Quadrat:
Java:
import java.awt.Rectangle;

/**
 * Ein Quadrat, das manipuliert werden kann und sich selbst auf einer Leinwand
 * zeichnet.
 * 
 * @author Michael Kölling und David J. Barnes
 * @version 2006.03.30
 */

public class Quadrat {
	public int groesse;

	public int xPosition;

	public int yPosition;

	public String farbe;

	public  boolean istSichtbar;

	/**
	 * Erzeuge ein neues Quadrat mit einer Standardfarbe an einer
	 * Standardposition.
	 */
	public Quadrat(int g, int x, int y, String f) {
		groesse = g;
		xPosition = x;
		yPosition = y;
		farbe = f;
		istSichtbar = true;
		zeichnen();
	}

	/**
	 * Mache dieses Quadrat sichtbar. Wenn es bereits sichtbar ist, tue nichts.
	 */
	public void sichtbarMachen() {
		istSichtbar = true;
		zeichnen();
	}

	/**
	 * Mache dieses Quadrat unsichtbar. Wenn es bereits unsichtbar ist, tue
	 * nichts.
	 */
	public void unsichtbarMachen() {
		loeschen();
		istSichtbar = false;
	}

	/**
	 * Bewege dieses Quadrat einige Bildschirmpunkte nach rechts.
	 */
	public void nachRechtsBewegen() {
		horizontalBewegen(20);
	}

	/**
	 * Bewege dieses Quadrat einige Bildschirmpunkte nach links.
	 */
	public void nachLinksBewegen() {
		horizontalBewegen(-20);
	}

	/**
	 * Bewege dieses Quadrat einige Bildschirmpunkte nach oben.
	 */
	public void nachObenBewegen() {
		vertikalBewegen(-20);
	}

	/**
	 * Bewege dieses Quadrat einige Bildschirmpunkte nach unten.
	 */
	public void nachUntenBewegen() {
		vertikalBewegen(20);
	}

	/**
	 * Bewege dieses Quadrat horizontal um 'entfernung' Bildschirmpunkte.
	 */
	public void horizontalBewegen(int distance) {
		loeschen();
		xPosition += distance;
		zeichnen();
	}

	/**
	 * Bewege dieses Quadrat vertikal um 'entfernung' Bildschirmpunkte.
	 */
	public void vertikalBewegen(int entfernung) {
		loeschen();
		yPosition += entfernung;
		zeichnen();
	}

	/**
	 * Bewege dieses Quadrat langsam horizontal um 'entfernung'
	 * Bildschirmpunkte.
	 */
	public void langsamHorizontalBewegen(int entfernung) {
		int delta;

		if (entfernung < 0) {
			delta = -1;
			entfernung = -entfernung;
		} else {
			delta = 1;
		}

		for (int i = 0; i < entfernung; i++) {
			xPosition += delta;
			zeichnen();
		}
	}

	/**
	 * Bewege dieses Quadrat langsam vertikal um 'entfernung' Bildschirmpunkte.
	 */
	public void langsamVertikalBewegen(int entfernung) {
		int delta;

		if (entfernung < 0) {
			delta = -1;
			entfernung = -entfernung;
		} else {
			delta = 1;
		}

		for (int i = 0; i < entfernung; i++) {
			yPosition += delta;
			zeichnen();
		}
	}

	/**
	 * Ändere die Größe dieses Quadrates in 'neueGroesse'. 'neueGroesse' muss
	 * groesser gleich Null sein.
	 */
	public void groesseAendern(int neueGroesse) {
		loeschen();
		groesse = neueGroesse;
		zeichnen();
	}

	/**
	 * Ändere die Farbe dieses Quadrates in 'neueFarbe'. Gültige Angaben sind
	 * "rot", "gelb", "blau", "gruen", "lila" und "schwarz".
	 */
	public void farbeAendern(String neueFarbe) {
		farbe = neueFarbe;
		zeichnen();
	}

	/**
	 * Zeichne dieses Quadrat mit seinen aktuellen Werten auf den Bildschirm.
	 */
	private void zeichnen() {
		if (istSichtbar) {
			Leinwand leinwand = Leinwand.gibLeinwand();
			leinwand.zeichne(this, farbe, new Rectangle(xPosition, yPosition,
					groesse, groesse));
			leinwand.warte(10);
		}
	}

	/**
	 * Lösche dieses Quadrat vom Bildschirm.
	 */
	private void loeschen() {
		if (istSichtbar) {
			Leinwand leinwand = Leinwand.gibLeinwand();
			leinwand.entferne(this);
		}
	}
}
 

info=)

Mitglied
Leinwand war auch noch vorgegeben:


Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Leinwand ist eine Klasse, die einfache Zeichenoperationen auf einer
 * leinwandartigen Zeichenfläche ermöglicht. Sie ist eine vereinfachte Version
 * der Klasse Canvas (englisch für Leinwand) des JDK und wurde speziell für das
 * Projekt "Figuren" geschrieben.
 * 
 * 
 * @author: Bruce Quig
 * @author: Michael Kölling (mik)
 * @author: Axel Schmolitzky
 * 
 * @version: 2006.03.30
 */
public class Leinwand {
	// Hinweis: Die Implementierung dieser Klasse (insbesondere die
	// Verwaltung der Farben und Identitäten der Figuren) ist etwas
	// komplizierter als notwendig. Dies ist absichtlich so, weil damit
	// die Schnittstellen und Exemplarvariablen der Figuren-Klassen
	// für den Lernanspruch dieses Projekts einfacher und klarer
	// sein können.

	private static Leinwand leinwandSingleton;

	/**
	 * Fabrikmethode, die eine Referenz auf das einzige Exemplar dieser Klasse
	 * zurückliefert. Wenn es von einer Klasse nur genau ein Exemplar gibt, wird
	 * dieses als 'Singleton' bezeichnet.
	 */
	public static Leinwand gibLeinwand() {
		if (leinwandSingleton == null) {
			leinwandSingleton = new Leinwand("BlueJ Figuren Demo", 300, 300,
					Color.white);
		}
		leinwandSingleton.setzeSichtbarkeit(true);
		return leinwandSingleton;
	}

	// ----- Exemplarvariablen -----

	private JFrame fenster;

	private Zeichenflaeche zeichenflaeche;

	private Graphics2D graphic;

	private Color hintergrundfarbe;

	private Image leinwandImage;

	private List<Object> figuren;

	private Map<Object, ShapeMitFarbe> figurZuShape;
	
	/**
	 * Erzeuge eine Leinwand.
	 * 
	 * @param titel
	 *            Titel, der im Rahmen der Leinwand angezeigt wird
	 * @param breite
	 *            die gewünschte Breite der Leinwand
	 * @param hoehe
	 *            die gewünschte Höhe der Leinwand
	 * @param grundfarbe
	 *            die Hintergrundfarbe der Leinwand
	 */
	private Leinwand(String titel, int breite, int hoehe, Color grundfarbe) {
		fenster = new JFrame();
		zeichenflaeche = new Zeichenflaeche();
		fenster.setContentPane(zeichenflaeche);
		fenster.setTitle(titel);
		zeichenflaeche.setPreferredSize(new Dimension(breite, hoehe));
		hintergrundfarbe = grundfarbe;
		fenster.pack();
		figuren = new ArrayList<Object>();
		figurZuShape = new HashMap<Object, ShapeMitFarbe>();
	}

	/**
	 * Setze, ob diese Leinwand sichtbar sein soll oder nicht. Wenn die Leinwand
	 * sichtbar gemacht wird, wird ihr Fenster in den Vordergrund geholt. Diese
	 * Operation kann auch benutzt werden, um ein bereits sichtbares
	 * Leinwandfenster in den Vordergrund (vor andere Fenster) zu holen.
	 * 
	 * @param sichtbar
	 *            boolean für die gewünschte Sichtbarkeit: true für sichtbar,
	 *            false für nicht sichtbar.
	 */
	public void setzeSichtbarkeit(boolean sichtbar) {
		if (graphic == null) {
			// erstmaliger Aufruf: erzeuge das Bildschirm-Image und fülle
			// es mit der Hintergrundfarbe
			Dimension size = zeichenflaeche.getSize();
			leinwandImage = zeichenflaeche.createImage(size.width, size.height);
			graphic = (Graphics2D) leinwandImage.getGraphics();
			graphic.setColor(hintergrundfarbe);
			graphic.fillRect(0, 0, size.width, size.height);
			graphic.setColor(Color.black);
		}
		fenster.setVisible(sichtbar);
	}

	/**
	 * Zeichne für das gegebene Figur-Objekt eine Java-Figur (einen Shape) auf
	 * die Leinwand.
	 * 
	 * @param figur
	 *            das Figur-Objekt, für das ein Shape gezeichnet werden soll
	 * @param farbe
	 *            die Farbe der Figur
	 * @param shape
	 *            ein Objekt der Klasse Shape, das tatsächlich gezeichnet wird
	 */
	public void zeichne(Object figur, String farbe, Shape shape) {
		figuren.remove(figur); // entfernen, falls schon eingetragen
		figuren.add(figur); // am Ende hinzufügen
		figurZuShape.put(figur, new ShapeMitFarbe(shape, farbe));
		erneutZeichnen();
	}

	/**
	 * Entferne die gegebene Figur von der Leinwand.
	 * 
	 * @param figur
	 *            die Figur, deren Shape entfernt werden soll
	 */
	public void entferne(Object figur) {
		figuren.remove(figur); // entfernen,falls schon eingetragen
		figurZuShape.remove(figur);
		erneutZeichnen();
	}

	/**
	 * Setze die Zeichenfarbe der Leinwand.
	 * 
	 * @param farbname
	 *            der Name der neuen Zeichenfarbe.
	 */
	public void setzeZeichenfarbe(String farbname) {
		if (farbname.equals("rot")) {
			graphic.setColor(Color.red);
		} else if (farbname.equals("schwarz")) {
			graphic.setColor(Color.black);
		} else if (farbname.equals("blau")) {
			graphic.setColor(Color.blue);
		} else if (farbname.equals("gelb")) {
			graphic.setColor(Color.yellow);
		} else if (farbname.equals("gruen")) {
			graphic.setColor(Color.green);
		} else if (farbname.equals("lila")) {
			graphic.setColor(Color.magenta);
		} else if (farbname.equals("weiss")) {
			graphic.setColor(Color.white);
		} else {
			graphic.setColor(Color.black);
		}
	}

	/**
	 * Warte für die angegebenen Millisekunden. Mit dieser Operation wird eine
	 * Verzögerung definiert, die für animierte Zeichnungen benutzt werden kann.
	 * 
	 * @param millisekunden
	 *            die zu wartenden Millisekunden
	 */
	public void warte(int millisekunden) {
		try {
			Thread.sleep(millisekunden);
		} catch (Exception e) {
			// Exception ignorieren
		}
	}

	/**
	 * Zeichne erneut alle Figuren auf der Leinwand.
	 */
	private void erneutZeichnen() {
		loeschen();
		for (Object figur : figuren) {
			figurZuShape.get(figur).draw(graphic);
		}
		zeichenflaeche.repaint();
	}

	/**
	 * Lösche die gesamte Leinwand.
	 */
	private void loeschen() {
		Color original = graphic.getColor();
		graphic.setColor(hintergrundfarbe);
		Dimension size = zeichenflaeche.getSize();
		graphic.fill(new Rectangle(0, 0, size.width, size.height));
		graphic.setColor(original);
	}

	/***************************************************************************
	 * Interne Klasse Zeichenflaeche - die Klasse für die GUI-Komponente, die
	 * tatsächlich im Leinwand-Fenster angezeigt wird. Diese Klasse definiert
	 * ein JPanel mit der zusätzlichen Möglichkeit, das auf ihm gezeichnet Image
	 * aufzufrischen (erneut zu zeichnen).
	 */
	private class Zeichenflaeche extends JPanel {
		private static final long serialVersionUID = 20060330L;

		public void paint(Graphics g) {
			g.drawImage(leinwandImage, 0, 0, null);
		}
	}

	/***************************************************************************
	 * Interne Klasse ShapeMitFarbe - Da die Klasse Shape des JDK nicht auch
	 * eine Farbe mitverwalten kann, muss mit dieser Klasse die Verknüpfung
	 * modelliert werden.
	 */
	private class ShapeMitFarbe {
		private Shape shape;

		private String farbe;

		public ShapeMitFarbe(Shape shape, String farbe) {
			this.shape = shape;
			this.farbe = farbe;
		}

		public void draw(Graphics2D graphic) {
			setzeZeichenfarbe(farbe);
			graphic.fill(shape);
		}
	}

}
 

njans

Top Contributor
So fertig. Sollte jetzt gehen. Ich hab mir kurz mal das "Klassen-Diagramm" von Aufgabe 1 angeschaut. Richtiges UML wäre mir lieber, da würde man auch sehen, was Public und private sein soll.
Du hattest eine Menge unnötiger Variablen drin und hast vieles doppelt und dreifach gemacht. Was dir wohl das größte Problem gemacht hat, war die Struktur. Das Spielfeld hält den Zustand des Spiels und aktualisiert sich, je nachdem, was für Eingaben kommen. Das Spiel muss nicht wissen, wie das Spielfeld aufgebaut ist und wie es gerade aussieht, es muss nur abfragen können, ob ein Spiel fertig ist.

Was das zeichnen angeht: Du musst da keine Objekte zwischenspeichern, sobald du ein neues Objekt erstellst, zeichnet es sich selbst. Daher kannst du dir das Dreieck[] und Kreis[] sparen ;)

Du solltest die Benennung von Klassen und Methoden aber noch mal überdenken, denn wenn dein Prof dir sagt, dass du so schreiben sollst, dann macht er etwas falsch. "MeineMethode()", das wäre okay, wenn wir in C-sharp wären, in java werden Methoden klein zu beginn geschrieben, also "meineMethode()". Klassen werden genauso geschrieben, wie Methoden, die dir dein Prof andrehen will, also "MeinKlasse", aber bitte nicht alles großschreiben.

Selbst jetzt noch, sind viele Parameter und Referenzen nicht notwendig, aber ist ja nicht schädlich für die Funktionalität.

P.S. BlueJay ist zum Kotzen^^ Diese "IDE" kann so gut wie gar nichts und ist nicht besser als ein Text Editor.
 

Anhänge

  • TTT.zip
    9,3 KB · Aufrufe: 7

AquaBall

Top Contributor
info=) hat gesagt.:
Oh, Ok, hab mich verschaut und aus Versehen K und D bei Spielfigur vertauscht.
Und wie hast du gesucht, dass das solange gedauert hat?

Und mit korrekter Formatierung würdest du viel beser suchen können!

Dein SpielendeTesten kann man nochmal optimieren, außerdem verwendest du 'sieger' gar nicht!
Java:
    public String pruefe(int a, int b, int c)){
        if(spielfigur[a]==spielfigur[b] && spielfigur[b]==spielfigur[c]){
        return aktuellerSpieler.NameGeben();
        }else{
        return null;
       }
    }
    
    public boolean SpielendeTesten() {
       boolean prüfung;
       String sieger = null;
        for (int i = 0; i < 3; i++) {
        if (sieger == null){
            sieger = pruefe(i,i+3,i+6); // ist Spalte Einfarbig?
        }
        if (sieger == null){
            sieger = pruefe(3*i,3*i+1,3*i+2); // ist Zeile Einfarbig?
        }
       }
       if (sieger == null){
           sieger = pruefe(0,4,8); // ist Diagonale1 Einfarbig?
        }
       if (sieger == null){
           sieger = pruefe(2,4,6); // ist Diagonale2 Einfarbig?
        }
 
       if (sieger == null) {
        prüfung=false;
        System.out.println("Es steht noch kein Sieger fest!");
       } else {
        prüfung=true;
        System.out.println("Gratuliere "+sieger+", du hast gewonnen! Das Spiel ist beendet!");
       }
    return prüfung;
    }
 

njans

Top Contributor
Die Methoden habe ich schon alle umgebaut ;)
Die sehen nun alle deutlich besser aus.
Da war eben viel unnötiges drin und die Daten, die eigentlich SpielFeld haben sollte, sind dann auch in Spiel gewesen und umgekehrt.
 

AquaBall

Top Contributor
njans, wirklich vielen Dank für Deine Mühe.
Ohne Deine Unterstützung wäre es wohl sehr problematisch geworden!!:)

Eher ist es jetzt problematisch!
Was lernst du, wenn du nun vorgefertigten Code abgibst?
Beim nächsten Projekt hast du vielleicht niemanden mehr, der für dich den Denker spielt.

Und bei dem, Code den du allein produziert hast, befürchte ich, dass auch schon bisher einiges Knowhow nicht selbst erarbeitet wurde.

Ohne das Ganze selbst zu erarbeiten kommst du nicht weiter!
 

njans

Top Contributor
njans, wirklich vielen Dank für Deine Mühe.
Ohne Deine Unterstützung wäre es wohl sehr problematisch geworden!!:)

Keine Ursache, nur Lernen musst du es eben noch selbst. Das nimmt dir jetzt vielleicht den Druck der Abgabe, aber wenn das nächste mal etwas auf dich zu kommt, dann macht das vielleicht eben keiner für dich ^^. Ich kann nur empfehlen: Programmiere lieber ein ein kleines Projekt für dich selbst.
 

info=)

Mitglied
Hallo,
natürlich habt ihr Recht, dass ich das noch selbst erarbeiten und lernen muss (Im Gegensatz zu den meisten anderen in meiner Klasse habe ich mich aber zumindest hingesetzt und versucht, - wenn auch durchaus verbesserungswürdige - Vorschläge zu liefern). Da ich jedoch noch nie ein so großes Projekt bearbeitet habe, hätte ich mich als Einsteiger auch wohl eher nicht gleich für ein solches Projekt entschieden, wenn ich hätte wählen dürfen....
In diesem Sinne hat mir der Code sehr geholfen, da ich mich jetzt daran als Leitfaden orientieren kann. Ich möchte ihn aber auch gerne selbst zumindest vollständig verstehen können.
Daher - die wohl in euren Augen wohl eher banale - Frage:
Was bedeutet [c] i+=3[/c] in der for-Schleife [c]for (int i = 0; i < spielfeld.length; i+=3) [/c]?

PS:
Mein Lehrer hat wie bereits angedeutet die Abgabefrist bis Mittwoch verlängert, da in dieser Woche wegen diverser Veranstaltungen ca. die Hälfte der Klasse gefehlt hat.
Dafür hat er uns eine weitere Auflage gegeben, nämlich einen Computer zu programmieren, der gegen einen Spieler spielt und dabei automatisch zieht.

Da ich mir noch nicht ganz zutraue, das alles selbst programmieren zu können, würde ich mich freuen, wenn wir das zusammen erarbeiten könnten.
 

njans

Top Contributor
Java:
for (int i = 0; i < spielfeld.length; i+=3)

i+=3 ist einfach nur i = i + 3.
Selbes gilt für *=, -=, etc.
 

info=)

Mitglied
Danke, njans.

Ich fürchte, du müsstest mir beim Computer nochmal helfen. Unser Lehrer meinte, wir könnten Computer als Unterklasse von SPIELER anlegen (andere Lösungen sind auch möglich).
Dazu hab ich jetzt mal das Grobgerüst + Methode zur Erzeugung einer Zufallszahl, die ich ja später als Feldnummer brauche:
Java:
public class COMPUTER extends SPIELER{


public COMPUTER(String NeuerName){
super(NeuerName);
}

//Zufallszahl zwischen 0 und 9 -> für high später als Parameter 9 einsetzen
public static int myRandom(int low, int high) {  
    return (int) (Math.random() * (high - low) + low);  
} 

}
 
Zuletzt bearbeitet:

njans

Top Contributor
Kleiner Tipp: Verwende lieber java.util.Random.
Also Random radnom = new Random(seed); wobei seed eine Konstante ist, somit kriegst du immer die selbe Folge von Zahlen und du kannst Fehler leichter finden. random sollte dann eine Exemplarvariable/Instanzvariable sein.

Nebenbei; Hat euer Lehrer gesagt, dass ihr Klassen GANZ IN GROßBUCHTSATBEN schreiben sollt?
 

info=)

Mitglied
Ja, hat er tasächlich gesagt.
Kleiner Tipp: Verwende lieber java.util.Random.
???:L
Ich muss wohl dazu sagen, dass wir Zufallszahlen noch nicht in Java hatten, aber gesagt wurde, dass dies hier ganz nützlich wäre.

Dann hab ich noch eine Frage:
Wie soll ich ein Refernzattribut von Computer in Spiel unterbringen und in die Methoden integrieren? Ich muss das Projekt doch erst mal dazu bringen, zu unterscheiden, ob es sich um 2 menschliche Spieler oder um einen menschlichen und einen Computer handelt.
 

njans

Top Contributor
Java:
public class COMPUTER extends SPIELER{
private Random random; 

public COMPUTER(String NeuerName){
  super(NeuerName);
  random = new Random(0);
}

// Du rufst beim Computer eben nicht einfach SpielzugVerarbeiten auf, sondern diese Methode.
public void zufaelligerZug()
{
  // Hier muss was hin
} 
 
}
 

info=)

Mitglied
So hätte ich das jetzt mal gemacht. Geht das so?

Java:
import java.util.Random;
public class COMPUTER extends SPIELER{
private Random random; 
private SPIELFELD spielfeldAktuell;
private COMPUTER computer;
 
public COMPUTER(String NeuerName){
  super(NeuerName);
  NeuerName="Maschine";
  random = new Random(0);
  spielfeldAktuell=new SPIELFELD (this);
}
 
// Du rufst beim Computer eben nicht einfach SpielzugVerarbeiten auf, sondern diese Methode.
public void zufaelligerZug(int random){
    spielfeldAktuell.BelegungAendern(random, SpielsymbolGeben());
    if (!SpielendeTesten()) {
            if (aktuellerSpieler == spieler1) {
                aktuellerSpieler = computer;
            } else {
                aktuellerSpieler = spieler1;
            }
            String neu = aktuellerSpieler.NameGeben();
            System.out.println(neu + " , jetzt bist du dran. Bitte wähle ein neues Feld aus!");
        }
  
} 
 
}

Aber er hängt bei der Zeile [c] spielfeldAktuell=new SPIELFELD (this);[/c].
 

njans

Top Contributor
Hier zeigt sich wieder, dass du nicht verstehst, was du da eigentlich machst. Du kannst nicht einfach ein neues Spielfeld erzeugen und dann davon ausgehen, dass dieses irgendeinen Bezug auf das Spielfeld hat, welches in deiner SPIEL Klasse instanziert wird.
Auch sollte Spieler nichts über Spielfeld wissen. Für eine AI bräuchtest du dieses wissen zwar, aber dieses Programm soll ja wohl eher Naiv bleiben ;)
Java:
private SPIELFELD spielfeldAktuell; // raus damit
private COMPUTER computer; // Du bist in einem Computer Objekt und brauchst keine Referenz auf ein anderes, raus auch damit.

Schau mal in die Spieler Klasse und in die Methode, die du da verwendest, um einen Zug auszuführen und dann überlege dir, wie du diese hier umschreiben musst um einen zufälligen Zug daraus zu machen.
 

timbeau

Gesperrter Benutzer
http://www.java-forum.org/spiele-multimedia-programmierung/135095-tictactoe-bitte-um-feedback.html

Hier habe ich mein TicTacToe mit 3 KIs vorgestellt, der Sourcecode ist auch da drin. Dabei hatte ich auch das Problem, dass ich zwischen manueller und automatischer Eingabe wechseln musste.

Ich würde eine Methode aufrufen, die mir eine Zahl zurück gibt. Nämlich die ID des Spielfeldes. Diese ID wird dann zusammen mit dem Spieler der diese aufruft (besser: der vom Spiel(leiter) als aktiver Spieler geführt wird) ausgeführt indem das korrekte Symbol ins korrekte Feld geschrieben wird.

Was machst du, wenn ein Spaßvogel einen Spieler schreibt, der immer 3 Züge aufeinmal macht?

Java:
public void zufaelligerZug(int random){
    spielfeldAktuell.BelegungAendern(random, SpielsymbolGeben());
    if (!SpielendeTesten()) {
            if (aktuellerSpieler == spieler1) {
                aktuellerSpieler = computer;
            } else {
                aktuellerSpieler = spieler1;
            }
            String neu = aktuellerSpieler.NameGeben();
            System.out.println(neu + " , jetzt bist du dran. Bitte wähle ein neues Feld aus!");
zufaelligerZug(int random) {
.....
}
        }
  
}

Dein Spieler darf nur einen Zug machen, die Möglichkeit dazu muss ihm zentral gegeben werden und er darf nur 1 Wert zurückliefern. Keine Aktionen auf dem Spielfeld. Bei der Randommethode braucht er das Spielfeld noch nichtmal zu kennen.

Java:
public int macheZug(){ //Berechnungen.... hier Random}
 

njans

Top Contributor
Manche Methoden haben eine Vorgegebene Signatur. Ebenfalls sind viele Klassen und Abhängigkeiten vorgegeben. Generell würde ich es ja auch nicht so machen, wie das aktuelle TTT ist, meine Implementation hätte auch kein Problem mit einer oder mehrerer AIs. Diese Struktur schon, da das Spielfeld so abgekapselt ist, dass man als Spieler nicht daran kommt. Und in BlueJay, bitte korrigiert mich hier, würde ich die SpielzugAusführen Methode an einem Spieler Objekt aufrufen.
 

info=)

Mitglied
Habe zufaelligerZug() nochmal überarbeitet:
Java:
import java.util.Random;
public class COMPUTER extends SPIELER{
private Random random; 

public COMPUTER(String NeuerName){
  super(NeuerName);
  NeuerName="Maschine";
  random = new Random(0); 
}

public static int gebeZufallszahl(int low, int high) { 
    int zahl= (int) (Math.random() * (high - low) + low);
    return   zahl;
} 



public void zufaelligerZug(){
   SpielzugAusführen(gebeZufallszahl(0, 9));
     
} 
 
}

Wie kann ich ihn dazu bringen, dass der Computer automatisch zieht?
 

njans

Top Contributor
Wenn er vollkommen automatisch reagieren soll musst du das im SPIEL regeln, dass, wenn der neue Spieler ein Computer ist, er dann automatisch zieht.

// So ist es besser ;)
Java:
public COMPUTER(){
  super("Maschine");
 

info=)

Mitglied
Wenn er vollkommen automatisch reagieren soll musst du das im SPIEL regeln, dass, wenn der neue Spieler ein Computer ist, er dann automatisch zieht.
???:L
An sich ist mir das klar, aber wie soll in SPIEL dann die Bedingung dafür aussehen? Ich müsste ja eigentlich prüfen, ob einer der beiden Spieler ein Objekt vom Typ COMPUTER ist!?
 

njans

Top Contributor
Java:
myObject instanceof COMPUTER

Damit kriegst du heraus, ob es ein Computer ist ;)
 

info=)

Mitglied
Hätte mir Folgendes gedacht, wobei ich mir bei der Umsetzung nicht sicher bin.
Ich ergänze SpielzugVerarbeiten(int feldnummer) in SPIEL durch:
Java:
public void SpielzugVerarbeiten(int feldnummer) {
   if(aktuellerSpieler instance of COMPUTER){
   spielfeld1.BelegungAendern(computer.gebeZufallszahl(0,9), aktuellerSpieler.SpielsymbolGeben());
   }else{       
    spielfeld1.BelegungAendern(feldnummer, aktuellerSpieler.SpielsymbolGeben());
   }
        if (!SpielendeTesten()) {
            if (aktuellerSpieler == spieler1) {
                aktuellerSpieler = spieler2;
            } else {
                aktuellerSpieler = spieler1;
            }
            String neu = aktuellerSpieler.NameGeben();
            System.out.println(neu + " , jetzt bist du dran. Bitte wähle ein neues Feld aus!");
        }
    }

Reicht das, wenn ich computer als Referenzattribut von COMPUTER als Variable bei SPIEL deklariere? Oder kommt dann wieder eine NullPointerException?
 
Zuletzt bearbeitet:

njans

Top Contributor
Java:
spielfeld1.BelegungAendern(((COMPUTER)aktuellerSpieler).gebeZufallszahl(0,9), aktuellerSpieler.SpielsymbolGeben());

Das ist besser, als sich extra eine Referenz zurechtzulegen. Du weißt ja schon, dass der aktuelle Spieler eine Instanz von COMPUTER ist, daher kannst du ihn auch ohne Probleme casten.
 

info=)

Mitglied
Danke.
Jetzt ist das Problem aufgetreten, dass der Computer nach dem Aufruf von SpielzugVerarbeiten(int feldnummer) zwar automatisch zieht, aber erst nachdem ich unabhängig davon eine Zahl eingegeben habe, da ja SpielzugVerarbeiten einen Parameter verlangt.
Habe folgenden Lösungsvorschlag:
Java:
public void ziehen(){
        if(aktuellerSpieler instanceof COMPUTER{
            spielfeld1.BelegungAendern(((COMPUTER)aktuellerSpieler).gebeZufallszahl(0,9), aktuellerSpieler.SpielsymbolGeben());
            if (!SpielendeTesten()) {
            if (aktuellerSpieler == spieler1) {
                aktuellerSpieler = spieler2;
            } else {
                aktuellerSpieler = spieler1;
            }
            String neu = aktuellerSpieler.NameGeben();
            System.out.println(neu + " , jetzt bist du dran. Bitte wähle ein neues Feld aus!");
           }
        }else{
            SpielzugVerarbeiten(int feldnummer);
        }
    }
    
    
    public void SpielzugVerarbeiten(int feldnummer) {
        spielfeld1.BelegungAendern(feldnummer, aktuellerSpieler.SpielsymbolGeben());
        if (!SpielendeTesten()) {
            if (aktuellerSpieler == spieler1) {
                aktuellerSpieler = spieler2;
            } else {
                aktuellerSpieler = spieler1;
            }
            String neu = aktuellerSpieler.NameGeben();
            System.out.println(neu + " , jetzt bist du dran. Bitte wähle ein neues Feld aus!");
        }
    }

Er sagt '.class' expected für die Zeile [c] SpielzugVerarbeiten(int feldnummer); [/c].
Was sollte ich ändern?
 
Zuletzt bearbeitet:

njans

Top Contributor
Hast du den ganzen Kram in einer Klassse stehen:

Java:
public class ClassName{
  // Methode
}
 

AquaBall

Top Contributor
[OT]Wir helfen gerne.
Aber ich hab mich längst rausgeklinkt.
Ist doch mühsam jede Zeile 3 mal erklären müssen und dann wird sie noch nicht richtig eingebaut.
[/OT]

@TO:
Ich empfehle dir erstmal ein Buch zu lesen, und mit Projektgrößen zu arbeiten die du verstehst.
 

info=)

Mitglied
Da wir alle erst in diesem Schuljahr in Java/BlueJ eingeführt wurden und noch ziemliche Anfänger sind,
blickt bei uns keiner bei dem Projekt wirklich durch, aber die anderen lassen es sich halt von irgenwelchen Vätern/Freunden im LK schreiben und geben es ab, ohne es überhaupt mal angeschaut zu haben. Wir 'ohne connections' haben da schon fast keine Chance mehr, deshalb bin ich wirklich auf Euch angewiesen.
Glaubst du wirklich, irgendwer von uns hätte ein so großes Projekt gewählt, wenn wir wirklich die Wahl gehabt hätten?
Und bei dem kurzfristig angesetzten Termin bleibt zum Einlesen eigentlich keine Zeit mehr.
Im Unterricht bin ich immer gut mitgekommen, aber das Projekt ist viel anspruchsvoller als alles, was wir bisher programmieren mussten und da hier offensichtlich häufig Dinge anzuwenden sind, die wir in der Schule noch nie angesprochen haben, werde ich es als Anfänger wohl kaum sofort verstehen und richtig umsetzen.

@ njans
Vielleicht habe ich ja was falsch gemacht, aber selbst wenn ich das in eine Klase schreibe, kommt die Fehlermeldung immer noch.
 

info=)

Mitglied
Java:
    public class ZUG{
    public void ziehen(){
        if(aktuellerSpieler instanceof COMPUTER){
            spielfeld1.BelegungAendern(((COMPUTER)aktuellerSpieler).gebeZufallszahl(0,9), aktuellerSpieler.SpielsymbolGeben());
            if (!SpielendeTesten()) {
            if (aktuellerSpieler == spieler1) {
                aktuellerSpieler = spieler2;
            } else {
                aktuellerSpieler = spieler1;
            }
            String neu = aktuellerSpieler.NameGeben();
            System.out.println(neu + " , jetzt bist du dran. Bitte wähle ein neues Feld aus!");
           }
        }else{
            SpielzugVerarbeiten(int feldnummer);
        }
    }
}

Hab einfach ziehen() aus SPIEL in ZUG. Wir sind im Unterricht noch nicht so weit, also verzeiht mir die Frage: Warum brauche ich dafür jetzt eine neue Klasse?



ps: Soll ich den Rest der SPIEL-Klasse auch posten?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
H TicTacToe Fehler beim Compilieren Java Basics - Anfänger-Themen 7
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
Z Sikuli Thread Fehler Java Basics - Anfänger-Themen 3
hubmar Fehler beim mp4-datei aufrufen, nach dem zweiten aufruf Java Basics - Anfänger-Themen 1
Z Artifacts IntelliJ Fehler Java Basics - Anfänger-Themen 10
L Beginner-Fehler Java Basics - Anfänger-Themen 2
G FileChannel (inChannel/outChanel) Fehler wenn Leerzeichen enthalten Java Basics - Anfänger-Themen 17
F Kann mir jemand bei dem Fehler helfen? Java Basics - Anfänger-Themen 6
Juelin jedit Fehler beim starten Java Basics - Anfänger-Themen 2
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
E Matrizenmultiplikation Fehler Java Basics - Anfänger-Themen 0
Z Fehler Zeiterfassungsprogramm Anzeige Java Basics - Anfänger-Themen 3
C SwingWorker mit Fehler Java Basics - Anfänger-Themen 2
monsterherz Fehler Semikolon fehlt - ich weiss aber nicht wo da noch eines hin sollte... Java Basics - Anfänger-Themen 21
G Compiler-Fehler Fehler in Zeile 1 beheben, wie? Java Basics - Anfänger-Themen 9
W Fehler in der Datei pom.xml Java Basics - Anfänger-Themen 19
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
monsterherz if / else if mit Fehler den ich leider nicht finde Java Basics - Anfänger-Themen 11
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
ohneInformatik; Dynamische Zinsen. Wo liegt der Fehler? Java Basics - Anfänger-Themen 4
Fiedelbambu deriveFont Fehler wer kann Helfen? Java Basics - Anfänger-Themen 4
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
Lion.King Fehler in double und int Java Basics - Anfänger-Themen 7
H BlueJ: was genau ist hier der Fehler? Java Basics - Anfänger-Themen 14
berserkerdq2 Habe ein Spiel entwickelt, dass immer in der 4 Runde einen cast-Fehler erhält Java Basics - Anfänger-Themen 3
D Datentypen LocalDate.parse() ergibt Fehler Java Basics - Anfänger-Themen 5
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
N Fehler "Cannot instantiate the type" Java Basics - Anfänger-Themen 3
L Ich weis nicht was der Fehler ist! Java Basics - Anfänger-Themen 14
L30nS JNI Fehler, JRE und JDK Java Basics - Anfänger-Themen 8
E Executable jar file fehler Java Basics - Anfänger-Themen 9
S Fehler beim Programm Java Basics - Anfänger-Themen 2
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
J Syntax-Fehler? Java Basics - Anfänger-Themen 2
Jose05 Fehler im Programm feststellen Java Basics - Anfänger-Themen 2
S Methoden 2 non-static Methoden, trotzdem Fehler "non static method can not be referenced from a static context" Java Basics - Anfänger-Themen 9
G Taschenrechner ergibt Fehler in if-Abfrage Java Basics - Anfänger-Themen 6
I Fehler bei for-Schleife Java Basics - Anfänger-Themen 6
lol5443 Tic Tac Toe Fehler Java Basics - Anfänger-Themen 5
K Fehler bei der Implementierung Java Basics - Anfänger-Themen 6
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
W Verschachtelte If-else --> finde meinen Fehler nicht Java Basics - Anfänger-Themen 30
J Fehler bei array aus anderer Klasse Java Basics - Anfänger-Themen 3
H Fehler bei integer Division Java Basics - Anfänger-Themen 28
C Fehler beim erstellen eines Objektes Java Basics - Anfänger-Themen 3
N Was bedeutet dieser Fehler Java Basics - Anfänger-Themen 2
fuerteb Compiler-Fehler Methode wird nicht bzw. als Fehler erkannt Java Basics - Anfänger-Themen 4
Lion.King Fehler Java Basics - Anfänger-Themen 5
AlexG. Nullpointer exeption Fehler Java Basics - Anfänger-Themen 0
C Fehler im Code Java Basics - Anfänger-Themen 10
J Anfänger, Fehler; "Der Hund liegt begraben" Java Basics - Anfänger-Themen 3
Aqtox Hallo ich muss für die Schule ein Wuerfell Duell erstellen jedoch habe ich ein fehler Java Basics - Anfänger-Themen 4
V Wer findet den Fehler :) Java Basics - Anfänger-Themen 12
B ArrayIndexOutOfBoundsException, ich finde den Fehler nicht? Java Basics - Anfänger-Themen 10
A Compiler Fehler - not a statement Java Basics - Anfänger-Themen 2
Arita welche Fehler gibt es noch? wie kann ich es noch vervollständigen Java Basics - Anfänger-Themen 15
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
H Logik Fehler erkennen Java Basics - Anfänger-Themen 21
T Fehler in Caesar-Chiffre Java Basics - Anfänger-Themen 7
R Fehlermeldung aber WO liegt der Fehler? Java Basics - Anfänger-Themen 7
B Nicht reproduzierbarer Fehler bei Kompilierung - Shortcut "Bereinigung" Compiler ? Java Basics - Anfänger-Themen 4
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
pumpgun99 Fehler Meldung "else without if" Java Basics - Anfänger-Themen 3
P Was bedeutet dieser Fehler? Java Basics - Anfänger-Themen 31
KogoroMori21 Java Datum Differenz (kleiner Fehler) Java Basics - Anfänger-Themen 10
N java.util.InputMismatchException Fehler Java Scanner Java Basics - Anfänger-Themen 5
H Fehler: NullPointerException und ich weiß net warum Java Basics - Anfänger-Themen 4
R Ich sehe meinen fehler nicht Java Basics - Anfänger-Themen 8
Johannes_ece Fehler: Application Terminated (TypeError): var$0.$moveToolTo is not a function Java Basics - Anfänger-Themen 4
GermanPie Fehler in Putty (kein Hauptmanifestattribut, in jar) Java Basics - Anfänger-Themen 4
M Scannen von *.txt - Dateien; wo sind der oder die Fehler? Java Basics - Anfänger-Themen 4
P Methoden aufrufen - Fehler Java Basics - Anfänger-Themen 20
JavaClap "Bruchrechner" liefert Fehler/keine Ausgabe bei Addition und Subtraktion Java Basics - Anfänger-Themen 0
B if Clause Fehler Java Basics - Anfänger-Themen 2
G Fibonacci Zahlenreihe Fehler Java Basics - Anfänger-Themen 4
A Fehler beim Ausführen einer class Datei Java Basics - Anfänger-Themen 6
B Fehler, aber ich weiß nicht warum Java Basics - Anfänger-Themen 3
C system cannot be resolved Fehler in Eclipse Java Basics - Anfänger-Themen 18
J Fehler im Code, aber ich weiß nicht wieso! Java Basics - Anfänger-Themen 6
M Compiler-Fehler Fehler beim Ausführen des Codes Java Basics - Anfänger-Themen 25
M While-Schleifen-Fehler Java Basics - Anfänger-Themen 4
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
C Projekte in 2 versch. Arbeitsbereichen: auf ein Projekt verweisen (ohne Fehler zu bekommen) Java Basics - Anfänger-Themen 8
R Java SQL Fehler! Java Basics - Anfänger-Themen 4
L non-static Fehler Java Basics - Anfänger-Themen 16
C Fehler beim Speichern (Build projekt) Java Basics - Anfänger-Themen 42
L Methoden Wie Löse ich ext Methoden Aufruf Fehler? Java Basics - Anfänger-Themen 3
F Methoden Bitte Helft mir meinen Fehler zu finden. Möchte in diesem Bankenprogramm durch die Konsoleneingabe auswählen welches Konto reduziert und welches erhö Java Basics - Anfänger-Themen 17
C Fehler bei der Compilierung Java Basics - Anfänger-Themen 1
T Mein Programm hat Fehler Java Basics - Anfänger-Themen 4
S Warum dieser Fehler? Java Basics - Anfänger-Themen 1
B Fehler bei Ausführung Java Basics - Anfänger-Themen 5
Kirby.exe Fehler beim Ausgeben Java Basics - Anfänger-Themen 2
X java.lang.NullPointerException fehler ? Java Basics - Anfänger-Themen 1
L Wo ist der Fehler? Java Basics - Anfänger-Themen 87
J Fehler in Programm: Index -1 out of bounds for length 0 Java Basics - Anfänger-Themen 5

Ähnliche Java Themen


Oben