Les pièces peuvent-elles suivre des chemins différents d'une case à l'autre en un seul mouvement?

Dec 06 2020

J'implémente une partie d'échecs. Je connais les règles mais je n'y ai pas beaucoup joué. J'ai besoin d'éclaircissements sur un petit point.

Supposons qu'un joueur déplace légalement une pièce de la case A à la case B. Considérez le chemin que cette pièce a suivi pendant ce mouvement. Peut-il être différent selon le type de pièce?

Je ne suis pas en mesure de trouver un tel cas.

Edit: - J'ajoute le code d'interface que je traite pour le rendre plus clair, comme demandé par certaines personnes pour donner plus de contexte.

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);

}

De même, il y aura des classes pour d'autres pièces comme Knight. Maintenant, si un joueur veut se déplacer aux échecs d'une position X à une autre position Y, la méthode validate () de la pièce sera appelée par playerMove () des échecs, validate () ne peut que vérifier si le coup est valide ou non. Comme pour les pièces données, disons chevalier, il vérifiera qu'à partir d'un emplacement donné, la destination est l'un des 8 coups valides.Pour Rook, il peut s'agir de l'une des quatre directions et ainsi de suite.

La fonction playerMove () appelle la fonction Piece.validate (), puis elle apprend que c'est un coup valide.Le problème que j'essaie de résoudre, maintenant une fois que la fonction playerMove aux échecs, sait qu'il est valide déplacer, il ne sait pas s'il y a une pièce entre un endroit donné et une destination? Parce que la pièce n'a pas de contexte de tableau, elle ne peut pas la détecter et cela doit être fait dans la fonction playerMove () des échecs. écrira ici un code pour générer la liste des carrés possibles impliqués de la source à la destination. Cette liste de carrés sera-t-elle toujours unique? Ou peut-elle être différente pour différentes pièces? Parce qu'à part le chevalier, tous les mouvements en ligne droite ou en diagonale doivent être uniques, je veux donc clarifier ce point.Si la question n'est toujours pas claire, veuillez me le faire savoir.Mais

Réponses

4 BrianTowers Dec 06 2020 at 04:55

Pour les reines, les évêques et les tours qui se déplacent de la case A à la case B, il n'y a qu'une seule façon de faire un mouvement et toutes les cases intermédiaires doivent être vides pour que ce mouvement soit légal.

Pour un chevalier qui passe de la case A à la case, il y a généralement deux façons, mais cela n'a pas d'importance car les chevaliers peuvent sauter par-dessus des pièces sur le chemin.

Pour le roque, il n'y a qu'une seule façon pour le roi de se déplacer de A à B et la case intermédiaire doit être vide pour que ce mouvement soit légal et le roi doit être déplacé en premier. Pour le roque, il n'y a qu'une seule façon pour la tour de se déplacer de A à B et toutes les cases entre les deux doivent être vides en dehors du roi pour que ce mouvement soit légal.

3 MikeD Dec 06 2020 at 04:42

Non. C'est une question de goût de la façon dont le chevalier se déplace de la case de départ à la case de fin, mais rien n'est écrit sur la façon dont il arrive à la case finale. Il en va de même pour le roque, de la façon dont la tour arrive sur la case de destination, car elle doit y arriver en passant devant le roi qui vient de faire un mouvement de deux cases.

1 Acccumulation Dec 07 2020 at 11:04

Les cas particuliers à considérer sont les mouvements de chevalier, de roque et de pion. Les chevaliers n'ont pas vraiment de chemin; vous pouvez les considérer comme se téléportant vers leur destination. Les pions et le roque doivent suivre les mêmes restrictions pour se déplacer à travers les cases occupées (ils ont les mêmes cases qu'ils «traversent» que tout autre matériau avec les mêmes cases source et destination), mais ont également des restrictions supplémentaires. Chaque fois qu'un roi se déplace autre que le roque, il ne «traverse» aucune case, donc votre question ne s'applique pas vraiment.

Tous les autres mouvements sont soit un mouvement de tour, soit un mouvement de fou. Chaque fois qu'une reine bouge, elle effectue soit un mouvement de tour, soit un mouvement d'évêque. Quand une reine fait bouger un évêque, elle suit les mêmes règles que le déplacement d'un évêque, et le chemin qu'elle emprunte est le même que celui d'un évêque. Quand il fait un mouvement de tour, il suit les mêmes règles qu'une tour (autre que le roque mentionné ci-dessus).

koedem Dec 08 2020 at 01:58

Pour les pièces qui ne sont pas le chevalier, il n'y a en effet qu'un seul chemin à vérifier. Pour la tour, l'évêque et la reine, vous tracez un "rayon", un roi ne bouge que d'une case et le chevalier ne se soucie pas que d'autres pièces se trouvent sur le chemin, donc le chemin n'a pas d'importance. Donc, pour vérifier, vous devez vérifier que la case de destination n'est pas une pièce amie (car vous ne pouvez pas capturer de pièces amies) et pour les pièces mobiles de rayon que toutes les cases entre les deux sont vides.

Le pion est bien sûr un cas particulier car il capture différemment qu'il ne bouge, j'espère que vous en êtes conscient. :) (et il a d'autres complications comme le double pas et la règle en passant)

REMARQUE: pour qu'un mouvement soit légal, le joueur en mouvement ne doit pas être en échec après le mouvement. Vous devez donc également vérifier cela. Une façon possible de le faire est de prétendre que le roi du joueur en mouvement est une tour et de voir s'il peut capturer une tour ennemie, alors cette tour ennemie donne en fait un échec. (idem pour les autres pièces et bien sûr attention encore une fois avec les pions)

Je noterai également que je mettrais en œuvre cela de manière très différente, mais je suppose que c'est un projet d'apprentissage, donc ça devrait aller.