Hi, ich arbeite momentan an einem Schachspiel für 2 Spieler.
Momentan hänge ich etwas...hab den Überblick verloren bzw. keine Ideen mehr.
Weiß jemand wie ich das König-Problem in den Griff bekommen kann? Also so, dass wenn der König in Schach steht, der König ziehen muss, die bedrohene Figur schlagen muss oder eine Figur vor den bedrohenen Bereich stellen muss. Ich glaube, es geht recht effektiv, mit 2 Zeilen oder so, aber ich komm ned drauf.
Dann wollte ich noch eine kleine Uhr einbauen, wie lange das Spiel schon dauert und wie lange jeder einzelne Zug dauert gerade...habt ihr da eine Idee?
Vielen Dank im Voraus...
und hier mal mein Code...
Momentan hänge ich etwas...hab den Überblick verloren bzw. keine Ideen mehr.
Weiß jemand wie ich das König-Problem in den Griff bekommen kann? Also so, dass wenn der König in Schach steht, der König ziehen muss, die bedrohene Figur schlagen muss oder eine Figur vor den bedrohenen Bereich stellen muss. Ich glaube, es geht recht effektiv, mit 2 Zeilen oder so, aber ich komm ned drauf.
Dann wollte ich noch eine kleine Uhr einbauen, wie lange das Spiel schon dauert und wie lange jeder einzelne Zug dauert gerade...habt ihr da eine Idee?
Vielen Dank im Voraus...
und hier mal mein Code...
Code:
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.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.JFrame;
import javax.swing.JLabel;
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;
JLabel anDerReihe;
JTextArea spielregelnText = 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);
spielregeln = new JMenuItem("Spielregeln");
spielregeln.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);
anDerReihe = new JLabel("Es ist Spieler...dran!");
}
// 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;
System.out.println("Spieler1 ist dran");
}
}
}
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){
try {
spielregelnText.read(new FileReader("C:/Dokumente und Einstellungen/fschwarz/Desktop/Projekt/Schachregeln.txt"), "");
} catch (Exception ex) {
ex.printStackTrace();
}
JScrollPane scrollPane = new JScrollPane(spielregelnText);
scrollPane.setPreferredSize(new Dimension(600, 400));
add(scrollPane);
spielregelnText.setWrapStyleWord(true);
applikation.validate();
}
if (e.getSource() == vsMensch){
System.out.println("vsMensch wurde angeklickt");
}
if (e.getSource() == vsComputer){
System.out.println("vsComputer wurde angeklickt");
}
}
private void pack() {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
new Schach();
}
}