Вы, вероятно, будете об этом неправильном пути. Есть только 3^9, или 19683 возможных комбинаций, так что вы можете преобразовать сетку к int
, даже на 16 битной машине:
int
asInt(char const (&grid)[3][3])
{
int results = 0;
for (int i = 0; i != 3; ++ i) {
for (int j = 0; j != 3; ++ j) {
results *= 3;
switch (grid[i][j]) {
case 'X':
results += 1;
break;
case 'Y':
results += 2;
break;
case ' ':
break;
default:
assert(0);
}
}
}
return results;
}
После этого, вы можете использовать Int для индекса в таблицу указывая, кто выиграл (если кто). Кроме того, вы можете конвертировать только один или позицию другого игрока в 9 битном междунар:
int
asInt(char const (&grid)[3][3], char who)
{
int results = 0;
for (int i = 0; i != 3; ++ i) {
for (int j = 0; j != 3; ++ j) {
results *= 2;
if (grid[i][j] == who) {
++ results;
}
}
}
return results;
}
Вы можете использовать простой линейный поиск в таблице, проверяя, что необходимые биты устанавливаются:
static int const wins[] =
{
0007, 0070, 0700, // rows
0111, 0222, 0444, // columns
0124, 0421 // diagonals
};
class Wins
{
int myToMatch;
public:
Wins(char const (&grid)[3][3], char who)
: myToMatch(asInt(grid, who))
{
}
bool operator()(int entry) const
{
return (entry & myToMatch) == entry;
}
};
Тогда:
if (std::find_if(begin(wins), end(wins), Wins(grid, 'X'))
!= end(wins) {
// X wins
else if (std::find_if(begin(wins), end(wins), Wins(grid, 'O'))
!= end(wins) {
// O wins
else
// play another turn.
Можно даже рассмотреть хранение сетки в виде двух int
с, по одному на игрока. Номер бита для позиции будет 3 * i + j
, и проверить, если хода является легальным:
bool
isLegal(int gridX, int gridY, int i, int j)
{
return ((gridX | gridY) & (1 << (3 * i + j))) == 0;
}
петли? Таблица поиска? Функция? Возьмите свой выбор ... –
@ Oli Charlesworth, можете ли вы привести несколько примеров каждого из них? – Bugster