König-Problem und Zeit stoppen

Coldstorm

Gesperrt
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...


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();
	}
}
 
Hallo Coldstorm,

findest du nicht, dass du hier etwas viel von uns verlangst? Nicht jeder hat Lust und vor allem die Zeit, sich in knapp 600 Zeilen Quellcode einzuarbeiten. Vor allem da wir ohne zusätzlichen Aufwand (Bilder erstellen/zusammensuchen) keine Möglichkeit haben, das Programm zu testen. Was es besonders schwer macht, in den Quelltext hinein zu finden, ist die fehlende Objektorientierung. Dein Programm ist fast ausschließlich prozedural aufgebaut, was man schon allein daran erkennt, dass du alles in eine einzige Monsterklasse gestopft hast. Also habe bitte Verständnis, dass sich hier niemand die Arbeit machen will, dein Programm auseinander zu nehmen.

Abgesehen davon hast du keine konkreten Fragen gestellt. Du hast erklärt, was du gerne machen würdest, aber nicht wo genau du nicht weiterkommst. Bei der Uhr wissen wir beispielsweise nicht, ob das Problem jetzt bei der Darstellung der Uhr oder der Zeitmessung oder bei irgendwas ganz anderem liegt.

Lies dir dazu am besten einmal "Wie man Fragen richtig stellt" durch. Wenn du die darin enthaltenen Tipps beherzigst, wirst du sicher (schneller) Hilfe bekommen.

Grüße, Matthias
 
Zurück