조각이 한 번의 이동으로 한 사각형에서 다른 사각형으로 다른 경로를 따라갈 수 있습니까?
체스 게임을 구현하고 있습니다. 나는 규칙을 알고 있지만 많이 연주하지 않았습니다. 작은 요점에 대한 설명이 필요합니다.
플레이어가 합법적으로 조각을 A 사각형에서 B 사각형으로 이동했다고 가정합니다.이 이동 중에이 조각이 따라 간 경로를 고려하십시오. 작품의 종류에 따라 다를 수 있나요?
그런 경우를 찾을 수 없습니다.
편집 :-나는 더 많은 컨텍스트를 제공하기 위해 일부 사람들이 요청한 것처럼 더 명확하게 다루고있는 인터페이스 코드를 추가하고 있습니다.
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);
}
마찬가지로 Knight와 같은 다른 조각에 대한 클래스가 있습니다. 이제 플레이어가 체스에서 어떤 위치 X에서 다른 위치 Y로 이동하려는 경우 Piece의 validate () 메서드는 체스의 playerMove ()에 의해 호출되며, validate ()는 이동이 유효한지 여부 만 확인할 수 있습니다. 주어진 조각과 마찬가지로 기사는 주어진 위치에서 목적지가 8 개의 유효한 이동 중 하나인지 확인합니다. Rook의 경우 네 방향 중 하나가 될 수 있습니다.
playerMove () 함수는 Piece.validate () 함수를 호출 한 다음 그것이 유효한 이동임을 알게됩니다. 내가 해결하려는 문제는 이제 체스에서 playerMove 함수가 유효하다는 것을 알고 있습니다. 이동시 지정된 위치에서 목적지까지의 사이에 조각이 있는지 알 수 없습니까? 조각은 Board의 컨텍스트가 없기 때문에 감지 할 수 없으며 체스의 playerMove () 함수에서 수행해야합니다. 여기에 코드를 작성하여 소스에서 대상으로 관련된 가능한 사각형 목록을 생성합니다. 사각형 목록은 항상 고유할까요? 아니면 다른 조각에 따라 다를 수 있나요? 기사를 제외하고 모든 것이 직선 또는 대각선으로 움직이기 때문에 고유해야하므로 이것에 대해 명확히하고 싶습니다. 그래도 질문이 명확하지 않으면 알려주십시오.
답변
A 광장에서 B 광장으로 이동하는 여왕, 감독 및 루크의 경우 이동할 수있는 방법은 한 가지 뿐이며 그 사이의 모든 사각형은 비워 두어야 합법적으로 이동할 수 있습니다.
사각형 A에서 사각형으로 이동하는 기사의 경우 일반적으로 두 가지 방법이 있지만 기사가 조각 위로 점프 할 수 있기 때문에 관련이 없습니다.
캐슬 링의 경우 왕이 A에서 B로 이동할 수있는 방법은 한 가지 뿐이며, 그 이동이 합법적이려면 중간 광장이 비어 있어야하며 왕이 먼저 이동해야합니다. 캐슬 링의 경우 루크가 A에서 B로 이동할 수있는 방법은 한 가지 뿐이며 그 사이의 모든 칸은 킹과 떨어져 있어야 합법적으로 움직일 수 있습니다.
아니요. 기사가 시작 사각형에서 끝 사각형으로 이동하는 방법은 맛의 문제이지만 최종 사각형에 도달하는 방법에 대해서는 기록되어 있지 않습니다. 캐슬 링의 경우도 마찬가지입니다. 루크가 목적지 광장에 도착하는 방법은 2 칸 이동 한 왕을 지나서 그곳에 도착해야하기 때문입니다.
고려해야 할 특별한 경우는 나이트 무브, 캐슬 링 및 폰 무브입니다. 기사는 실제로 경로가 없습니다. 목적지로 순간 이동하는 것으로 생각할 수 있습니다. 폰과 캐슬 링은 점유 된 사각형을 통과 할 때 동일한 제한을 따라야합니다 (동일한 소스 및 대상 사각형을 가진 다른 재료와 "통과"하는 사각형이 동일 함). 또한 추가 제한이 있습니다. 왕이 캐슬 링이 아닌 다른 곳으로 이동할 때마다 사각형을 "통과"하지 않으므로 질문이 실제로 적용되지 않습니다.
다른 모든 이동은 루크 이동 또는 비숍 이동입니다. 여왕이 움직일 때마다 루크 또는 비숍이 움직입니다. 여왕이 감독을 움직일 때 그것은 감독을 움직이는 것과 같은 규칙을 따르며, 그 길은 감독과 같습니다. 루크를 움직일 때 루크와 동일한 규칙을 따릅니다 (앞서 언급 한 캐슬 링 제외).
기사가 아닌 조각의 경우 실제로 확인할 경로는 하나뿐입니다. 루크, 비숍, 퀸의 경우 "레이"를 추적하면 왕은 한 칸만 이동하고 기사는 다른 조각이 방해가되는 것을 신경 쓰지 않으므로 경로는 중요하지 않습니다. 따라서 확인하려면 대상 사각형이 아군 조각이 아닌지 (아군 조각을 캡처 할 수 없기 때문에) 그리고 광선 이동 조각에 대해 그 사이의 모든 사각형이 비어 있는지 확인해야합니다.
물론 폰은 움직이는 것과는 다르게 포착하기 때문에 특별한 경우입니다. :) (그리고 그것은 더블 스텝과 en passant 규칙과 같은 추가적인 합병증이 있습니다)
참고 : 이동이 합법적이려면 이동 한 플레이어가 이동 후 체크를하지 않아야합니다. 그래서 당신은 또한 그것을 확인해야합니다. 한 가지 가능한 방법은 움직이는 플레이어의 왕이 루크 인 척하고 적 루크를 잡을 수 있는지 확인하는 것입니다. 그러면 그 적 루크가 실제로 체크를하고 있습니다. (다른 조각도 동일하며 물론 폰도 다시 조심해야합니다)
나는 또한 이것을 많이 다르게 구현할 것이지만 학습 프로젝트라고 가정하므로 괜찮을 것입니다.