c++ - 在 C++ 中是否有更简单的表示条件的方法?

标签 c++ language-features

我写了一个基于多维数组的基本井字游戏。 g[3][3]。在我的程序中,我有大约 9 个条件,就像我将要向您展示的那样:

if((g[0][0] == X && g[0][1] == X && g[0][2] == X) || (g[0][0] == O && g[0][1] == O && g[0][2] == O))

这太疯狂了。我可能做错了什么,但这就是我要解决这个问题的原因。有没有更简单的方法来表示像这样的漫长而复杂的条件?例如,我不能以某种方式做:

if(grid.hasXes)

最佳答案

您可能采用了错误的方式。只有 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;
}

关于c++ - 在 C++ 中是否有更简单的表示条件的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10175579/

相关文章:

c++ - 如何在C++中使用getline命令?

c++ - 使用 C++ 模板作为返回类型/变量名

.net - C# 内部 VS VBNET Friend

C#:没有从 Class<Child> 到 Class<Base> 的隐式转换

c++ - 删除联系人的简单电话簿程序

c++ - uintptr_t 和 size_t 相同吗?

php - 为什么这样的语句可以在PHP中运行呢?

tensorflow - 如何在 SGNN(自治神经网络)中实现散列?

ruby - 如何使用 Groovy 将字段动态添加到 Java 类?

c++ - 有没有人发现需要声明一个复制赋值运算符的返回参数const?