Назначьте позицию игрока TicTacToe представлению на растровой доске

avatar
Besynnerlig
1 июля 2021 в 18:01
115
1
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;
}
Источник
ACB
1 июля 2021 в 18:08
0

Хорошо, как вы хотите ввести позиции?

Besynnerlig
1 июля 2021 в 18:11
0

@ACB как координаты int x, int y

Ответы (1)

avatar
ACB
1 июля 2021 в 18:14
1

Ну, вы можете обращаться со своей битовой строкой как с плоским 2D-массивом. Чтобы преобразовать 2d-индекс в 1d, вы можете просто сделать

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).

Mooing Duck
1 июля 2021 в 18:29
0

3 different states (nothing, X, O) звучит как перечисление

Besynnerlig
1 июля 2021 в 19:29
0

Предыдущий 1 << (x * 3 + y) не работал должным образом, изменен на 256 >> (x * 3 + y) в остальном отличное решение