0

我有 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;
}
4

1 回答 1

1

好吧,您可以将您的位串视为扁平的二维数组。要将二维索引转换为一维索引,您只需执行以下操作

x * width + y

因此,要在板上设置匹配位置,您可以这样做

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

因为井字游戏板是 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)。

于 2021-07-01T18:14:47.540 回答