Теоретически большая проблема с моей игрой Ti c ta c toe, но для меня все кажется хорошим - PullRequest
0 голосов
/ 03 февраля 2020

Итак, я перешел к следующему шагу в изучении c ++, и это матрица. Я пытался сделать легкую игру, но моя игра не может правильно проверить, закончена ли игра. Если в первом раунде вы указали высоту = 2 и ширину = 2, это говорит о том, что вы выиграли ... Я не понимаю, где я мог все испортить, у меня все выглядело довольно неплохо ...

   int map[3][3];
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        map[i][j] = 0;
    }
}

bool finished = false;
int player = 1;
while (!finished) {
    //attack
    cout << "player " << player << " it is your turn"<< endl;

    cout << "The map looks like this:" << endl;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << map[i][j] << " ";
        }
        cout << endl;
    }
    bool correctMove;
    int height, width;
    do
    {
        correctMove = true;
        cout << "Where do you want to attack?" << endl;
        cout << "height = "; cin >> height;
        cout << "width = "; cin >> width;
        if (map[height][width] != 0 || width > 2 || height > 2) {
            correctMove = false;
        }
    } while (!correctMove);
    map[height][width] = player;
    //check finish game
    bool foundSequenceLine = true;
    for (int i = 0; i < 3; i++) {
        if (map[height][i] != player) {
            foundSequenceLine = false;
        }
    }
    bool foundSequenceColumn = true;
    for (int i = 0; i < 3; i++) {
        if (map[i][width] != player) {
            foundSequenceColumn = false;
        }
    }
    bool foundSequenceDiag1 = true;
    if (height == width) {
        for (int i = 0; i < 3; i++) {
            if (map[i][i] != player) {
                foundSequenceDiag1 = false;
            }
        }
    }
    bool foundSequenceDiag2 = true;
    if (height + width == 2) {
        for (int i = 0; i < 3; i++) {
            if (map[2-i][i] != player) {
                foundSequenceDiag2 = false;
            }
        }
    }
    if (foundSequenceColumn || foundSequenceLine || foundSequenceDiag1 || foundSequenceDiag2) {
        finished = true;
        cout << "Congrats player " << player << " you won!!!";
    }

    //change turn
    if (player == 1) {
        player++;
    }
    else {
        player--;
    }
}

}

1 Ответ

2 голосов
/ 03 февраля 2020
Код

делает предположение, а затем избегает его проверки.

Ваш код предполагает, что игрок выиграл, если только вы не можете доказать, что он не выиграл.
Проблема в том, что вы затем замкнули два из тесты, доказывающие ход, не являются выигрышным ходом.

Посмотрите, что делает этот код:

   bool foundSequenceDiag1 = true;
    if (height == width) {
        for (int i = 0; i < 3; i++) {
            if (map[i][i] != player) {
                foundSequenceDiag1 = false;
            }
        }
    }

Сначала вы говорите, "игрок выиграл" foundSequenceDiag1=true;. Затем вы говорите: «Был ли ход по диагонали?», И только после этого вы запускаете код, который может установить foundSequenceDiag1 в «ложь».

Если игрок делает ход, который находится не по диагонали, проверка не запустится.

чтобы исправить:

    bool foundSequenceDiag1 = (height==width);  // true if the player played on diagonal
    if (foundSequenceDiag1) {  // loop code now only executes if player played on diagonal
        for (int i = 0; i < 3; i++) {
            if (map[i][i] != player) {
                foundSequenceDiag1 = false;
            }
        }
    }

когда вы что-то нашли, перестаньте искать.

Если бы я писал ваши чеки, я бы использовал ключевое слово break, чтобы перестать искать, как только я найду ответ.

    for (int i = 0; i < 3; i++) {
        if (map[i][i] != player) {
            foundSequenceDiag1 = false;
            break; // can't be true now, so stop checking.
        }
    }
...