2017-04-11 5 views
0

그래서 저는 문제를두고 머리를 감싸는 데 어려움을 겪고 있습니다. 저는 현재 Java에서 체스 엔진을 기반으로 한 판지를 씁니다. 지금까지 모든 pawn/king/knight 이동은 예상대로 버그없이 작동합니다.체스 엔진에서 슬라이딩 조각 생성

이해에 도움이 필요한 것은 슬라이딩 이동 생성입니다. 각 사각형/조각에 대해 빈 보드 이동 배열을 생성했습니다. 나의 현재 이해에서 나는 또한 각 사각형에 가능한 각각의 점유를 포함하는 배열을 개발할 필요가있다. 그리고 어떻게 든 다양한 방법을 기반으로 그 배열을 찾는다.

올바른 생각인가요? 0에서 2^63까지의 모든 숫자를 선택하고 해당 사각형의 이동 비트 보드로 xor'ing 한 다음 배열을 초기화하고 같은 방식으로 액세스 할 수있는 일부 방법 (마술/회전 된 비트 보드)을 저장하는 것입니다. 실행 시간?

가짜 코드 및 설명을 매우 환영합니다. (나는 그런데 >>>를 사용하고있다).

답변

3

다양한 성능과 복잡성으로 비트 보드의 슬라이딩 피스 동작을 생성하는 방법은 여러 가지가 있습니다. 대부분이 here입니다.

아마도 가장 빠르고 가장 일반적인 것은 magic bitboards입니다.이 비트 보드는 "마법"사전 계산 된 값으로 비트 보드를 곱하여 모든 네 방향으로 가능한 한 빨리 생성합니다. 단점은 매우 큰 조회 테이블을 사용한다는 것입니다. 이것은 아마도 더 복잡한 첫 번째 구현이 아니어야합니다.

Obstruction differencehyperbola quintessence은 구현하기가 쉽지만 마법의 비트 보드보다 훨씬 느립니다.

룩업 테이블을 필요로하지 않고 모든 방향에서 루프 인 dumb7fill도 더 간단하고 느립니다.

+0

감사합니다.하지만 마법의 비트 보드를 사용해도 마법 번호를 사용하여 조회 테이블을 정확하게 참조 할 수 있습니다. 내 질문은 어떻게 그렇게 조회 테이블을 생성하는 것입니다. 이해가 안되면 않는 한. – thePanthurr

+0

@thePanthurr 귀하의 질문은 당신이 같은 조회 테이블이 모든 슬라이딩 피스 방법에 사용될 것이라고 생각하는 것처럼 보입니다. 하지만 그들은 모두 다른 조회 테이블이 필요합니다. 그 중 일부 (예 : 마법의 비트 보드)는 여러 개의 조회 테이블을 사용합니다. 어떤 방법을 사용할지 결정하고 그것에 대해 읽은 다음 구체적으로 이해하지 못하는 것에 대해 질문해야합니다. – interjay

+0

@thePanthurr 직접 테이블을 생성 할 필요가 없습니다. – SmallChess