Können Teile in einem Zug unterschiedlichen Pfaden von einem Quadrat zum anderen folgen?

Dec 06 2020

Ich implementiere ein Schachspiel. Ich kenne die Regeln, habe sie aber nicht viel gespielt. Ich brauche eine Klarstellung in einem kleinen Punkt.

Angenommen, ein Spieler bewegt eine Figur legal von Feld A nach Feld B. Betrachten Sie den Pfad, dem diese Figur während dieses Zuges gefolgt ist. Kann es je nach Art des Stücks unterschiedlich sein?

Ich kann einen solchen Fall nicht finden.

Bearbeiten: - Ich füge den Schnittstellencode hinzu, mit dem ich mich befasse, um es klarer zu machen, wie von einigen Leuten gebeten, mehr Kontext anzugeben.

public class Chess {

    ChessBoard chessBoard;
    Player[] player;
    Player currentPlayer;
    List<Move> movesList;
    GameStatus gameStatus;

    public boolean playerMove(CellPosition fromPosition, CellPositionb toPosition, Piece piece); 
    public boolean endGame();
    private void changeTurn();

}
public abstract class Piece {

Color color;
public boolean validate(CellPosition fromPosition, CellPositionb toPosition);
}

public class Knight extends Piece {
public boolean validate(CellPosition fromPosition, CellPositionb toPosition);

}

Ebenso wird es Klassen für andere Stücke als Ritter geben. Wenn ein Spieler nun im Schach von einer Position X zu einer anderen Position Y wechseln möchte, wird die validate () -Methode der Figur von playerMove () des Schachs aufgerufen. Validate () kann nur prüfen, ob der Zug gültig ist oder nicht. Wie bei den angegebenen Stücken, z. B. Ritter, wird überprüft, ob das Ziel von einem bestimmten Ort aus einer von 8 gültigen Zügen ist. Für Turm kann es eine von vier Richtungen sein und so weiter.

Die playerMove () -Funktion ruft die Piece.validate () -Funktion auf und erfährt dann, dass es sich um einen gültigen Zug handelt. Das Problem, das ich zu lösen versuche, weiß jetzt, dass es gültig ist, sobald die playerMove-Funktion im Schach ist Bewegen, es weiß nicht, ob es eine Figur dazwischen von einem bestimmten Ort zum Ziel gibt? Da die Figur keinen Kontext von Board hat, kann sie es nicht erkennen und es muss in der playerMove () -Funktion von chess.So i durchgeführt werden Hier wird ein Code geschrieben, um die Liste der möglichen Quadrate zu generieren, die von der Quelle bis zum Ziel betroffen sind. Wird diese Liste von Quadraten immer eindeutig sein oder kann sie für verschiedene Teile anders sein? Denn abgesehen vom Ritter bewegen sich alle Bewegungen gerade oder diagonal, so dass es einzigartig sein sollte. Deshalb möchte ich dies klarstellen. Wenn die Frage immer noch nicht klar ist, lassen Sie es mich bitte wissen

Antworten

4 BrianTowers Dec 06 2020 at 04:55

Für Königinnen, Bischöfe und Türme, die sich von Feld A nach Feld B bewegen, gibt es nur einen Weg, auf dem sie sich bewegen können, und alle dazwischen liegenden Felder müssen leer sein, damit dieser Zug legal ist.

Für einen Ritter, der sich von Feld A zu Feld bewegt, gibt es im Allgemeinen zwei Möglichkeiten, aber das ist irrelevant, da Ritter auf dem Weg über Teile springen können.

Für die Rochade gibt es nur einen Weg, auf dem sich der König von A nach B bewegen kann, und das dazwischenliegende Feld muss leer sein, damit dieser Zug legal ist, und der König muss zuerst bewegt werden. Für die Rochade gibt es nur einen Weg, auf dem sich der Turm von A nach B bewegen kann, und alle Felder dazwischen müssen bis auf den König leer sein, damit dieser Zug legal ist.

3 MikeD Dec 06 2020 at 04:42

Nein. Es ist Geschmackssache, wie sich der Ritter vom Startfeld zum Endfeld bewegt, aber es ist nichts darüber geschrieben, wie er zum Endfeld gelangt. Das Gleiche gilt für die Rochade, wie der Turm am Zielplatz ankommt, da er dorthin gelangen muss, indem er sich an dem König vorbei bewegt, der gerade zwei Felder bewegt hat.

1 Acccumulation Dec 07 2020 at 11:04

Die zu berücksichtigenden Sonderfälle sind Ritterbewegungen, Burgen- und Bauernbewegungen. Ritter haben nicht wirklich einen Weg; Sie können sich vorstellen, dass sie sich an ihr Ziel teleportieren. Bauern und Burgen müssen denselben Einschränkungen beim Bewegen besetzter Felder folgen (sie haben dieselben Felder, die sie "durchlaufen" wie jedes andere Material mit denselben Quell- und Zielfeldern), aber auch zusätzliche Einschränkungen. Immer wenn sich ein König anders als eine Burg bewegt, "geht" er keine Quadrate durch, sodass Ihre Frage nicht wirklich zutreffend ist.

Jeder zweite Zug ist entweder ein Turmzug oder ein Bischofszug. Immer wenn sich eine Königin bewegt, macht sie entweder einen Turmzug oder einen Bischofszug. Wenn eine Königin einen Bischof bewegt, folgt sie denselben Regeln wie ein Bischof, und der Weg, den sie nimmt, ist der gleiche wie der eines Bischofs. Wenn sich ein Turm bewegt, folgt er den gleichen Regeln wie ein Turm (außer der oben genannten Rochade).

koedem Dec 08 2020 at 01:58

Für Stücke, die nicht der Ritter sind, gibt es in der Tat nur einen Weg zu überprüfen. Für Turm, Bischof und Königin zeichnet man einen "Strahl" auf, ein König bewegt nur ein Feld und der Ritter kümmert sich nicht darum, dass andere Teile im Weg sind, so dass der Weg dort keine Rolle spielt. Um dies zu überprüfen, müssten Sie sicherstellen, dass das Zielquadrat kein freundliches Teil ist (da Sie keine freundlichen Teile erfassen können) und dass für die strahlbewegenden Teile alle dazwischen liegenden Quadrate leer sind.

Der Bauer ist natürlich ein Sonderfall, da er anders erfasst als sich bewegt. Ich hoffe, Sie sind sich dessen bewusst. :) (und es hat weitere Komplikationen wie die Doppelschritt- und En-Passant-Regel)

HINWEIS: Damit ein Zug legal ist, darf der sich bewegende Spieler nach dem Zug nicht in Schach gehalten werden. Das müssen Sie also auch überprüfen. Eine Möglichkeit, dies zu tun, besteht darin, so zu tun, als sei der König des sich bewegenden Spielers ein Turm, und zu prüfen, ob er einen feindlichen Turm erobern könnte, dann gibt dieser feindliche Turm tatsächlich Scheck. (Gleiches gilt für die anderen Teile und natürlich noch einmal vorsichtig mit den Bauern)

Ich werde auch bemerken, dass ich dies viel anders implementieren würde, aber ich gehe davon aus, dass es ein Lernprojekt ist, also sollte es in Ordnung sein.