Как 2D-массив может изменить значение, если объект, в котором он хранится, никогда не обращается? - PullRequest
0 голосов
/ 11 марта 2020

Я кодирую шахматы и создал класс BoardObject для хранения состояний доски, поэтому у меня есть список из них, что делает историю игры. BoardObject имеет поле BoardValues, которое представляет собой двумерный массив, в котором хранятся значения каждого квадрата на доске.

В то время как l oop, где играется, если пользовательский ввод проходит мои проверки достоверности , ход, который они вводят, передается в метод с именем movePieceTrad. Во время movePieceTrad список BoardHistory каким-то образом изменяется для обновления только что сделанным ходом. Вот проблема: нигде в movePieceTrad нет ни BoardBistory, ни любого BoardObject. Я просмотрел с помощью ctrl + f, каждая ссылка на boardHistory находится в основном методе.

В приведенном ниже коде при отладке lastInBoardHistory2 отличается от того, что lastInBoardHistory1 было до movePieceTrad, но lastInBoardHistory1 также меняется, когда я go через movePieceTrad, что лишено смысла еще раз. Что происходит?

lastInBoardHistory1 = boardHistory[boardHistory.Count - 1].getBoardValues();
movePieceTrad(arr[0], arr[1]);
lastInBoardHistory2 = boardHistory[boardHistory.Count - 1].getBoardValues();

Вот код для класса BoardObject

namespace chess_v1
{
    class BoardObject
    {
        private int[,] boardValues;
        public int[,] possibleEnPassants;
        public int[,] castlePiecesMoved;
        public int turn = 0;

        public BoardObject(int[,] squareValues, int[,] pep, int[,]castleInfo, int inputTurn)
        {
            boardValues = squareValues;
            possibleEnPassants = pep;
            castlePiecesMoved = castleInfo;
            turn = inputTurn;
        }

        public int[,] getBoardValues()
        {
            return boardValues;
        }
    }
}

1 Ответ

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

Хорошо, я решил это.

При создании BoardObject я передал входные 2D-массивы и просто установил их равными моим полевым 2D-массивам в BoardObject. Поскольку двумерные массивы являются массивами ссылок на места в памяти, а не автономными массивами массивов, это означало, что в конечном итоге я просто передавал ссылки в моей основной панели методов на поля в каждом BoardObject. Таким образом, когда я перемещал фигуру (изменяя значения внутри доски основного метода), BoardObject, на самом деле каждый BoardObject, также менялся.

Исправление заключается в том, что вместо передачи ссылочных массивов в конструктор BoardObject, я передаю значения с вложенными циклами for. Я проверил функциональность, которая должна была работать до этой проблемы, и теперь все работает отлично!

Это новый код BoardObject; Мне не нужно было ничего менять вне этого:

namespace chess_v1
{
    class BoardObject
    {
        public int[,] boardValues = new int[8,8];
        public int[,] possibleEnPassants = new int[8,2];
        public int[,] castlePiecesMoved = new int[2,3];
        public int turn = 0;

        public BoardObject(int[,] squareValues, int[,] pep, int[,]castleInfo, int inputTurn)
        {
            for (int i = 0; i < 8; i++)
            {
                for (int k = 0; k < 8; k++)
                {
                    boardValues[i, k] = squareValues[i, k];
                }
            }
            for (int i = 0; i < 8; i++)
            {
                for (int k = 0; k < 2; k++)
                {
                    possibleEnPassants[i, k] = pep[i, k];
                }
            }
            for (int i = 0; i < 2; i++)
            {
                for (int k = 0; k < 3; k++)
                {
                    castlePiecesMoved[i, k] = castleInfo[i, k];
                }
            }
            turn = inputTurn;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...