Зачем создавать новый объект - Учебник по Java Tetris - PullRequest
4 голосов
/ 15 марта 2011

Я просто новичок в Java, и я нашел этот хороший учебник по созданию Java Tetris Game.

У меня нет наставника или наставника, чтобы помочь мне в этом - я искал его целую вечность :(так что в настоящее время я сам изучаю Java и PHP:)

В любом случае, вот сайт, который я нашел: http://zetcode.com/tutorials/javagamestutorial/tetris/

Один из методов программы, который я не могу найти в классе Shape.java:

public Shape rotateLeft() 
{
 if (pieceShape == Tetrominoes.SquareShape)
     return this;

 Shape result = new Shape();
 result.pieceShape = pieceShape;

 for (int i = 0; i < 4; ++i) {
     result.setX(i, y(i));
     result.setY(i, -x(i));
 }
 return result;
}

Зачем нам нужно создавать новый объект Shape result = new Shape();, если уже можно получить текущий фрагмент из переменной pieceShape?

Ответы [ 4 ]

5 голосов
/ 15 марта 2011

Кажется, в этом уроке названия немного вводят в заблуждение.Класс с именем Shape представляет один элемент, который падает.Tetrominoes enum, по-видимому, описывает , какой это тип элемента (т.е. его "форма"!).

Таким образом, код, который вы разместили, создает новый элемент и указывает его форму.

Методы rotateRight() и rotateLeft() не изменяют саму форму, позволяя методу tryMove() проверить, является ли движение допустимым, и игнорируют его, если оно не't (например, если вы повернете предмет в стену).tryMove() просто сохраняет старые значения (включая старый экземпляр Shape), когда перемещение запрещено.Если rotateLeft() / rotateRight() изменил Shape, то пришлось бы отменить эту операцию, что усложнило бы код.

Кроме того, есть несколько придирок с этим кодом:

  • Я бы назвал Tetrominoes класс Tetromino, так как типы enum обычно называются в единственном числе (поскольку вы часто ссылаетесь на элемент single : Tetromino.SquareShape.
  • Я бы добавил информацию о конкретной координате каждой Tetromino в эту enum, эффективно поместив в нее большую часть логики из метода setShape().
  • The *Класс 1039 * смешивает логику и представление, он должен быть отделен (это значительно облегчает тестирование).

    Например, класс Board может реализовывать всю логику без какой-либо графики (т.е. неt ссылается на что-либо из java.awt или javax.swing). Затем вы пишете BoardPanel, который рисует состояние Board и взаимодействует с пользователем, вызывая соответствующие Board методы.

3 голосов
/ 15 марта 2011

Метод, который вы опубликовали, возвращает форму, повернутую влево.Если бы вы не создали новую форму, исходная форма, которая является полем класса и использовалась повсеместно, была бы повернута.

В случае квадратной формы, которая не измениласьпри повороте влево вы все равно можете вернуть исходный.

0 голосов
/ 15 марта 2011

Похоже, что автор не изменяет Shape в rotateLeft(), потому что он не может быть принят как действительный ход.В Board внутренний класс TAdapter вызывает tryMove() и устанавливает текущий Shape (переменная curShape), если это допустимо.Если бы он был видоизменен до этой проверки, он должен был бы установить его обратно, если он недействителен.Возможно, метод должен называться rotatedLeftCopy(), чтобы указать, что он не меняет состояние.Или проверка должна быть выполнена заранее, и тогда rotateLeft() будет безопасно заменить Shape на месте.

0 голосов
/ 15 марта 2011

Не глядя подробно на учебник, я бы сказал так: поскольку Shape, кажется, представляет отдельный элемент, а rotateLeft() может быть методом экземпляра Shape, возможно, будет также хорошо повернуть элемент на месте,т.е. не возвращать повернутую копию, а изменить координаты блока текущей фигуры.Создание нового элемента для падения будет означать создание нового Shape с ориентацией по умолчанию.

...