【问题标题】:Assign TicTacToe player position to a bitboard representation将井字游戏玩家位置分配给位板表示
【发布时间】:2021-09-13 19:18:34
【问题描述】:

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

【问题讨论】:

  • 那么你想如何输入位置?
  • @ACB 作为坐标 int x, int y

标签: c++ bit-manipulation bitboard


【解决方案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)。

【讨论】:

  • 3 different states (nothing, X, O) 听起来像一个枚举
  • 以前的 1 &lt;&lt; (x * 3 + y) 没有按预期工作,改为 256 &gt;&gt; (x * 3 + y) 否则是一个绝妙的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多