Крестики-нолики определяют алгоритм победителя - PullRequest
0 голосов
/ 22 мая 2019

Первоначально я намеревался опубликовать это на Codereview SE, но, поскольку я действительно не знал, можно ли считать следующий код завершенным, я подумал, что он будет лучше подходить здесь. Не стесняйтесь закрыть это, если вы чувствуете, что это было бы лучше отправлено куда-нибудь еще.

Рассматривая "действительные" в терминах Tic Tac Toe правила 3x3 массив в качестве входных данных с именем game, как этот алгоритм выглядит для определения победителя?

Я новичок в C и программировании в целом, и я хотел бы знать, насколько хороша производительность / сложность этого кода, поскольку он немного отличается от того, что я нахожу в других публикациях в SO. Циклы for делают это излишне сложным?

if (game[1][3] == game[2][2] && game[2][2] == game[3][1]) /*antidiagonal check */
    {
        w = game[1][3]; /* w is player X or O */
    }

    t1 = 0;

    for (i=0; i<=2; ++i)
    {
        if (game[i][i] == game[i+1][i+1]) /* main diagonal check */
        {
            t1 += 1;
        }
            if (t1 == 2)
            {
                w = game[i][i];
            }
    }

    for (i=0; i<=2; ++i)
    {
        t2 = 0;
        for (j=0; j<=1; ++j)
        {
            if (game[i][j] == game[i][j+1]) /* row check */
            {
                t2 += 1;
                if (t2 == 2)
                {
                    w = game[i][j];
                }
            }
        }
    }

    for (i=0; i<=1; ++i)
    {
        t3=0;
        for (j=0; j<=2; ++j)
        {
            if (game[i][j] == game[i+1][j]) /* column check */
            {
                t3 += 1;
                if (t3 == 2)
                {
                    w = game[i][j];
                }
            }
        }
    }

    if (t1<2 && t2<2 && t3<3)
    {
        printf("No winner\n");
    }
    else
    {
        printf("%c wins\n", w);
    }

1 Ответ

0 голосов
/ 22 мая 2019

На плате крестики-нолики есть 9 плиток.

Каждая плитка либо содержит X, либо ее нет.Это означает, что вы можете использовать 9-битное целое число без знака, чтобы представлять, есть ли на каждом тайле X;затем используйте этот номер в таблице поиска (512 записей), чтобы определить, X выиграл ли.

Точно так же;каждая плитка либо содержит O, либо ее нет;так что вы можете закодировать это как другое 9-битное целое число без знака и использовать его в той же (512 записи) таблице поиска, чтобы определить O выигранных.

Если доска представлена ​​в виде пары 9-повсюду битовые целые числа (избегая необходимости преобразовывать состояние платы), тогда код становится следующим:

if( table[XboardState] == WIN) {
    printf("X wins\n");
} else if( table[OboardState] == WIN) {
    printf("O wins\n");
} else {
    printf("No winner\n");
}

Примечание: таблице поиска требуется только один бит на запись;таким образом, используя битовые поля (и немного сдвигая / маскируя для выбора правильного бита), он может составлять всего 64 байта.Конечно, вы можете написать простую / временную утилиту для генерации таблицы для вас, а затем «вырезать и вставить» таблицу в код вашей игры.

...