void putTile(int &n1, int &n2, int &n3, int &n4, int &n5, int &n6, int &n7, int &n8, int &n9)
{
    srand(time(0));
    int i = (((rand()%10)) < 5 ? 2:4);

    if (n1||n2||n3||n4||n5||n6||n7||n8||n9 == 0) {
        switch((rand()%9) + 1) {
        case 1:
            n1 = i;
            break;
        case 2:
            n2 = i;
            break;
        case 3:
            n3 = i;
            break;
        case 4:
            n4 = i;
            break;
        case 5:
            n5 = i;
            break;
        case 6:
            n6 = i;
            break;
        case 7:
            n7 = i;
            break;
        case 8:
            n8 = i;
            break;
        case 9:
            n9 = i;
            break;
        }
    }
}

我试图在空的地方(包含0的地方)随机生成2或4,但是我的算法即使在已经有数字的地方也在随机的地方输入随机生成的数字(2或4),因为我在代码的开头。有关如何更正代码的任何建议?

最佳答案

评论已经指出了一些问题。首先,您的if语句无法按您期望的方式工作。它正在检查通过n1n8是否不为零,或者n9是否为零。

其次,在初始if语句之后,您只是随机更改位置,但是不检查该值是否为非零。

可能的解决方案是:

void putTile( int &n1, int &n2, int &n3, int &n4, int &n5, int &n6, int &n7, int &n8, int &n9 ) {
    int i = ( ( ( rand() % 10 ) ) < 5 ? 2 : 4 );

    if ( n1 == 0 || n2 == 0 || n3 == 0 || n4 == 0 || n5 == 0 || n6 == 0 || n7 == 0 || n8 == 0 || n9 == 0 ) {
        while ( true ) {
            switch ( ( rand() % 9 ) + 1 ) {
            case 1:
                if ( n1 == 0 ) {
                    n1 = i;
                    return;
                }
                break;
            case 2:
                if ( n2 == 0 ) {
                    n2 = i;
                    return;
                }
                break;
            case 3:
                if ( n3 == 0 ) {
                    n3 = i;
                    return;
                }
                break;
            case 4:
                // ...
            }
        }
}

注意,这不是很有效,并且有很多重复项。我建议使用数组。

10-04 12:13