-
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.Geändert von Coldstorm (21.01.10 um 19:56 Uhr) Grund: Anhang: Projektordner im zip-Format
-
21.01.10 14:42 #2
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.
-
Hm...ja ich versuche es schon ne Weile, aber ich bin leider noch keinen Schritt weitergekommen...
-
21.01.10 14:59 #4
Moin,
dann poste doch einfach mal den relevanten Code und beschreibe, wo genau Du Probleme hast !
Gruß
KlausEs ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!
Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
-------------------------------------------------------------------------------------------------
Ich beantworte keine Fragen per PN !!
Stellt Eure Fragen im Forum - dann haben alle etwas davon !!
-
21.01.10 15:19 #5
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.)
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
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; }
Geändert von Kai008 (21.01.10 um 15:21 Uhr)
-
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
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 :1 2 3 4 5 6 7 8 9
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
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())); }
-
21.01.10 16:11 #7
- Registriert seit
- Jul 2006
- Beiträge
- 473
-
21.01.10 16:13 #8
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 :1 2 3
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.Geändert von Coldstorm (22.01.10 um 09:34 Uhr)
-
Eine Hilfe wäre nützlicher, als einfach die zwei Beiträge zuvor zu löschen ohne mich zu benachrichtigen...
-
Deine Probleme hängen stark damit zusammen, wie du die Figuren und ihre Zugmöglichkeiten verwaltest.
- Du solltest zwei Arrays machen, in denen du die vorhandenen Figuren speicherst, jeweils eins für Schwarz und Weiß.
- Du musst wegen der Bauern zwischen den Feldern unterscheiden, auf die die Figur ziehen kann, und Feldern, die von ihr bedroht sind.
- Eine Schachfigur sollte selber prüfen, ob sie auf ein Feld ziehen bzw. dort schlagen kann. Baue die beiden entsprechenden Methoden ein. Die Methode collectPossibleTargets erschiene dann auch nicht so aufgebläht.
Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons
Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.
-
Hat jemand Interesse daran, das Projekt mit mir noch etwas zu erweitern? Sind wohl kaum mehr als drei Methoden...
Komme leider nicht weiter, aber es ist sehr wichtig für mich. Bei Bedarf auch mit Bezahlung, wenns nicht
anders geht...
-
Derzeit habe ich leider zu viele andere Themen, die mich beschäftigen, aber wenn du deine Probleme konkret schilderst, kann dir bestimmt jemand mit dem richtigen Hinweis zum mentalen Durchbruch verhelfen - vielleicht sogar ich.
Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons
Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.
-
Also es geht erstmal NUR im das Schachsetzen generell und das Schachmatt setzen.
Ich hab hier folgenden Ansatz, wie sollte ich das implementieren? Ist ja nur pseudocode...
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/ Methode um rauszufinden, ob WEISS im Schach steht // (wird direkt NACH einem Zug von BLACK aufgerufen, um // die Ansage "Schach" machen zu können) boolean istWHITEimSchach() { List<Move> allMoves = Alle Züge die BLACK jetzt machen könnte for (Move move : allMoves) { if (move.zielfeld == Feld des WHITE Königs) return true; } return false; } // Methode um rauszufinden, ob WEISS im Schachmatt steht: boolean istWHITESchachmatt() { List<Move> allMoves = Alle Züge die WHITE jetzt machen könnte for (Move move : allMoves) { führeAus(move); boolean istWHITESchach = istWHITEimSchach(); macheRückgängig(move); if (!istWHITESchach) { // Weiß kann einen Zug machen, nach dem es NICHT mehr // im Schah steht -> NICHT Schachmatt return false; } } return true; }
-
01.03.10 10:29 #15
- Registriert seit
- Aug 2007
- Ort
- Sandl (Oberösterreich)
- Beiträge
- 93
Hey!
Ich würde nicht so sehr von den gegnerischen figuren ausgehn, sondern vom eigenen König.
Der König kann nur aus 3 Positionen Schach stehen:
- Diagonal
- Gerade
- dieses L vom Springer.
Damit bekommst du ein Point-Array von rein theoretisch 44 Positionen (praktisch nicht möglich, da es bei 10 kein mittleres Feld gibt)
Nun würd ich alle Punkte abgrasen und checken, ob dort eine gegnerische Figur steht.
Wenn ja, dann checken ob aufgrund der Movements dieser Figur es möglich wäre auf das Feld des eigenen Königs zu gelangen.
Wenn ja, Schach.
Wenn nein, weitermachen.
Um ein Schachmatt heraus zu finden kannst du das oben genannte in eine Funktion packen (mit zB X,Y-Parameter des Königfeldes) und mit den umliegenden Feldern des eigenen Königs aufrufen.
Ja, das wär meine Überlegung.
greez THEJS
Ähnliche Themen
-
mini mini Problemchen - zefix
Von Fexxx im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 26.04.05, 20:43 -
Schach = gut; schach @ Kontoauszugsdrucker = besser
Von Suchfunktion im Forum SmalltalkAntworten: 8Letzter Beitrag: 14.01.05, 08:27 -
Schach Simulator
Von Konstantin Gross im Forum SmalltalkAntworten: 13Letzter Beitrag: 25.11.04, 15:25 -
Politisches Interesse
Von Nowaja im Forum SmalltalkAntworten: 3Letzter Beitrag: 03.07.03, 14:10 -
besteht interesse
Von -unreal- im Forum PhotoshopAntworten: 21Letzter Beitrag: 08.03.02, 18:52



1Danke

Zitieren

Login




