import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.TextArea;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Schach extends JPanel implements MouseListener, ActionListener {
private Image Bild[];
static final int Schwarz = 0;
static final int Weiß = 1;
static final int Leer = -1;
static final int BauerS = 0;
static final int TurmS = 1;
static final int SpringerS = 2;
static final int LaeuferS = 3;
static final int DameS = 4;
static final int KoenigS = 5;
static final int BauerW = 6;
static final int TurmW = 7;
static final int SpringerW = 8;
static final int LaeuferW = 9;
static final int DameW = 10;
static final int KoenigW = 11;
int Brett[][];
int AktiveFigur[] = { -1, -1 };
// Welcher Spieler soll beginnen?
int nPlayer = Weiß;
JFrame applikation;
Container container;
// Menüleiste
JMenuBar menueLeiste;
// Menüleiste Elemente
JMenu datei;
JMenu spielmodus;
JMenu hilfe;
// Datei
JMenuItem neuesSpiel;
JMenuItem beenden;
// Spielmodus
JMenuItem vsMensch;
JMenuItem vsComputer;
// Hilfe
JMenuItem anleitung;
JMenuItem spielregeln;
JTextArea textArea = new JTextArea();
private Image offScrImage;
public Schach() {
applikation = new JFrame("Schach");
container = applikation.getContentPane();
// Menüleiste erzeugen
menueLeiste = new JMenuBar();
// Menüelemente erzeugen
datei = new JMenu("Datei");
spielmodus = new JMenu("Spielmodus");
hilfe = new JMenu("Hilfe");
// Untermenüelemente erzeugen
neuesSpiel = new JMenuItem("Neues Spiel");
neuesSpiel.addActionListener(this);
beenden = new JMenuItem("Beenden");
beenden.addActionListener(this);
anleitung = new JMenuItem("Anleitung");
anleitung.addActionListener(this);
spielregeln = new JMenuItem("Spielregeln");
spielregeln.addActionListener(this);
vsComputer = new JMenuItem("vs. Computer");
vsComputer.addActionListener(this);
vsMensch = new JMenuItem("vs. Mensch");
vsMensch.addActionListener(this);
// Menüelemente hinzufügen
menueLeiste.add(datei);
menueLeiste.add(hilfe);
menueLeiste.add(spielmodus);
// Untermenüelemente hinzufügen
datei.add(neuesSpiel);
datei.add(beenden);
hilfe.add(anleitung);
hilfe.add(spielregeln);
spielmodus.add(vsMensch);
spielmodus.add(vsComputer);
// NEW
applikation.setJMenuBar(menueLeiste);
init();
applikation.setSize(new Dimension(600, 600));
applikation.add(this);
applikation.setVisible(true);
}
private void pack() {
// TODO Auto-generated method stub
}
// NEW
// Bilder werden mit dem Toolkit erzeugt!!
public void init() {
Bild = new Image[12];
Bild[BauerS] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/BauerS.gif")));
Bild[TurmS] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/TurmS.gif")));
Bild[SpringerS] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/SpringerS.gif")));
Bild[LaeuferS] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/LaeuferS.gif")));
Bild[DameS] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/DameS.gif")));
Bild[KoenigS] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/KoenigS.gif")));
Bild[BauerW] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/BauerW.gif")));
Bild[TurmW] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/TurmW.gif")));
Bild[SpringerW] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/SpringerW.gif")));
Bild[LaeuferW] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/LaeuferW.gif")));
Bild[DameW] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/DameW.gif")));
Bild[KoenigW] = Toolkit.getDefaultToolkit().getImage(
(getClass().getResource("bilder/KoenigW.gif")));
// Erstelle Brett mit 8 x 8 = 64 Feldern
Brett = new int[8][8];
for (int i = 0; i < 8; ++i)
for (int j = 0; j < 8; ++j)
// alle Felder sind am Anfang leer...
Brett[i][j] = Leer;
// bis auf:
Brett[0][0] = TurmS; // schwarze Spielfiguren
Brett[0][1] = SpringerS;
Brett[0][2] = LaeuferS;
Brett[0][4] = DameS;
Brett[0][3] = KoenigS;
Brett[0][5] = LaeuferS;
Brett[0][6] = SpringerS;
Brett[0][7] = TurmS;
Brett[1][0] = BauerS;
Brett[1][1] = BauerS;
Brett[1][2] = BauerS;
Brett[1][3] = BauerS;
Brett[1][4] = BauerS;
Brett[1][5] = BauerS;
Brett[1][6] = BauerS;
Brett[1][7] = BauerS;
Brett[7][0] = TurmW; //weiße Spielfiguren
Brett[7][1] = SpringerW;
Brett[7][2] = LaeuferW;
Brett[7][4] = DameW;
Brett[7][3] = KoenigW;
Brett[7][5] = LaeuferW;
Brett[7][6] = SpringerW;
Brett[7][7] = TurmW;
Brett[6][0] = BauerW;
Brett[6][1] = BauerW;
Brett[6][2] = BauerW;
Brett[6][3] = BauerW;
Brett[6][4] = BauerW;
Brett[6][5] = BauerW;
Brett[6][6] = BauerW;
Brett[6][7] = BauerW;
addMouseListener(this);
}
//
public void paintComponent(Graphics g) {
Dimension d = getSize();
offScrImage = createImage(d.width, d.height);
Graphics og = offScrImage.getGraphics();
int xoff = d.width / 8;
int yoff = d.height / 8;
/*
* Zeichnet Muster der schwarzen/weißen Quadrate, je nachdem, ob der
* Spieler schwarz oder weiß ist
*/
for (int c = 0; c < 8; ++c) {
for (int r = 0; r < 8; ++r) {
if ((c + r) % 2 == 0) {
og.setColor(Color.gray);
} else {
og.setColor(Color.white);
}
og.fillRect(xoff * c, yoff * r, xoff, yoff);
/* Zeichne jedes Bild auf Brett */
int nPiece = Brett[r][ c];
if (nPiece >= 0) {
og.drawImage(Bild[nPiece], c * xoff, r * yoff, this);
}
}
}
/* Zeichne Markierung um die aktive Spielfigur */
if (AktiveFigur[0] >= 0) {
if (nPlayer == Weiß)
og.setColor(Color.red);
else
og.setColor(Color.blue);
og.drawRect(xoff * AktiveFigur[0], yoff * AktiveFigur[1], xoff,
yoff);
og.drawRect(xoff * AktiveFigur[0] - 1, yoff * AktiveFigur[1] - 1,
xoff + 2, yoff + 2);
}
g.drawImage(offScrImage, 0, 0, this.getWidth(), this.getHeight(), this);
}
public Dimension getPreferredSize() {
return new Dimension(offScrImage.getWidth(this), offScrImage.getHeight(this));
}
boolean pruefeZugGerade(int c1, int r1, int c2, int r2) {
boolean bOK = false;
int nPiece = Brett[r1][c1];
int nPType = nPiece % 6;
int ZerstoereFigur = Brett[r2][c2];
int nDestPType = ZerstoereFigur % 6;
if (c1 == c2 && r1 != r2) {
int rd;
if (r1 < r2)
rd = 1;
else
rd = -1;
bOK = true;
for (int r = r1 + rd; r != r2; r += rd) {
if (Brett[r][c1] != -1) {
bOK = false;
break;
}
}
} else if (r1 == r2 && c1 != c2) {
int cd;
if (c1 < c2)
cd = 1;
else
cd = -1;
bOK = true;
for (int c = c1 + cd; c != c2; c += cd) {
if (Brett[r1][ c] != -1) {
bOK = false;
break;
}
}
}
return bOK;
}
boolean pruefeZugDiagonal(int c1, int r1, int c2, int r2) {
boolean bOK = false;
int nPiece = Brett[r1][c1];
int nPType = nPiece % 6;
int ZerstoereFigur = Brett[r2][c2];
int nDestPType = ZerstoereFigur % 6;
if ((c1 + r1) % 2 == 0 && (c2 + r2) % 2 == 0) {
if (c1 + r1 == c2 + r2) {
bOK = true;
} else if (c1 - r1 == c2 - r2) {
bOK = true;
}
} else if ((c1 + r1) % 2 == 1 && (c2 + r2) % 2 == 1) {
if (c1 + r1 == c2 + r2) {
bOK = true;
} else if (c1 - r1 == c2 - r2) {
bOK = true;
}
}
if (bOK) {
int cd;
if (c1 < c2)
cd = 1;
else
cd = -1;
int rd;
if (r1 < r2)
rd = 1;
else
rd = -1;
int r = r1 + rd;
int c = c1 + cd;
for (; c != c2; r += rd, c += cd) {
if (Brett[r][ c] != -1) {
bOK = false;
break;
}
}
}
return bOK;
}
boolean pruefeZug(int c1, int r1, int c2, int r2) {
if (c1 == c2 && r1 == r2)
return false;
boolean bOK = false;
int nPiece = Brett[r1][c1];
int nPType = nPiece % 6;
int ZerstoereFigur = Brett[r2][c2];
int nDestPType = ZerstoereFigur % 6;
switch (nPType) {
case BauerS:
if (nPiece < 6) {
if (c1 == c2) {
if (r1 == r2 - 1) {
if (ZerstoereFigur == -1)
bOK = true;
} else if (r1 == r2 - 2 && r1 == 1) {
if (Brett[r2 - 1][c1] == -1)
bOK = true;
}
} else if (c1 == c2 + 1 || c1 == c2 - 1) {
if (r1 == r2 - 1) {
if (ZerstoereFigur != -1 && ZerstoereFigur > 5)
bOK = true;
}
}
} else {
if (c1 == c2) {
if (r1 == r2 + 1) {
if (ZerstoereFigur == -1)
bOK = true;
} else if (r1 == r2 + 2 && r1 == 6) {
if (Brett[r2 + 1][c1] == -1)
bOK = true;
}
} else if (c1 == c2 + 1 || c1 == c2 - 1) {
if (r1 == r2 + 1) {
if (ZerstoereFigur != -1 && ZerstoereFigur < 6)
bOK = true;
}
}
}
break;
case TurmS:
bOK = pruefeZugGerade(c1, r1, c2, r2);
break;
case SpringerS:
if (r1 == r2 - 2 || r1 == r2 + 2) {
if (c1 == c2 - 1 || c1 == c2 + 1) {
bOK = true;
}
} else if (c1 == c2 - 2 || c1 == c2 + 2) {
if (r1 == r2 - 1 || r1 == r2 + 1) {
bOK = true;
}
}
break;
case LaeuferS:
bOK = pruefeZugDiagonal(c1, r1, c2, r2);
break;
case DameS:
bOK = pruefeZugGerade(c1, r1, c2, r2);
if (bOK == false)
bOK = pruefeZugDiagonal(c1, r1, c2, r2);
break;
case KoenigS:
if (Math.abs(r1 - r2) < 2 && Math.abs(c1 - c2) < 2
&& (Math.abs(r1 - r2) != 0 || Math.abs(c1 - c2) != 0))
bOK = true;
break;
default:
break;
}
if (bOK == true) {
if (nPiece < 6 && (ZerstoereFigur == -1 || ZerstoereFigur > 5))
bOK = true;
else if (nPiece > 5 && (ZerstoereFigur == -1 || ZerstoereFigur < 6))
bOK = true;
else
bOK = false;
}
return bOK;
}
public void mouseClicked(MouseEvent e) {
if (AktiveFigur[0] >= 0) {
int x = e.getX();
int y = e.getY();
// Finde die Spalte und Reihe heraus
Dimension d = getSize();
int c = (int) ((x * 8) / d.width);
int r = (int) ((y * 8) / d.height);
if (c < 0 || c > 7)
return;
if (r < 0 || r > 7)
return;
if (pruefeZug(AktiveFigur[0], AktiveFigur[1], c, r)) {
Brett[r][ c] = Brett[AktiveFigur[1]][AktiveFigur[0]];
Brett[AktiveFigur[1]][AktiveFigur[0]] = -1;
nPlayer = (nPlayer + 1) % 2;
}
AktiveFigur[0] = -1;
AktiveFigur[1] = -1;
} else {
int x = e.getX();
int y = e.getY();
// Finde die Spalte und Reihe heraus
Dimension d = getSize();
int c = (int) ((x * 8) / d.width);
int r = (int) ((y * 8) / d.height);
if (c < 0 || c > 7)
return;
if (r < 0 || r > 7)
return;
// Prüfe, ob da was liegt
// Wenn ja, mache daraus ein aktives Feld
if (Brett[r][ c] != -1) {
// Prüfe, welcher Spieler dran ist
if ((Brett[r][ c] < 6 && nPlayer == 0)
|| (Brett[r][ c] > 5 && nPlayer == 1)) {
AktiveFigur[0] = c;
AktiveFigur[1] = r;
}
}
}
repaint();
}
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == neuesSpiel){
applikation.validate();
}
if (e.getSource() == beenden){
System.exit(0);
}
if (e.getSource() == anleitung){
System.out.println("Anleitung wurde angeklickt");
}
if (e.getSource() == spielregeln){
//hier soll der Text von Spielregeln.txt in einem Fenster erscheinen
JTextArea textArea = new JTextArea();
try {
textArea.read(new FileReader("C:/Dokumente und Einstellungen/fschwarz/Desktop/Projekt/Schachregeln.txt"), "");
} catch (Exception e) {
e.printStackTrace();
}
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(320, 240));
add(scrollPane);
pack();
scrollPane.setVisible(false);
textArea.setVisible(false);
}
if (e.getSource() == vsMensch){
System.out.println("vsMensch wurde angeklickt");
}
if (e.getSource() == vsComputer){
System.out.println("vsComputer wurde angeklickt");
}
}
public static void main(String[] args) {
new Schach();
}
}