c ++ int в классе получает значение, казалось бы, из ниоткуда - PullRequest
0 голосов
/ 26 мая 2020

int winner должен быть установлен на 2 при определенных условиях, но он каким-то образом устанавливается на множество более высоких значений, чаще всего 6. Я понятия не имею, как это происходит, поскольку в моем классе нет другой функции, которая влияет на winner, а эта переменная даже нигде в программе не упоминается. Что меня больше всего сбивает с толку, так это то, что у меня есть почти идентичная функция (P2Move()), которая буквально идентична тому, как она устанавливает переменную winner в P1Move(), и эта функция работает отлично.

Некоторые информация: класс, частью которого он является, называется Board, который действует как массив шахматной доски, состоящий из объектов класса Square.

Ниже приведена функция, вызывающая проблему. Внизу, оператор else if((canTake.size()==0)&&(canMove.size()==0)) {Board::winner = 2;} вызывает проблему. Все остальное, кажется, работает, когда я удаляю часть problemati c из функции, но мне нужно, чтобы эта часть работала, чтобы отправить окончательный проект.

void Board::P1Move()
{
    P1pieces = 0;
    std::vector <Move> canMove;
    std::vector <Move> canTake;

    for(int j = 0; j < bSize; j++)
    { //Start of j loop.
        for(int i = 0; i < bSize; i++)
        { //Start of i loop.
            Square sq = board[i][j];
            bool cTakeL = canTakeL(i,j);
            bool cTakeR = canTakeR(i,j);
            bool cMoveL = canMoveL(i,j);
            bool cMoveR = canMoveR(i,j);

            if(board[i][j].getPl() == P1)
            {
                P1pieces++;
                if(cTakeL)
                {
                    Move a = Move(sq.getIndex(),board[i-2][j+2].getIndex(),board[i-1][j+1].getIndex(),0);
                    canTake.push_back(a);
                }
                if(cTakeR)
                {
                    Move b = Move(sq.getIndex(),board[i+2][j+2].getIndex(),board[i+1][j+1].getIndex(),0);
                    canTake.push_back(b);
                }
                if(cMoveL)
                {
                    Move c = Move(sq.getIndex(),board[i-1][j+1].getIndex(),0,0);
                    canMove.push_back(c);
                }
                if(cMoveR)
                {
                    Move d = Move(sq.getIndex(),board[i+1][j+1].getIndex(),0,0);
                    setWinner(d.getSpos());
                    canMove.push_back(d);
                }
            }
        } //End of i loop.
    } //End of j loop.

    if(canTake.size()!=0)
    {
        time_t t;
        time(&t);
        srand(t);
        int moveNum = rand()%canTake.size();
        std::string output = "p1 ";
        Move out = canTake.at(moveNum);
        int i = 0;
        int j = 0;
        for(int y = 0; y < bSize; y++)
        {
            for(int x = 0; x < bSize; x++)
            {
                if(board[x][y].getIndex()==out.getSpos())
                {
                    i = x;
                    j = y;
                }
            }
        }
        if(board[i-2][j+2].getIndex()==out.getEndPos())
        {
            board[i-2][j+2].setOcc(true);
            board[i-2][j+2].setPl(P1);
            board[i-1][j+1].setOcc(false);
            board[i-1][j+1].setPl(NA);
        }
        else if(board[i+2][j+2].getIndex()==out.getEndPos())
        {
            board[i+2][j+2].setOcc(true);
            board[i+2][j+2].setPl(P1);
            board[i+1][j+1].setOcc(false);
            board[i+1][j+1].setPl(NA);
        }
        output = output + out.toString();
        setCmove(output);
        board[i][j].setOcc(false);
        board[i][j].setPl(NA);
    }
    else if(canMove.size()!=0)
    {
        time_t t;
        time(&t);
        srand(t);
        int moveNum = rand()%canMove.size();
        std::string output = "p1 ";
        Move out = canMove.at(moveNum);
        int i = 0;
        int j = 0;
        for(int y = 0; y < bSize; y++)
        {
            for(int x = 0; x < bSize; x++)
            {
                if(board[x][y].getIndex()==out.getSpos())
                {
                    i = x;
                    j = y;
                }
            }
        }
        if(board[i-1][j+1].getIndex()==out.getEndPos())
        {
            board[i-1][j+1].setOcc(true);
            board[i-1][j+1].setPl(P1);
        }
        else if(board[i+1][j+1].getIndex()==out.getEndPos())
        {
            board[i+1][j+1].setOcc(true);
            board[i+1][j+1].setPl(P1);
        }
        output = output + out.toString();
        setCmove(output);
        board[i][j].setOcc(false);
        board[i][j].setPl(NA);
    }
    else if((canTake.size()==0)&&(canMove.size()==0))
    {
        Board::winner = 2;
    }
    P1pieces = canTake.size() + canMove.size();
}

1 Ответ

0 голосов
/ 26 мая 2020

Вы работаете с std::vector, и это хорошо. (Слишком много начинающего "C ++" кода использует массивы C.) Шаблон класса vector позволяет довольно легко узнать, есть ли и где у вас может быть доступ за пределы (как предлагается в комментариях) :

Вместо доступа к элементам вектора с помощью operator[] измените свой код, чтобы использовать функцию-член .at(). .at() проверяет границы и генерирует исключение, если вы выходите за пределы (вместо того, чтобы молча нарушать вашу программу).

В производственном коде operator[] обычно предпочтительнее, так как пропускает границы проверка более эффективна. Но во время обучения .at() может вам немного помочь.

Кроме того, привычка использовать средства проверки кода, такие как valgrind или макрос assert проверять свои предположения - это хорошо, даже когда вы прошли точку, в которой вы больше не будете использовать .at().

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