Лучшие помощники
18 мая 2023 18:41
151

package com.tetris.tetris;

import java.util.Random;

enum TetraminoType {
    SQUARE_SHAPED,
    T_SHAPED,
    L_SHAPED,
    LINE_SHAPED,
    Z_SHAPED,
    INV_L_SHAPED,
    INV_Z_SHAPED;

    private static final TetraminoType[] VALUES = values();
    private static final int SIZE = VALUES.length;
    private static final Random RANDOM = new Random();

    public static TetraminoType getRandomTetramino() {
        return VALUES[RANDOM.nextInt(SIZE)];
    }
}

class Tetramino {
    BasicBlock[] blocks;
    TetraminoType type;

    Tetramino(TetraminoType type, int tetraId) {
        Coordinate[] coordinates;

        switch (type) {
            case SQUARE_SHAPED:
                coordinates = new Coordinate[]{
                        new Coordinate(0, 10),
                        new Coordinate(1, 10),
                        new Coordinate(1, 11),
                        new Coordinate(0, 11)
                };
                blocks = this.blocksGenerator(tetraId, 1, coordinates);
                break;
            case INV_L_SHAPED:
                coordinates = new Coordinate[]{
                        new Coordinate(0, 10),
                        new Coordinate(0, 11),
                        new Coordinate(1, 10),
                        new Coordinate(2, 10)
                };
                blocks = this.blocksGenerator(tetraId, 2, coordinates);
                break;
            case L_SHAPED:
                coordinates = new Coordinate[]{
                        new Coordinate(0, 11),
                        new Coordinate(0, 10),
                        new Coordinate(1, 11),
                        new Coordinate(2, 11)
                };
                blocks = this.blocksGenerator(tetraId, 3, coordinates);
                break;
            case T_SHAPED:
                coordinates = new Coordinate[]{
                        new Coordinate(1, 10),
                        new Coordinate(0, 10),
                        new Coordinate(1, 11),
                        new Coordinate(2, 10)
                };
                blocks = this.blocksGenerator(tetraId, 4, coordinates);
                break;
            case Z_SHAPED:
                coordinates = new Coordinate[]{
                        new Coordinate(1, 11),
                        new Coordinate(1, 10),
                        new Coordinate(0, 10),
                        new Coordinate(2, 11)
                };
                blocks = this.blocksGenerator(tetraId, 5, coordinates);
                break;
            case INV_Z_SHAPED:
                coordinates = new Coordinate[]{
                        new Coordinate(1, 11),
                        new Coordinate(0, 11),
                        new Coordinate(1, 10),
                        new Coordinate(2, 10)
                };
                blocks = this.blocksGenerator(tetraId, 6, coordinates);
                break;
            case LINE_SHAPED:
                coordinates = new Coordinate[]{
                        new Coordinate(0, 10),
                        new Coordinate(1, 10),
                        new Coordinate(2, 10),
                        new Coordinate(3, 10)
                };
                blocks = this.blocksGenerator(tetraId, 7, coordinates);
                break;
        }
    }

    private Tetramino(BasicBlock[] blocks) {

        this.blocks = blocks;
    }

    private BasicBlock[] blocksGenerator(int tetraId, int colour, Coordinate[] coordinates) {
        BasicBlock[] blocks = new BasicBlock[coordinates.length];
        for (int itr = 0; itr < coordinates.length; itr++) {
            blocks[itr] = new BasicBlock(colour, tetraId, coordinates[itr], BasicBlockState.ON_TETRAMINO);
        }
        return blocks;
    }

    Tetramino copy(int tetraId) {
        BasicBlock[] newBlocks = new BasicBlock[this.blocks.length];
        for (int itr = 0; itr < this.blocks.length; itr++) {
            newBlocks[itr] = this.blocks[itr].copy();
            newBlocks[itr].tetraId = tetraId;
        }
        return new Tetramino(newBlocks);
    }

    void moveDown() {

        for (BasicBlock block : blocks) {
            block.coordinate.y++;
        }
    }

    void moveLeft() {

        for (BasicBlock block : blocks) {
            block.coordinate.x--;
        }
    }

    void moveRight() {

        for (BasicBlock block : blocks) {
            block.coordinate.x++;
        }
    }

    void performClockWiseRotation() {

        BasicBlock referenceBlock = blocks[0];

        for (BasicBlock block : blocks) {
            Coordinate baseCoordinate = Coordinate.sub(block.coordinate, referenceBlock.coordinate);
            block.coordinate = Coordinate.add(Coordinate.rotateAntiClock(baseCoordinate), referenceBlock.coordinate);
        }
    }

}
      

Помогите, пожалуйста, какая тут логика класса? написано на Джаве

1 ответ
Посмотреть ответы
Этот код реализует игру Тетрис.

Класс `TetraminoType` - это перечисление, которое содержит все возможные типы тетрамино (фигурок) в игре.

Класс `Tetramino` - это класс, который представляет конкретное тетрамино в игре. Он имеет свойство `blocks`, которое является массивом объектов `BasicBlock`, представляющих отдельные блоки тетрамино. Также у него есть свойство `type`, которое определяет тип тетрамино.

Конструктор `Tetramino` создает новый объект тетрамино на основе переданного типа и идентификатора. Он использует метод `blocksGenerator`, чтобы создать массив блоков для тетрамино.

Метод `copy` создает копию тетрамино с новым идентификатором.

Методы `moveDown`, `moveLeft` и `moveRight` перемещают тетрамино вниз, влево и вправо соответственно.

Метод `performClockWiseRotation` выполняет поворот тетрамино по часовой стрелке относительно блока, который находится в верхнем левом углу тетрамино.
0
·
Хороший ответ
18 мая 2023 18:42
Остались вопросы?
Найти нужный