tutorials.de Buch-Aktion 02/2012
Seite 1 von 3 123 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
35
ZUGRIFFE
1272
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    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.
    Angehängte Dateien Angehängte Dateien
    Geändert von Coldstorm (21.01.10 um 19:56 Uhr) Grund: Anhang: Projektordner im zip-Format
     

  2. #2
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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.
     

  3. #3
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    Hm...ja ich versuche es schon ne Weile, aber ich bin leider noch keinen Schritt weitergekommen...
     

  4. #4
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.098
    Moin,

    dann poste doch einfach mal den relevanten Code und beschreibe, wo genau Du Probleme hast !

    Gruß
    Klaus
     
    Es 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 !!

  5. #5
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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)
    Coldstorm bedankt sich. 

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

  7. #7
    bergonline bergonline ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Beiträge
    473
    Zitat Zitat von Coldstorm Beitrag anzeigen
    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));
    Hey,


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

    Danke

    bo
     

  8. #8
    Avatar von SilentWarrior
    SilentWarrior SilentWarrior ist offline Mitglied Diamant
    Registriert seit
    Dec 2001
    Beiträge
    3.078
    Zitat Zitat von Kai008 Beitrag anzeigen
    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).
     

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

  10. #10
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    Eine Hilfe wäre nützlicher, als einfach die zwei Beiträge zuvor zu löschen ohne mich zu benachrichtigen...
     

  11. #11
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.
    Wenn du das getan hast, kannst du so vorgehen, wie kai008 es vorgeschlagen hat: Alle gegnerischen Figuren durchgehen und abfragen, ob sie ein bestimmtes Feld bedrohen.
     
    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. #12
    Coldstorm Coldstorm ist offline Mitglied Gold
    Registriert seit
    Jan 2009
    Beiträge
    123
    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...
     

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

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

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

  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