Interesse an Mini-Schach?

Coldstorm

Gesperrt
Hi, ich beschäftige mich momentan mit der Programmierung eines Schachspiels(zwei Spieler, Netzwerk). Es ist schon fast fertig. Das einzig wichtige, was eigentlich noch fehlt, ist das Schachsetzen(der König kann momentan noch geschlagen werden). Ich hab zwar auch schon en passant irgendwie geschafft, aber das Schach bringe ich irgendwie nicht hin. Hat da jemand von euch Ahnung? Ich arbeite gerade noch an einer guten Menüführung...dann kann ich demjenigen das Projekt gerne schicken. Das Programm ist relativ logisch aufgebaut mit mehreren kleinen Klassen, also objektorientiert. Ich hoffe es findet sich jemand...
Im Anhang der Ordner im zip-Format wie gewünscht.
 

Anhänge

  • chess.zip
    41,8 KB · Aufrufe: 49
Zuletzt bearbeitet:
Wo ist das Problem? Geh alle Einheiten des Gegners durch und prüfe, ob sich der eigene König auf einen angreifbaren Feld befindet. Ein matt ist es, wenn alle 8 Felder darum auch angreifbar sind.
Dein Projekt anschauen kann ich leider nicht, komme dann aus meinen eigenen Programm, welches ich atm schreibe raus.
 
Ich nehme an, du hast alle Einheiten in einer List. Diese könnten zum Beispiel eine Methode enthalten, die die Felder, die angreifbar/beziehbar sind durchgehen, in eine Liste adden und diese dann zum auswerten zurückgeben. Auch wenn es nicht so ist hast du wohl etwas ähnliches um rauszufinden ob eine Einheit auf ein Feld ziehen kann.

Wenn man von meinen Beispiel ausgeht, könnte das ganze so aussehen. (Das ist eigendlich nur Psydo-Code, den ich im Editor zusammengekritzelt habe, aber könnte dir vielleicht einen Denkanstoß liefern.)

