Schachbrett

  • Themenstarter Themenstarter Bata
  • Beginndatum Beginndatum
B

Bata

Gast
Hallo,

habe mit java ein schachfeld implementiert:

Java:
public class Feld extends Applet {

   final int x = 50;
   final int y = 50;


   public void paint (Graphics g) {
      g.setColor(Color.BLACK);
      g.fillRect(x-2,y-2,164,164);
      g.setColor(Color.WHITE);
      for (int i=0; i<4; i++)
         for (int j=0; j<4; j++)
             g.fillRect(x+j*40,y+i*40, 20,20);
      for (int i=0; i<4; i++)
         for (int j=0; j<4; j++)
             g.fillRect(x+20+j*40,y+20+i*40, 20,20);
   }
}

Funktioniert auch alles wunderbar, nur ich soll auch in jedes feld von links oben beginnend nach rechts oben a-h und von links oben nach links unten 8-1 in die Felder abwechselnd weiß schwarz schreiben lassen. Steh im moment irgendwie auf dem Schlauch.
 
ich würde etwa folgendes machen:
Java:
g.fillRect(...); // hintergrundfarbe
for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
        g.setColor(x % 2 - y % 2 == 0 ? Color.WHITE : Color.BLACK);
        g.fillRect(...); // hier das jeweilige feld zeichnen
    }
}
 
ich würde etwa folgendes machen:
Java:
g.fillRect(...); // hintergrundfarbe
for (int x = 0; x < 8; x++) {
    for (int y = 0; y < 8; y++) {
        g.setColor(x % 2 - y % 2 == 0 ? Color.WHITE : Color.BLACK);
        g.fillRect(...); // hier das jeweilige feld zeichnen
    }
}

irgendwie krieg ichs net hin. Das Brett wird immer falsch dargestellt 🙁
 
ich klink mich hier mal ein

ich hab wie ein anderer user folgendes problem

Hallo alle zusammen:

ich häng hier wiedermal bei der Fehlersuche :rtfm:

Bei den Spalten zählt das Applet nicht, wie geplant, runter.
Wenn jemand Zeit hat hier die Codes:


Java:
import java.awt.*;


public class Feld {
	private String name;
	private Color farbe;


	public Feld (String name, Color farbe){
		this.name=name;
		this.farbe=farbe;
	
	}
	public void zeichne (Graphics g, int x, int y, int gro){
		if (g.getColor() == Color.black){
			g.setColor(Color.black);
			g.fillRect(x, y, gro, gro);
			g.setColor(Color.white);
			g.drawString(name, x, y);
		} else {
			g.setColor(Color.white);
			g.fillRect(x, y, gro, gro);
			g.setColor(Color.black);
			g.drawString(name, x, y);
		}
		
	}

}

Java:
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JApplet;

public class SchachbrettApplet extends JApplet {

	private final int RAND = 20;
	private final int groesse = 50;
	public Feld[][] Referenzen;
	public char[] Buchstaben = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };

	public void init() {
		Referenzen = new Feld[8][8];
		this.setSize(2 * RAND + 8 * groesse, 2 * RAND + 8 * groesse);

		for (int a = 0; a < 8; a++) {
			for (int b = 7; b >= 0; b--) {
	
				int ascii = Buchstaben[a];
				

				if ((ascii + b) % 2 == 1) {
					Referenzen[a][b] = new Feld("" + Buchstaben[a] + b+1,Color.WHITE);
				} else {
					Referenzen[a][b] = new Feld("" + Buchstaben[a] + b+1,Color.BLACK);
				}
				
			}
		}

	}

	public void paint(Graphics g) {

		for (int i = 0; i < 8; i++) {
			for (int j = 7; j >= 0; j--) {

				int posX = groesse * i;
				int posY = groesse * j+1;

				Referenzen[i][j].zeichne(g, posX+RAND, posY+RAND, groesse);
			}
		}
	}

}

Gruss Vitali

vll kann hier noch jemand weiterhelfen ... geht um die gleiche aufgabenstellung
 
Hab nun den Code im ersten Posting von dir getestet und sehe kein Problem. Was passt dir nicht?
Hier trotzdem noch der komplette Code meines Lösungsvorschlag:
Java:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class Foo extends Applet {

    private static final long serialVersionUID = 1L;
    private static final int LENGTH = 20;
    private static final int BOARDER = 2;
    private static final int SIZE = 8;
    private static final int X = 0;
    private static final int Y = 0;

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(X, Y, SIZE * LENGTH + 2 * BOARDER, SIZE * LENGTH + 2 * BOARDER);
        for (int x = 0; x < SIZE; x++) {
            for (int y = 0; y < SIZE; y++) {
                g.setColor(x % 2 - y % 2 == 0 ? Color.WHITE : Color.BLACK);
                g.fillRect(X + BOARDER + x * LENGTH, Y + BOARDER + y * LENGTH, LENGTH, LENGTH);
            }
        }
    }
}
 
