As peças podem seguir caminhos diferentes de um quadrado para outro em um único movimento?
Estou implementando um jogo de xadrez. Eu conheço as regras, mas não tenho jogado muito. Preciso de esclarecimento sobre um pequeno ponto.
Suponha que um jogador mova legalmente uma peça da casa A para a casa B. Considere o caminho que essa peça seguiu durante o movimento. Pode ser diferente com base no tipo de peça?
Não consigo encontrar tal caso.
Edit: - Estou adicionando o código de interface com o qual estou lidando para torná-lo mais claro, conforme solicitado por algumas pessoas para fornecer mais contexto.
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);
}
Da mesma forma, haverá aulas para outras peças como Cavaleiro. Agora, se um jogador deseja mover no xadrez de alguma posição X para outra posição Y, o método validate () da Peça será chamado por playerMove () do xadrez, validate () só pode verificar se o lance é válido ou não. Como para as peças fornecidas, digamos, o cavalo, ele verificará se, de determinado local, o destino é um dos 8 movimentos válidos. Para a Torre, pode ser qualquer uma das quatro direções e assim por diante.
A função playerMove () faz uma chamada à função Piece.validate () e então fica sabendo que é um movimento válido. O problema que estou tentando resolver, agora uma vez que a função playerMove no xadrez, sabe que é válida move, ele não sabe se existe alguma peça entre um determinado local e o destino? Porque a peça não tem contexto do Tabuleiro, ela não pode detectá-la e isso deve ser feito na função playerMove () do xadrez. irá escrever um código aqui para gerar a lista de quadrados possíveis que estão envolvidos da origem ao destino. Essa lista de quadrados será sempre única ou pode ser diferente para cada peça? Porque além do cavalo, todos os movimentos são em linha reta ou diagonal, então deve ser único, então eu quero esclarecer isso. Se a pergunta ainda não estiver clara, por favor me avise.
Respostas
Para rainhas, bispos e torres que se movem da casa A para a casa B, há apenas uma maneira de fazer o movimento e todas as casas intermediárias devem estar vazias para que esse movimento seja válido.
Para um cavalo que se move da casa A para a casa, geralmente existem duas maneiras, mas isso é irrelevante porque os cavalos podem pular peças no caminho.
Para o roque, há apenas uma maneira de o rei se mover de A para B e a casa intermediária deve estar vazia para que esse movimento seja válido e o rei deve ser movido primeiro. Para o roque, há apenas uma maneira pela qual a torre pode se mover de A para B e todas as casas intermediárias devem estar vazias, exceto pelo rei, para que esse movimento seja válido.
Não. É uma questão de gosto como o cavalo viaja da casa inicial até a casa final, mas nada está escrito sobre como ele chega à casa final. O mesmo para o roque, de como a torre chega à casa de destino, uma vez que tem que chegar lá passando pelo rei que acabou de fazer um movimento de duas casas.
Os casos especiais a serem considerados são os movimentos do cavalo, roque e movimentos do peão. Os cavaleiros realmente não têm um caminho; você pode pensar neles como se teletransportando para seu destino. Os peões e o roque têm que seguir as mesmas restrições ao se mover pelos quadrados ocupados (eles têm os mesmos quadrados pelos quais "passam" como qualquer outro material com os mesmos quadrados de origem e destino), mas também têm restrições adicionais. Sempre que um rei se move além do roque, ele não "passa" por nenhuma casa, então sua pergunta não é muito válida.
Cada outro movimento é um movimento de torre ou um movimento de bispo. Sempre que uma rainha se move, ela faz um movimento de torre ou um movimento de bispo. Quando uma rainha faz um bispo se mover, segue as mesmas regras que mover um bispo, e o caminho que leva é o mesmo que um bispo. Quando faz um movimento de torre, segue as mesmas regras de uma torre (exceto o roque mencionado acima).
Para peças que não são o cavaleiro, existe de fato apenas um caminho a ser verificado. Para torre, bispo e rainha você traça um "raio", um rei só se move uma casa e o cavalo não se importa se outras peças estão no caminho, então o caminho não importa. Então, para verificar, você teria que verificar se o quadrado de destino não é uma peça amigável (já que você não pode capturar peças amigáveis) e para as peças móveis de raio que todos os quadrados entre eles estão vazios.
O peão, é claro, é um caso especial, pois captura de maneira diferente do que se move, espero que você esteja ciente disso. :) (e tem outras complicações como a regra de passo duplo e en passant)
NOTA: Para que uma jogada seja legal, o jogador que está se movendo não deve estar em xeque após a jogada. Então você também tem que verificar isso. Uma maneira possível de fazer isso é fingir que o rei do jogador em movimento é uma torre e ver se ele poderia capturar uma torre inimiga, então essa torre inimiga está de fato dando xeque. (o mesmo para as outras peças e, claro, tome cuidado com os peões mais uma vez)
Também observarei que implementaria isso de forma muito diferente, mas presumo que seja um projeto de aprendizado, então deve funcionar bem.