가능한 조각의 움직임을 bitboard의 실제 움직임으로 어떻게 변환 할 수 있습니까?

Jan 09 2021

다음과 같이 비트 보드가있는 경우 (예 : 나이트 스퀘어로 이동할 수 있음) :

00000000
00000000
00000000
00000000
00000000
01000000
00100000
N0000000

이동으로 "변환"하거나 해당 이동으로 "적용"하려면 어떻게해야합니까?

답변

2 AryanParekh Jan 09 2021 at 19:28

게시물에는 실제로 두 가지 질문이 있습니다.

  • Bitboard의 공격을 이동 목록으로 변환하는 방법은 무엇입니까?

  • 그 움직임을 어떻게 표현할까요?


  • 그 움직임을 어떻게 표현할까요?

이 질문은 여기 와 여기에서 철저히 논의되었습니다 . 그러나이 게시물의 독자에게 컨텍스트를 제공하기 위해이를 수행하는 매우 간단한 방법은 클래스 / 구조를 사용하여 이동을 나타내는 것입니다.

  • 에서 (이동 조각이 어디에)
  • 으로 (이동 조각이 될 것입니다 경우)
  • 특수 이동 플래그 ( 이동이 특수 이동 인지 여부 (예 : 동반자, 캐스팅, 승격)
  • Promoted Piece (이동이 승진 이동 인 경우 어떤 부분 으로 승격 되었습니까? )

또한 캡처 된 조각, 성 유형 등과 같은 추가 속성을 가질 수 있습니다. 그러나 해당 정보는 FromTo사각형을 사용하여 추론 할 수도 있습니다 .

따라서 위의 내용을 고려하여 다음과 같이 이동을 나타낼 수 있습니다.

struct Move {
    char from; 
    char to;   
    char spMoveFlag;
    char promotedPiece;
};

그러나 저를 포함한 많은 체스 엔진은 이동을 16비트로 압축 할 수있는 또 다른 방법을 사용 합니다. 여기에서 자세한 내용을 읽어보십시오 .

움직임이 무엇인지 알면 다음 질문에 답할 수 있습니다.


  • Bitboard의 공격을 이동 목록으로 변환하는 방법은 무엇입니까?

d4 광장에 기사 가 있다고 가정 해 봅시다 . 또한 사각형이 주어진 기사의 공격을 반환하는 기능도 있습니다.

. . . . . . . . 
. . . . . . . . 
. . 1 . 1 . . . 
. 1 . . . 1 . . 
. . . n . . . .   =  knightattacks(SQ_D4)
. 1 . . . 1 . . 
. . 1 . 1 . . . 
. . . . . . . . 

그래서 이것을 변수 안에 저장합시다 knightAttacks

uint64_t knightAttacks = getKnightAttacksBB(SQ_D4);

주의 깊게 알아 차리면 우리는 이동을 나타내는 데 필요한 4 가지 속성 중 하나가 이미 From정사각형- D4. 이제 우리가해야 할 일은 To기사가 어떤 종류의 특수 동작도 수행 할 수 없기 때문에 어떻게 든이 작업 을 완료하기 위해 광장을 확보하는 것입니다.

매우 일반적인 방법은 아무것도 남지 않을 때까지 최하위 비트 를 팝하는 것 knightAttacks입니다 0.

0000011100001000 
            ^
            Least significant bit (lsb)

이 작업을 수행하는 방법을 알기 위해 내가 제공 한 링크를 따라갈 수 있습니다. 또는 컴파일러가 이미 제공 할 가능성이 있습니다.

비트 보드의 lsb를 지우고 인덱스를 반환하는 함수를 생성하기 만하면됩니다. 그것을라고 부르 자 poplsb().

전체적으로 코드는 다음과 같을 수 있습니다.

int from = SQ_D4;
uint16_t knightAttacks = getknightAttacks(from);

while (knightAttacks)  {
     int to = poplsb(knightAttacks);
     MyMoveList.Add( NewMove(from, to, 0, 0) ); // The last two 0's denote that there is no special move
}

이것은 lsb를 팝할 때마다 숫자가 == 0이 될 때까지 비트가 지워지기 때문에 작동합니다. 그 때 루프가 중지되고 완벽하게 좋은 동작 목록이 있습니다. Bitboard를 사용하여 만든 모든 종류의 동작에 동일한 아이디어가 적용됩니다.