如何在3x3网格的空白处输入2或4?

问题描述 投票:0回答:2
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代码开头的语句。有关如何更正代码的任何建议?

c++ eclipse
2个回答
0
投票

评论中已经指出了一些问题。首先,您的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:
                // ...
            }
        }
}

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


0
投票

让我们像编译器一样查看您的代码:

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);

    // below compiler sees "number or number or number or (number is zero)",
    // compiler does not see "if either of the numbers is zero",
    // if asked to do a logical "OR" of two numbers, then  it will do the logical
    // "number is non-zero OR other number is non-zero",
    // i.e. it sees this, probably extremely probable condition:
    if (   (n1 != 0)
         ||(n2 != 0)
         ||(n3 != 0)
         ||(n4 != 0)
         ||(n5 != 0)
         ||(n6 != 0)
         ||(n7 != 0)
         ||(n8 != 0)
         ||(n9 == 0)
       )
    {
        // program will almost always execute this
        switch((rand()%9) + 1) // do a switch on a random number
        {
        case 1: // if it is 1
            n1 = i; // overwrite n1 unconditionally with i, whether it is 0 or not
            break;
        case 2:     // same for 2 ... etc.
            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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.