如何在c ++中初始化位板?

时间:2017-06-26 00:46:56

标签: c++ chess

我在比特板上仔细考虑了国际象棋编程维基,但我仍然在努力实现我应该如何创造它们。从我收集的内容来看,他们应该是一个uint64_t吧?有时我看到它们表示为像鳕鱼一样的长十六进制数字,有时我看到它们表示为64位二进制数字。

我如何采取一系列棋盘位置并将其转换为每个棋子的位板然后将其转换成两个颜色?

2 个答案:

答案 0 :(得分:0)

最后能够像这样定义一个位板:

typedef unsigned long long  U64; // supported by MSC 13.00+ and C99
#define C64(constantU64) constantU64##ULL    

U64 BBFullBoard  = 0xffffffffffffffffULL;

答案 1 :(得分:0)

由于unsigned long long之类的内容不能保证具有任何特定数量的位,因此在此处使用cstdint是一个好主意,如下所示:

#include <cstdint>
uint64_t board;

但是,使用std::bitset可能会以更少的工作量生成更易读的代码:

#include <bitset>
#include <cassert>

class BitBoard {
 private:
  std::bitset<64> board;
 public:
  auto operator()(int x, int y){
    assert(0<=x && x<=7);
    assert(0<=y && y<=7);
    return board[8*y+x];
  }
  void setAll(bool val){
    if(val)
      board.set();   //All bits on
    else
      board.reset(); //All bits off
  }
};

int main(){
  BitBoard board;
}

我不确定哪一个会更高效。其他人发布了关于绩效的想法here