2016-03-02 2 views
-3

Итак, я занимаюсь игра-головоломкой, и у меня возникла проблема. Мой совет будет работать в программе позже. Я хочу сделать копию этого файла, прежде чем он будет скремблирован, чтобы использовать его в win-condition для моей игры. Моя идея состоит в том, чтобы сравнить скопированную доску на скремблированной доске каждый раз, когда пользователь перемещает плитку, чтобы увидеть, были ли они выиграны (выиграны) или нет. Но я немного не уверен, как сделать конструктор копирования для доски. Вот что я сделал (не работает так, как это должно быть).copy constructor [array] C++

Board::Board(int userInput) { this->gameSize = userInput; int zeroPos[2] = { 0, 0 }; SetTileNumbers(); } void Board::SetTileNumbers() { const int sizeOfGame = gameSize; //Size given from user when the board was created. int tileNumber = 0; //The value given to each Tile.Number. int row, column; boardOfTiles = new Tile* [sizeOfGame]; for (int i = 0; i < sizeOfGame; i++) { boardOfTiles[i] = new Tile [sizeOfGame]; //The doublepointer is given an additional dimension } for (row = 0; row < sizeOfGame; row++) { for (column = 0; column < sizeOfGame; column++) { boardOfTiles[row][column].number = tileNumber; //Loops that goes through the entirety to instantiate the board of tiles. tileNumber++; } } } void Board::SetTileNumbers(const Board& copy) { const int sizeOfGame = copy.gameSize; int row , column; boardOfTiles = new Tile*[sizeOfGame]; for (int i = 0; i < sizeOfGame; i++) { boardOfTiles[i] = new Tile[sizeOfGame]; } for (row = 0; row < sizeOfGame; row++) { for (column = 0; column < sizeOfGame; column++) { boardOfTiles[row][column].number = copy.boardOfTiles[row][column].number; } } }

+0

Как он работает не так, как ожидалось? – ZivS

+1

Как насчет использования 'std :: array' и сделать вашу жизнь проще? –

+0

В чем вопрос? Вы отправили код не из конструктора копии. – interjay

ответ

0

Я надеюсь, что это не звучит по теме, но копировать-конструктор в сторону, я думаю, что вы, возможно, другая проблема: как вы решаете на решение очень неэффективно. Вы тратите время процессора и теряете память.

Для каждого шага сравнения двух плат NxN примерно так же неэффективно, как и получается. Вы можете попробовать другой подход: назначьте номер каждой позиции на доске, и вы знаете, что решение состоит в том, чтобы отсортировать номера в определенном порядке.

Для 3x3 доски, «The» решение будет выглядеть следующим образом:

1 2 3 
4 5 6 
7 8 9 

Кроме того, 2d массив хранится в памяти в виде непрерывного массива, можно рассматривать решение как массив:

1 2 3 4 5 6 7 8 9 

Любое другое соглашение не будет представлять собой решение. Проверка погоды, которую сортирует массив, намного проще решить. В худшем случае вы все еще смотрите на O (n^2), чтобы проверить, отсортирован ли массив, но без накладных расходов на память. Плюс я уверен, что вы можете найти более эффективный алгоритм, чтобы проверить, отсортирован ли массив.

Надеюсь, это поможет ...