Как ввести 2 или 4 в пустых местах в сетке 3x3? - PullRequest
1 голос
/ 16 марта 2020
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;
        }
    }
}

Я пытаюсь сгенерировать 2 или 4 в пустых местах (места, содержащие 0) случайным образом, но мой алгоритм вводит случайно сгенерированные числа (2 или 4) в случайных местах даже в местах, где уже есть число, так как я использовал оператор if в начале кода. Любые предложения о том, как исправить код?

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Давайте посмотрим ваш код, как это делает компилятор:

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;
        }
    }
}
0 голосов
/ 16 марта 2020

Есть несколько вопросов, на которые уже указывают комментарии. Во-первых, ваше заявление if не работает так, как вы ожидаете. Он проверяет, не является ли n1 - n8 ненулевым или 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:
                // ...
            }
        }
}

Обратите внимание, это не очень эффективно и имеет много дубликатов. Я бы предложил использовать массивы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...