tutorials.de Buch-Aktion 02/2012
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Like Tree1Danke
ERLEDIGT
NEIN
ANTWORTEN
35
ZUGRIFFE
1272
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    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
     

  2. #17
    THEJS THEJS ist offline Mitglied Silber
    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 THEJS
    Geändert von THEJS (04.03.10 um 15:21 Uhr)
     

  3. #18
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Es gibt prinzipiell drei Arten, auf ein Schach zu reagieren.
    1. Die Figur schlagen, die Schach gibt
    2. Eine Figur dazwischenziehen
    3. Den König wegziehen
    Dabei sind folgende Einschränkungen zu beachten
    1. 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.
    2. Dazwischenziehen kann man nur bei einem Turm, Läufer oder einer Dame, die nicht unmittelbar neben dem König steht.
    3. Wegziehen kann man nur, wenn kein Feld neben dem König bedroht ist.
    Schachmatt ist man, wenn keine der drei Methoden anwendbar 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.
    1. 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.
    2. 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.
    3. Ansonsten untersuche wieder die Liste aus Punkt 1. Wenn Doppelschach ist, ist der König schachmatt.
    4. 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.
    5. 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.
    6. Ansonsten schau nach, ob es nur der König ist, der diese Figur schlagen kann. Wenn nein, ist der König nicht schachmatt.
    7. 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.
    8. Ansonsten ist der König 'nur' im Schach und muss die gegnerische Figur schlagen.
    Das klingt ziemlich kompliziert, aber im Prinzip tust du dabei nur zwei Sachen: die Felder befragen, welche Figuren sie bedrohen und das zurückgegeben Array analysieren. Diese Analyse ist relativ einfach durchzuführen, da nur Eigenschaftswerte abgefragt werden.
     
    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.

  4. #19
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    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()));
        }
     

  5. #20
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    Kann mir jemand helfen? Ist wirklich sehr wichtig, auch gegen Bezahlung...
     

  6. #21
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    Hat echt niemand ne Ahnung? Kann ich mir irgendwie nicht vorstellen...
     

  7. #22
    THEJS THEJS ist offline Mitglied Silber
    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)
     

  8. #23
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    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...
     

  9. #24
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.

  10. #25
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    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...
    Code :
    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);
                        }
                    }
                }
            }
        }
    Hat jemand einen Vorschlag? PS: Code ist mir immer lieber als Sätze
     

  11. #26
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.

  12. #27
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    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...
     

  13. #28
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    Erst sagen, das sei primitiv und dann nichts mehr schreiben, naja...
     

  14. #29
    THEJS THEJS ist offline Mitglied Silber
    Registriert seit
    Aug 2007
    Ort
    Sandl (Oberösterreich)
    Beiträge
    93
    Du brauchst doch nur dein Bauern-Objekt gegen ein Damen-Objekt austauschen !?
     

  15. #30
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    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

  1. mini mini Problemchen - zefix
    Von Fexxx im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 26.04.05, 20:43
  2. Schach = gut; schach @ Kontoauszugsdrucker = besser
    Von Suchfunktion im Forum Smalltalk
    Antworten: 8
    Letzter Beitrag: 14.01.05, 08:27
  3. Schach Simulator
    Von Konstantin Gross im Forum Smalltalk
    Antworten: 13
    Letzter Beitrag: 25.11.04, 15:25
  4. Politisches Interesse
    Von Nowaja im Forum Smalltalk
    Antworten: 3
    Letzter Beitrag: 03.07.03, 14:10
  5. besteht interesse
    Von -unreal- im Forum Photoshop
    Antworten: 21
    Letzter Beitrag: 08.03.02, 18:52