2016-03-23 5 views
0

最近、自分のチェスエンジンを開発しようと思って魔法のビットボードを勉強してきました。私はビットボードのコンセプトに遭遇しました。役に立つトピックの1つはサイトhttp://www.rivalchess.com/magic-bitboards/からのものでしたが、そこに与えられた例はルックとビショップの動きだけです。偶然、女王のための占有マスクを生成するコンセプトを共有できる人はいますか?クイーンズチェスのためのビットボード占有マスクを生成する方法は?

void generateOccupancyMasks() 
    { 
     int i, bitRef; 
     uint64_t mask; 
     for (bitRef=0; bitRef<=63; bitRef++) 
     { 
      mask = 0; 
      for (i=bitRef+8; i<=55; i+=8) mask |= (((uint64_t)1) << i); 
      for (i=bitRef-8; i>=8; i-=8) mask |= (((uint64_t)1) << i); 
      for (i=bitRef+1; i%8!=7 && i%8!=0 ; i++) mask |= (((uint64_t)1) << i); 
      for (i=bitRef-1; i%8!=7 && i%8!=0 && i>=0; i--) mask |= (((uint64_t)1) << i); 
      occupancyMaskRook[bitRef] = mask; 

      mask = 0; 
      for (i=bitRef+9; i%8!=7 && i%8!=0 && i<=55; i+=9) mask |= (((uint64_t)1) << i); 
      for (i=bitRef-9; i%8!=7 && i%8!=0 && i>=8; i-=9) mask |= (((uint64_t)1) << i); 
      for (i=bitRef+7; i%8!=7 && i%8!=0 && i<=55; i+=7) mask |= (((uint64_t)1) << i); 
      for (i=bitRef-7; i%8!=7 && i%8!=0 && i>=8; i-=7) mask |= (((uint64_t)1) << i); 
      occupancyMaskBishop[bitRef] = mask; 
     } 
} 
+2

2つのマスクのビット単位のORではないのですか? –

+0

これらはハードコーディングできませんか? –

+0

投稿コード1)がコンパイルされません。 2)ステートメントを挿入した後:#include と#include がコンパイルされます。次に、関数を呼び出すmain()を追加します(結果としてクリーンなコンパイルが行われます)。コードを実行しようとします。結果のマスクは正しくありません。詳細については私の答えを参照してください – user3629249

答えて

3

私はあなたは、単にこれら二つのマスクのビット単位の論理和演算を取ることができると思います:

for (bitRef=0; bitRef<=63; bitRef++) 
{ 
    occupancyMaskQueen[bitRef] = occupancyMaskRook[bitRef] | occupancyMaskBishop[bitRef]; 
} 
+0

ああああ!私もちょっと気付いた。そして、それは私にとってはとても馬鹿で、女王のために何らかのループを起こさなければならないと思った。とにかく、啓発に感謝します。 – BitF

+0

@BitF:歓迎です:) –

0

掲載のコードが含まれている私はここルークとビショップのために使用されたコードを貼り付けマスクを生成するためのロジックのいくつかのエラー

次のコードは、マスクを調べるためのコードです。

私はまた、いくつかの悪いマスクの例を挙げました。

#include <stdio.h> 
#include <stdint.h> 

uint64_t occupancyMaskRook[64]; 
uint64_t occupancyMaskBishop[64]; 

void generateOccupancyMasks() 
{ 
    int i; 
    int bitRef; 
    uint64_t mask; 

    for (bitRef=0; bitRef<=63; bitRef++) 
    { 
     mask = 0; 
     for (i=bitRef+8; i<=55; i+=8) mask |= (((uint64_t)1) << i); 
     for (i=bitRef-8; i>=8; i-=8) mask |= (((uint64_t)1) << i); 
     for (i=bitRef+1; i%8!=7 && i%8!=0 ; i++) mask |= (((uint64_t)1) << i); 
     for (i=bitRef-1; i%8!=7 && i%8!=0; i--) mask |= (((uint64_t)1) << i); 
     occupancyMaskRook[bitRef] = mask; 



     mask = 0; 
     for (i=bitRef+9; i%8!=7 && i%8!=0 && i<=55; i+=9) mask |= (((uint64_t)1) << i); 
     for (i=bitRef-9; i%8!=7 && i%8!=0 && i>=8; i-=9) mask |= (((uint64_t)1) << i); 
     for (i=bitRef+7; i%8!=7 && i%8!=0 && i<=55; i+=7) mask |= (((uint64_t)1) << i); 
     for (i=bitRef-7; i%8!=7 && i%8!=0 && i>=8; i-=7) mask |= (((uint64_t)1) << i); 
     occupancyMaskBishop[bitRef] = mask; 
    } 


    printf("\n the possible Rook masks\n"); 
    for(bitRef=0; bitRef < 64; bitRef++) 
    { 
     for(i = 0; i<8; i++) 
     { 
      for(int j=0; j<8; j++) 
      { 
       putchar(occupancyMaskRook[bitRef] & (((uint64_t)1) << (i*8+j))? '1' : '0'); 
      } 
      putchar('\n'); 
     } 
     puts("\n"); 
    } 

    printf("\n the possible bishop masks\n"); 
    for(bitRef=0; bitRef < 64; bitRef++) 
    { 
     for(i = 0; i<8; i++) 
     { 
      for(int j=0; j<8; j++) 
      { 
       putchar(occupancyMaskBishop[bitRef] & (((uint64_t)1) << (i*8+j))? '1' : '0'); 
      } 
      putchar('\n'); 
     } 
     puts("\n"); 
    } 
} 

int main(void) 
{ 
    generateOccupancyMasks(); 
    return 0; 
} 

以下悪いマスクは、列、行6に司教、カラム1

注行8列3、行1における欠落カバレッジの欠落カバレッジのために6

00000000 
00001000 
00010000 
00100000 
01000000 
00000000 
01000000 
00000000 
あります

上記は単なる例であり、多くの不良マスクがあります

関連する問題