将 TicTacToe 玩家位置分配给位板表示

Assign TicTacToe player position to a bitboard representation

我有 2 个独立的棋盘供 2 个玩家使用:X 和 O。现在我想确定输入的位置 (int x, int y) 是否有效,但我不知道我应该怎么做将其转换为位板表示并将其与给定的板状态进行比较,这让我很投入。还编写了一个辅助函数来查看板状态 bin()。有没有办法将 X 和 O 板合并为一个,或者我应该保留单独的所有板以检查游戏状态?

#include <bits/stdc++.h>
using namespace std;

bool xmove = true;
const int win[] = { 0b111000000,
                    0b000111000,
                    0b000000111,
                    0b100100100,
                    0b010010010,
                    0b001001001,
                    0b100010001,
                    0b001010100 };

struct Board {
  int b = 0b000000000;
};

int iswin(int x) {
  for (size_t i = 0; i < 8; i++) {
    if (win[i] == x) return 1;
  }
  return 0;
};

void bin(int x){
  cout << "0b" + bitset<9>(x).to_string() << endl;
};

int main() {
  Board x, o, all;
  x.b |= 0b000000111;
  o.b |= 0b000111000;
  all.b = x.b | o.b;
  bin(all.b);
  cout << iswin(x.b);
  return 0;
}

好吧,您可以将位串视为扁平的二维数组。要将二维索引转换为一维索引,您可以简单地执行

x * width + y

所以你可以在棋盘上设置匹配位置

int move = 1 << (x * 3 + y)

因为 TicTacToe 棋盘是 3 宽 3 高。然后,您可以使用

检查该位置是否已经存在 X 或 O
if(x.b & move)
{
  std::cout << "there already is and x at(" << x << ", " << y << ")";
}

然后将该位置添加到板上(如果没有任何操作)

x.b |= move

o.b 也是如此。这当然是基于你的 x 和 y 从 0 开始的假设。

关于你能不能合并两个板的问题。你怎么会那样做?一位只能是0或1所以无法区分3种不同的状态(无,X,O)。