-
Sollte ich jeweils für schwarz und weiß eine Methode schreiben oder wie?
Kannst du das vielleicht in Code schreiben, weiß ned genau, was du mit dem Point-Array meinst
-
01.03.10 11:00 #17
- Registriert seit
- Aug 2007
- Ort
- Sandl (Oberösterreich)
- Beiträge
- 93
ich geh jetzt mal davon aus, dass der eigene Client weiß, welche Farbe er hat.
Mein König steht zb auf Coords 6,1 - das wäre in meiner denkweise die unterste Zeile das sechste feld von links
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
public void checkPositionCanBeBeaten(int x, int y) { ArrayList<Point> pointArray = new ArrayList<Point>(); // Diagonale und Gerade // Horizontal - Hierbei werden auch gleich die diagonalen gesetzt for(int i=1;i<x;i++) { pointArray.add(new Point(i,y)); if(y+(x-i) <= 10) pointArray.add(new Point(i,y+(x-i))); if(y-(x-i) >= 1) pointArray.add(new Point(i,y-(x-i))); } for(int i=x+1;i<=10;i++) { pointArray.add(new Point(i,y)); if(y+(i-x) <= 10) pointArray.add(new Point(i,y+(i-x))); if(y-(i-x) >= 1) pointArray.add(new Point(i,y-(i-x))); } // Vertikal for(int i=1;i<y;i++) { pointArray.add(new Point(x,i)); } for(int i=y+1;i<=10;i++) { pointArray.add(new Point(x,i)); } // Nun der Springer if(x > 0 && y > 1) pointArray.add(new Point(x-1,y-2)); if(x < 10 && y > 1) pointArray.add(new Point(x+1,y-2)); if(x > 1 && y > 0) pointArray.add(new Point(x-2,y-1)); if(x < 9 && y > 0) pointArray.add(new Point(x+2,y-1)); if(x > 1 && y < 10) pointArray.add(new Point(x-2,y+1)); if(x < 9 && y < 10) pointArray.add(new Point(x+2,y+1)); if(x > 0 && y < 9) pointArray.add(new Point(x-1,y+2)); if(x < 10 && y < 9) pointArray.add(new Point(x+1,y+2)); // dieser Part wäre abgeschlossen // jetzt überprüfen, ob Figuren des anderen Spielers auf den Positionen von pointArray stehen // ev kann es hier eine Performaceverbesserung sein, wenn man die Positionen der eigenen Figuren aus dem pointArray löscht }
greez THEJSGeändert von THEJS (04.03.10 um 15:21 Uhr)
-
Es gibt prinzipiell drei Arten, auf ein Schach zu reagieren.
- Die Figur schlagen, die Schach gibt
- Eine Figur dazwischenziehen
- Den König wegziehen
- Schlagen hilft nicht, wenn der König nicht im Doppelschach steht, oder die schachgebende Figur nur vom König geschlagen werden kann, aber gedeckt ist.
- Dazwischenziehen kann man nur bei einem Turm, Läufer oder einer Dame, die nicht unmittelbar neben dem König steht.
- Wegziehen kann man nur, wenn kein Feld neben dem König bedroht ist.
Am einfachsten machst du es dir vielleicht, wenn du speicherst, welches Feld von welcher Figur kontrolliert wird, also bedroht bzw. gedeckt ist. Diese Information speicherst du in den Feld-Objekten, die du in einem 2D-Array als Schach brett hast. Nach jedem Zug aktualisierst du diese Informationen. Du kannst dann für deine Routine folgende Vorgehensweise nutzen.- Befrage das Feld, auf dem dein König steht, ob von welchen gegnerischen Figuren es bedroht ist; der Rückgabewert ist eine Liste oder ein Array von den Figuren, die dieses Feld bedrohen. Wenn die Liste leer ist, steht der König nicht im Schach.
- Ansonsten befrage die Felder um den König herum, ob sie von gegnerischen Figuren bedroht sind. Wenn eines davon frei ist, kann der König noch ausweichen und ist also nicht Schachmatt.
- Ansonsten untersuche wieder die Liste aus Punkt 1. Wenn Doppelschach ist, ist der König schachmatt.
- Ansonsten schau nach, ob die schachgebende Figur ein Turm, ein Läufer oder eine Dame ist. Wenn ja, dann untersuche die dazwischenliegenden Felder, ob diese von einer deiner Figuren kontrolliert wird; dies darf weder der König noch eine gefesselte Figur sein. Wenn ja, dann ist ein Dazwischenziehen möglich und der König ist nicht schachmatt.
- Ansonsten schau nach, ob die schachgebende Figur auf einem Feld steht, das von einem deiner Figuren kontrolliert wird. Wenn nein, dann ist der König schachmatt.
- Ansonsten schau nach, ob es nur der König ist, der diese Figur schlagen kann. Wenn nein, ist der König nicht schachmatt.
- Ansonsten schau nach, ob das Feld der schachgebenden Figur von einer gegnerischen Figur kontrolliert wird, die schachgebende Figur also gedeckt ist. Wenn ja, dann ist der König schachmatt.
- Ansonsten ist der König 'nur' im Schach und muss die gegnerische Figur schlagen.
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.
-
pah so viel auf einmal

Ich will es erstmal so einfach wie möglich machen. Ich gehe eher von der anderen Seite erstmal ran und für jede Spielfigur überprüfen, ob sie mit einem Zug das Spielfeld des gegnerischen Königs erreichen kann. Die Methode collectPossibleTargets in der Klasse BoardModell sammelt ja bereits die mit einem Zug erreichbaren Felder einer bestimmten figur. Wie soll ich nun diese erweitern oder kopieren um die Zielfelder aller Figuren zu sammeln um diese Zielfelder mit der Position des Königs zu vergleichen?
Hier die Methode nochmal:
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())); }
-
Kann mir jemand helfen? Ist wirklich sehr wichtig, auch gegen Bezahlung...
-
Hat echt niemand ne Ahnung? Kann ich mir irgendwie nicht vorstellen...
-
04.03.10 14:32 #22
- Registriert seit
- Aug 2007
- Ort
- Sandl (Oberösterreich)
- Beiträge
- 93
Was heißt hier "Hat echt niemand ne Ahnung?"
Immerhin haben dir Vereth und ich Lösungsvorschläge gegeben.
Also ja, wenn du willst dass dir das irgendjemand programmiert, dann wahrscheinlich (schneller) gegen bezahlung.
--> Oder du beschäftigst dich einfach selbst damit.
Is ja schlließlich dein Projekt (oder was auch immer)
-
Da hast du natürlich Recht. Nur bringen mir euch die Lösungsvorschläge nicht, es gehören nur irgendwie noch zwei Schleifen in die collectTargets-Methode oder so..., weil ich einen Teil ja schon abgearbeitet hab in der Methode.
Ich hab schon alles versucht, aber es liegt einfach außerhalb meiner Fähigkeiten...
-
Du delegierst zu wenig Funktionalität an deine Hilfsklassen. Deswegen werden deine Routinen zu aufgebläht, unübersichtlich und verwirrend. Wenn du das änderst, wird es dir auch leichter fallen, dein Programm selber fertig zu stellen.
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.
-
Ich habs nun dcoh einigermaßen hinbekommen mit Hilfe...sieht so aus:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
private void checkForCheck() { Address kingAddress = null; Vector targetVector = new Vector(); for (int i=0; i<content.length; i++) { for (int k=0; k<content[i].length; k++) { AbstractChessPiece figur = content[i][k].getFigur(); if (figur!=null) { if (figur instanceof King && figur.getTeam()!=this.turn) kingAddress = content[i][k].getAddress(); if (figur.getTeam()==this.turn) targetVector.addAll(this.collectPossibleTargets(content[i][k])); } } } for (int i=0; i<targetVector.size(); i++) { //System.out.println(">>" + targetVector.get(i) + " : " + kingAddress); if (((Address)targetVector.get(i)).equals(kingAddress)){ System.out.println(content[kingAddress.getRow()][kingAddress.getColumn()].getFigur().getName() + " ist im Schach!"); break; } } }
Nun wollte ich noch fragen, ob ihr eine Idee habt zur Bauernumwandlung. Also wenn ein weißer Bauer auf Reihe 7 oder ein schwarzer Bauer auf Reihe noch gelangt, dann wird er umgehend(ohne Auswahldialog) in eine Dame umgewandelt.
Hier nochmal die Startaufstellung zur Einführung:
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
public void takeStartPosition() { movesCount = 0; resetTargets(); rochade.clear(); enPassant.clear(); if (activeSquare!=null) { activeSquare.setSelected(false); activeSquare = null; } turn = WHITE; content[0][0].occupyBy(new Rook(AbstractChessPiece.BLACK_TEAM)); content[0][1].occupyBy(new Knight(AbstractChessPiece.BLACK_TEAM)); content[0][2].occupyBy(new Bishop(AbstractChessPiece.BLACK_TEAM)); content[0][3].occupyBy(new Queen(AbstractChessPiece.BLACK_TEAM)); content[0][4].occupyBy(new King(AbstractChessPiece.BLACK_TEAM)); content[0][5].occupyBy(new Bishop(AbstractChessPiece.BLACK_TEAM)); content[0][6].occupyBy(new Knight(AbstractChessPiece.BLACK_TEAM)); content[0][7].occupyBy(new Rook(AbstractChessPiece.BLACK_TEAM)); content[7][0].occupyBy(new Rook(AbstractChessPiece.WHITE_TEAM)); content[7][1].occupyBy(new Knight(AbstractChessPiece.WHITE_TEAM)); content[7][2].occupyBy(new Bishop(AbstractChessPiece.WHITE_TEAM)); content[7][3].occupyBy(new Queen(AbstractChessPiece.WHITE_TEAM)); content[7][4].occupyBy(new King(AbstractChessPiece.WHITE_TEAM)); content[7][5].occupyBy(new Bishop(AbstractChessPiece.WHITE_TEAM)); content[7][6].occupyBy(new Knight(AbstractChessPiece.WHITE_TEAM)); content[7][7].occupyBy(new Rook(AbstractChessPiece.WHITE_TEAM)); for (int column=0; column<8; column++) { content[1][column].occupyBy(new Pawn(AbstractChessPiece.BLACK_TEAM)); content[2][column].clear(); content[3][column].clear(); content[4][column].clear(); content[5][column].clear(); content[6][column].occupyBy(new Pawn(AbstractChessPiece.WHITE_TEAM)); } }
Ich glaube es sollte so ähnlich wie en passent funktionieren...
Hat jemand einen Vorschlag? PS: Code ist mir immer lieber als SätzeCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
private void checkForEnPassent(Address address) { Square target; Pawn opponentPawn; if (address.isValid()) { target = content[address.getRow()][address.getColumn()]; if (target.isOccupied()) { if (target.getFigur() instanceof Pawn) { opponentPawn = (Pawn)target.getFigur(); address.move(opponentPawn.getTeam()==AbstractChessPiece.WHITE_TEAM?1:-1,0); if (opponentPawn.isEnPassantPossible(this.movesCount) && !content[address.getRow()][address.getColumn()].isOccupied()){ this.possibleTarget.add(address); this.enPassant.add(address); } } } } }
-
Faulpelz
Die Implementierung ist so simpel, dass du es in einer freien Stunde auch selber machen kannst.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.
-
Simpel? Wenn es so einfach wäre, dann hätte ich es ja schon geschafft. Hatte bei en passant auch Hilfe bekommen, bin ja eigentlich noch Java Anfänger...
-
Erst sagen, das sei primitiv und dann nichts mehr schreiben, naja...
-
12.03.10 09:24 #29
- Registriert seit
- Aug 2007
- Ort
- Sandl (Oberösterreich)
- Beiträge
- 93
Du brauchst doch nur dein Bauern-Objekt gegen ein Damen-Objekt austauschen !?
-
Ja das schon... und wann? If...weißer Bauer auf Reihe 7 und schwarzer Bauer auf Reihe 0...die Syntax fehlt mir halt wie ich das umsetze...
Ä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