Hab nun den Code im ersten Posting von dir getestet und sehe kein Problem. Was passt dir nicht?
Hier trotzdem noch der komplette Code meines Lösungsvorschlag:
Java:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class Foo extends Applet {

    private static final long serialVersionUID = 1L;
    private static final int LENGTH = 20;
    private static final int BOARDER = 2;
    private static final int SIZE = 8;
    private static final int X = 0;
    private static final int Y = 0;

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(X, Y, SIZE * LENGTH + 2 * BOARDER, SIZE * LENGTH + 2 * BOARDER);
        for (int x = 0; x < SIZE; x++) {
            for (int y = 0; y < SIZE; y++) {
                g.setColor(x % 2 - y % 2 == 0 ? Color.WHITE : Color.BLACK);
                g.fillRect(X + BOARDER + x * LENGTH, Y + BOARDER + y * LENGTH, LENGTH, LENGTH);
            }
        }
    }
}

Das Problem ist das ich nicht weiß wie ich die Buchstabenzahlenkombination in die Felder bekomme (abwechselnd schwarz und weiß) 🙁
 
Ach so. Wenn du's schön zentriert haben willst wieder mein Vorschlag:
Java:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class Foo extends Applet {

    private static final long serialVersionUID = 1L;
    private static final int  LENGTH = 20;
    private static final int  BOARDER = 2;
    private static final int  SIZE = 8;
    private static final int  X = 20;
    private static final int  Y = 20;
    private static final char START_X = 'A';
    private static final char START_Y = '1';

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(X, Y, SIZE * LENGTH + 2 * BOARDER, SIZE * LENGTH + 2 * BOARDER);
        int fontSize = g.getFont().getSize();
        for (int x = 0; x < SIZE; x++) {
            int localX = X + BOARDER + x * LENGTH;
            for (int y = 0; y < SIZE; y++) {
                boolean isWhite = x % 2 - y % 2 == 0;
                int localY = Y + BOARDER + y * LENGTH;
                g.setColor(isWhite ? Color.WHITE : Color.BLACK);
                g.fillRect(localX, localY, LENGTH, LENGTH);
                char[] data = new char[] {(char) (START_X + x), (char) (START_Y + y)};
                int fontWidth = g.getFontMetrics().charsWidth(data, 0, data.length);
                g.setColor(isWhite ? Color.BLACK : Color.WHITE);
                g.drawChars(data, 0, data.length, localX + (LENGTH - fontWidth) / 2, localY + LENGTH
                        - (LENGTH - fontSize) / 2);
            }
        }
    }
}
 
Ach so. Wenn du's schön zentriert haben willst wieder mein Vorschlag:
Java:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class Foo extends Applet {

    private static final long serialVersionUID = 1L;
    private static final int  LENGTH = 20;
    private static final int  BOARDER = 2;
    private static final int  SIZE = 8;
    private static final int  X = 20;
    private static final int  Y = 20;
    private static final char START_X = 'A';
    private static final char START_Y = '1';

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(X, Y, SIZE * LENGTH + 2 * BOARDER, SIZE * LENGTH + 2 * BOARDER);
        int fontSize = g.getFont().getSize();
        for (int x = 0; x < SIZE; x++) {
            int localX = X + BOARDER + x * LENGTH;
            for (int y = 0; y < SIZE; y++) {
                boolean isWhite = x % 2 - y % 2 == 0;
                int localY = Y + BOARDER + y * LENGTH;
                g.setColor(isWhite ? Color.WHITE : Color.BLACK);
                g.fillRect(localX, localY, LENGTH, LENGTH);
                char[] data = new char[] {(char) (START_X + x), (char) (START_Y + y)};
                int fontWidth = g.getFontMetrics().charsWidth(data, 0, data.length);
                g.setColor(isWhite ? Color.BLACK : Color.WHITE);
                g.drawChars(data, 0, data.length, localX + (LENGTH - fontWidth) / 2, localY + LENGTH
                        - (LENGTH - fontSize) / 2);
            }
        }
    }
}

klasse! vielen dank. Wie tausche ich die Reihenfolge der zahlen,d.h. ich beginne oben links bei A8 statt A1
 
Also, da muss ich mich jetzt auch javimka anschliessen. Nach dem Code des ersten Postings von dir bin ich davon ausgegangen, dass Grundwissen und Eigeninitiative vorhanden ist. Diese Anpassung wirst du mit 5min Code-Analyse machen können, sofern die Eigeninitiative vorhanden ist.
 
