你可能会约了错误的方式。目前只有3^9,或 19683种可能的组合,所以你甚至可以在16位机器上的网格转换为int
, :
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:
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
S,每名球员之一。 的位置的位数是3 * i + j
,并测试一个 此举是合法的:
bool
isLegal(int gridX, int gridY, int i, int j)
{
return ((gridX | gridY) & (1 << (3 * i + j))) == 0;
}
一个循环?查找表?一个函数?拿你的选择... – 2012-04-16 14:01:53
@Oli查尔斯沃思,你可以给每个例子吗? – Bugster 2012-04-16 14:03:36