あなたはおそらくそれについて間違った方法で行っているでしょう。可能な組み合わせは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
グリッドをプレーヤーごとに1つずつ、2つとして維持することも検討できます。位置のビット番号はであり3 * i + j
、移動が合法であるかどうかをテストするには、次のようにします。
bool
isLegal( int gridX, int gridY, int i, int j )
{
return ((gridX | gridY) & (1 << (3 * i + j))) == 0;
}