Ok ich hab auch noch am programm rumgezimmert und jetzt gehts:

😳 Aber es lässt sich nicht in (Schachbrett) Zeile 22 Invertieren woran liegt dass???

Java:
import java.awt.*;

public class Feld {
	private String name;
	private Color farbe;

	int RAND_X = 20;
	int RAND_Y = RAND_X + 10;

	public Feld(String name, Color farbe) {
		this.name = name;
		this.farbe = farbe;

	}

	public void zeichne(Graphics g, int x, int y, int gro) {
		if (g.getColor() == Color.black) {
			g.setColor(Color.black);
			g.fillRect(x, y, gro, gro);
			g.setColor(Color.white);
			g.drawString(name, x + RAND_X, y + RAND_Y);
		} else {
			g.setColor(Color.white);
			g.fillRect(x, y, gro, gro);
			g.setColor(Color.black);
			g.drawString(name, x + RAND_X, y + RAND_Y);
		}

	}

}

Java:
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JApplet;

public class SchachbrettApplet extends JApplet {

	private final int RAND = 20;
	private final int groesse = 50;
	public Feld[][] Referenzen;
	public char[] Buchstaben = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };

	public void init() {
		Referenzen = new Feld[8][8];
		this.setSize(2 * RAND + 8 * groesse, 2 * RAND + 8 * groesse);

		for (int a = 0; a < 8; a++) {
			for (int b = 7; b >= 0; b--) {

				int ascii = Buchstaben[a];

				if ((ascii + b) % 2 == 1) {
					Referenzen[a][b] = new Feld("" + Buchstaben[a]
							+ -(((b + a) % 8) - 8), Color.WHITE);
				} else {
					Referenzen[a][b] = new Feld("" + Buchstaben[a]
							+ -(((b + a) % 8) - 8), Color.BLACK);
				}
			}
		}

	}

	public void paint(Graphics g) {

		for (int i = 0; i < 8; i++) {
			for (int j = 7; j >= 0; j--) {

				int posX = groesse * i;
				int posY = groesse * ((j + i) % 8);

				Referenzen[i][j].zeichne(g, posX + RAND, posY + RAND, groesse);
			}
		}
	}

}
 
Es würde bestimmt mehr passieren, wenn du in der Methode Zeichnen() in der If-Abfrage nicht g.getColor verwenden würdest, sondern das Attribut farbe aus der Klasse. Überhaupt hast du das ja gar nicht verwendet ???:L

Ausserdem habe ich mal alle deine Variabeln gemäss Konvention geschrieben. Finale Variabeln Gross, alle anderen klein.

Java:
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JApplet;
 
public class SchachbrettApplet extends JApplet {
 
    private final int RAND = 20;
    private final int GROESSE = 50;
    public Feld[][] referenzen;
    public final char[] BUCHSTABEN = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };
 
    public void init() {
        referenzen = new Feld[8][8];
        this.setSize(2 * RAND + 8 * GROESSE, 2 * RAND + 8 * GROESSE);
 
        for (int i=0;i<8;i++) {
            for (int j=0;j<8;j++) {
 
            	if ((i+j)%2==0) {
            		referenzen[i][j] = new Feld(""+BUCHSTABEN[i]+(8-j),Color.BLACK);
            	} else {
            		referenzen[i][j] = new Feld(""+BUCHSTABEN[i]+(8-j),Color.WHITE);
            	}
            }
        }
    }
 
    public void paint(Graphics g) {
 
        for (int i=0;i<8;i++) {
            for (int j=0;j<8;j++) {
            	
                int posX = GROESSE * i;
                int posY = GROESSE * j;
 
                referenzen[i][j].zeichne(g, posX + RAND, posY + RAND, GROESSE);
            }
        }
    }
 
    public class Feld {
        private String name;
        private Color farbe;
     
        int RAND_X = 20;
        int RAND_Y = RAND_X + 10;
     
        public Feld(String name, Color farbe) {
            this.name = name;
            this.farbe = farbe;
     
        }
     
        public void zeichne(Graphics g, int x, int y, int gro) {
            if (farbe == Color.black) {
                g.setColor(Color.black);
                g.fillRect(x, y, gro, gro);
                g.setColor(Color.white);
                g.drawString(name, x + RAND_X, y + RAND_Y);
            } else {
                g.setColor(Color.white);
                g.fillRect(x, y, gro, gro);
                g.setColor(Color.black);
                g.drawString(name, x + RAND_X, y + RAND_Y);
            }
        }
    }
}
 
Viel wichtiger als die Punkte wäre es, wenn du verstehen würdest, was passiert und wo und wieso ich deine Lösung umgeschrieben habe.
 

Zurück
Oben