Java:
public void roundStart()
{
	int player = Klasse.getPlayer();
	List<Unit> unitList = Klasse.getUnitList(); //player und Unitlist in dem Beispiel static

	Unit king = searchKing(unitList, player);
	Point kingLocation = king.getLocation();

	boolean kingsLocationAttakable = checkWheterFieldIsAttackable(player, unitList, kingLocation);

	if(kingsLocationAttackable)
	{
		try
		{
			checkMatt(player, unitList, king);
			System.out.println("Schach!"); //TODO
		}
		catch(RuntimeException e)
		{
			System.out.println("Schach Matt. 8)"); //TODO
		}
	}
	else
		System.out.println("Weder, noch");
}
private Unit searchKing(int player, List<Unit> unitList)
{
	Unit king = null;
	for(byte b = 0; b < unitList.size() && king != null; b++)
		if(unitList.get(b).getPlayer == player)
			if(unitList.get(b).getUnitId() == KING_ID)
				king = unitList.get(b);
	return(king);
}
private boolean checkWheterFieldIsAttackable(int player, List<Unit> unitList, Point fieldToCheck)
{
	boolean result = false;

	for(int b = 0; b < unitList.size() && !result; b++)
		if(unitList.get(b).getPlayer() != player)
		{
			List<Point> attackableFields = unitList.get(b).getAttackableFields();
			
			if(attackableFields.content(fieldToCheck)
				result = true;
		}
	return(result);
}
private void checkMatt(int player, List<Unit> unitList, Unit king) throws RuntimeException
{
	RuntimeException exceptionToThrow = new RuntimeException();

	Point kingLocation = king.getLocation();
	int x = kingLocation.x;
	int y = kingLocation.y;

	if(checkWheterFieldIsAttackable(player, unitList, new Point(x - 1, y - 1)))
		throw exceptionToThrow;
	else if(checkWheterFieldIsAttackable(player, unitList, new Point(x, y - 1)))
		throw exceptionToThrow;
	else if(checkWheterFieldIsAttackable(player, unitList, new Point(x + 1, y - 1)))
		throw exceptionToThrow;

	else if(checkWheterFieldIsAttackable(player, unitList, new Point(x - 1, y)))
		throw exceptionToThrow;
	else if(checkWheterFieldIsAttackable(player, unitList, new Point(x + 1, y)))
		throw exceptionToThrow;

	else if(checkWheterFieldIsAttackable(player, unitList, new Point(x - 1, y + 1)))
		throw exceptionToThrow;
	else if(checkWheterFieldIsAttackable(player, unitList, new Point(x, y + 1)))
		throw exceptionToThrow;
	else if(checkWheterFieldIsAttackable(player, unitList, new Point(x + 1, y + 1)))
		throw exceptionToThrow;
}
 
Zuletzt bearbeitet:
Erstmal danke für die Anregungen, auch wenn's mir nicht wirklich geholfen hat.
Bei mir ist es so: Ich hab verschiedene Klassen:

King(Figur König):
Code:
public class King extends AbstractChessPiece {
	private Image img;
	
	public King(int team) throws IllegalArgumentException {
		super(team);
		img = BoardModel.img[team][0];
	}

	public Vector getMoves() {
		return Movements.getKingMovement();
	}

	public String getName() {
		return "König " + (this.getTeam()==AbstractChessPiece.WHITE_TEAM?"WHITE":"BLACK");
	}
	
	public Image getImage() {
		return img;
	}
}


Movement(Möglichen Züge):
Code:
kingMovement = new Vector();
		kingMovement.add(new PieceMove(0, -1));
		kingMovement.add(new PieceMove(1, -1));
		kingMovement.add(new PieceMove(1, 0));
		kingMovement.add(new PieceMove(1, 1));
		kingMovement.add(new PieceMove(0, 1));
		kingMovement.add(new PieceMove(-1, 1));
		kingMovement.add(new PieceMove(-1, 0));
		kingMovement.add(new PieceMove(-1, -1));

BoardModel(ganze Logik, u.a. en passant, hier muss es wohl noch irgendwie rein):
Code:
private void collectPossibleTargets() {
		this.resetTargets();
		AbstractChessPiece cPiece = this.activeSquare.getFigur();
		Vector moves = cPiece.getMoves();
		System.out.println("Anzahl der Züge" + moves.size());
		PieceMove m;
		Address address;
		Square target;
	
		
		//ermittelt alle möglichen Züge all
		for (int i=0; i<moves.size(); i++) {
			m = (PieceMove)moves.get(i);
			address = m.getMoveResult(this.activeSquare.getAddress());
			if (address.isValid()) {
				target = content[address.getRow()][address.getColumn()];
				if (!target.isOccupied())
					this.possibleTarget.add(address);
				else if (target.getFigur().isOpponent(cPiece) && !(cPiece instanceof Pawn))
					this.possibleTarget.add(address);
			}
		}
		if (cPiece instanceof Pawn) { //Bauer schlägt Figuren auf eine besondere Art
			moves = cPiece.getCaptureMoves();
			for (int i=0; i<moves.size(); i++) {
				m = (PieceMove)moves.get(i);
				address = m.getMoveResult(this.activeSquare.getAddress());
				if (address.isValid()) {
					target = content[address.getRow()][address.getColumn()];
					if (target.isOccupied() && target.getFigur().isOpponent(cPiece)){
						this.possibleTarget.add(address);
					}
				}
			}
			address = this.activeSquare.getAddress().copy();
			address.move(0, -1);
			this.checkForEnPassent(address);
			address = this.activeSquare.getAddress().copy();
			address.move(0, 1);
			this.checkForEnPassent(address);
		}
		//System.out.println(Arrays.toString(this.possibleTarget.toArray()));
		
		//entfernt alle ungültigen Züge, damit die Figuren nicht springen können
		if (!cPiece.canJump()) {
			Address start;
			for(int i=this.possibleTarget.size()-1; i>=0; i--) {
				address = (Address)this.possibleTarget.get(i);
				start = this.activeSquare.getAddress().copy();
				
				//System.out.println("**** " + start + " --> " + address);
				
				int rdelta = 0;
				if (address.getRow() < start.getRow())
					rdelta = -1;
				else if (address.getRow() > start.getRow())
					rdelta = 1;
				
				int cdelta = 0;
				if (address.getColumn() < start.getColumn())
					cdelta = -1;
				if (address.getColumn() > start.getColumn())
					cdelta = 1;
				
				start.move(rdelta, cdelta);
				while(!start.equals(address) && start.isValid()) {
					//System.out.println(start + " --> " + address);
					target = content[start.getRow()][start.getColumn()];
					if (target.isOccupied()) {
						this.possibleTarget.remove(address);
					}
					start.move(rdelta, cdelta);
				}
			}
		}
		
		if (this.markTargets) { //if the high light option is set valid moves are marked on the board
			for(int i=0; i<this.possibleTarget.size(); i++) {
				address = (Address)this.possibleTarget.get(i);
				content[address.getRow()][address.getColumn()].markAsPossibleTarget(true);
			}
		}
		System.out.println("Mögliche Züge  : " + Arrays.toString(this.possibleTarget.toArray()));
		System.out.println("En passant Ziele: " + Arrays.toString(this.enPassant.toArray()));
	}
 
Movement(Möglichen Züge):
Code:
kingMovement = new Vector();
		kingMovement.add(new PieceMove(0, -1));
		kingMovement.add(new PieceMove(1, -1));
		kingMovement.add(new PieceMove(1, 0));
		kingMovement.add(new PieceMove(1, 1));
		kingMovement.add(new PieceMove(0, 1));
		kingMovement.add(new PieceMove(-1, 1));
		kingMovement.add(new PieceMove(-1, 0));
		kingMovement.add(new PieceMove(-1, -1));

Hey,


nur mal so nebenbei :p
WIe wäre das "Movement" bei der Dame/Turm?

Danke

bo
 
Wo ist das Problem? Geh alle Einheiten des Gegners durch und prüfe, ob sich der eigene König auf einen angreifbaren Feld befindet. Ein matt ist es, wenn alle 8 Felder darum auch angreifbar sind.
Das stimmt nicht. Es gibt drei Möglichkeiten, ein Schach abzuwehren: den König aus dem Schach ziehen, die Schach gebende Figur schlagen (natürlich nur, wenn nicht mehrere gegnerische Figuren Schach geben) oder aber eine eigene Figur zwischen König und Schach gebende Figur stellen (geht natürlich beim Springer nicht). Erst wenn alle diese drei Möglichkeiten erschöpft sind, ist das Spiel zu Ende.

Coldstorm, geht es denn nur ums Schachmatt oder ums Schach an sich?

Ich persönlich kann mit deinem Code recht wenig anfangen, zumal mir die Methode collectPossibleTargets riesig erscheint und ich mich ernsthaft frage, ob das sauberes OOP ist. Abgesehen davon kommt die Schach-Logik eher in die Methode rein, die aufgerufen wird nachdem ein Spieler seinen Zug gemacht hat. Dort musst du dann (fürs Schach) überprüfen, ob die gesetzte Figur neu Schach gibt oder eventuell durch den Zug jetzt eine andere gegnerische Figur neu Schach gibt (und die alte währenddessen im Weg stand).

Vielleicht wäre es nicht schlecht, wenn du das Projekt zipst und an deinen Originalpost anhängst. So kann man sich ein Bild über deine Klassen- und Methodenstruktur machen (was m.E. wichtiger ist als deren Implementierung).
 
Bei der Dame wäre es kürzer bergonline:
Code:
queenMovement = new Vector();
		queenMovement.addAll(bishopMovement);
		queenMovement.addAll(rookMovement);

SilentWarrior, es geht erstmal nur im das Schachsetzen, Schachmatt ist dann nochmal schwieriger...
Die Methode ist nicht klein ja, aber der Rest sollte recht übersichtlich sein. Ich habe das Projekt
oben angehängt.
Das Programm ist übrigens vollständig fehlerfrei. Es kann also gestartet werden. Die Main-Methode befindet
sich in der Chess.java.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück