Search code examples
c++bit-manipulationbitboard

Assign TicTacToe player position to a bitboard representation


I have 2 separate boards for 2 players: X and O. Now I'd like to make sure if an entered position (int x, int y) is valid but I've got no idea of how should I convert it to bitboard representation and compare it with given board states and it's doing me head in. Also wrote a helper function to see the board states bin(). And is there a way to merge the X and O boards into one or should I keep the separate all board to check the game state?

#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;
}

Solution

  • Well you can treat your bitstring as a flattened 2d array. To convert a 2d index into a 1d one you can simply do

    x * width + y
    

    So to set the matching position in the board you can do

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

    since a TicTacToe board is 3 wide and 3 tall. You can then check if there already is an X or O at that position with

    if(x.b & move)
    {
      std::cout << "there already is and x at(" << x << ", " << y << ")";
    }
    

    To then add that position to the board if there is nothing there do

    x.b |= move
    

    Same thing for o.b. This is of course based on the assumption that your x and y start at 0.

    Concerning your question of whether or not you can merge the two board. How would you even do that? A bit can only be 0 or 1 so there is no way to differentiate between 3 different states (nothing, X, O).