Как создать «рисовать пул» плиток, используя перечисление в Java

Я хотел бы выяснить, как перечисления работают в Java, создав приложение, которое имеет пул «пригодных для рисования плиток», которые передаются в «руку игрока». Я борюсь с этой концепцией, кто-то может помочь?

Если у меня есть перечисление, подобное приведенному ниже, как я могу использовать его, чтобы сделать так, чтобы у него было 4 копии каждого из его значений, что в сумме составляло 136 «плиток»? Я хотел бы использовать эти «136 плиток» в качестве исчерпывающего пула, чтобы пользователь мог извлечь из него и поместить «плитку», которую он нарисовал, в свою собственную «руку» (я думаю, также перечисление?)

Проблема: я использую эту функцию, используя простой список строк, но я нашел библиотеку с открытым исходным кодом ( mahjong4j ), которую я хочу использовать. Как мне подойти к этому? Должен ли я создать 2 новых перечисления? Один, содержащий 4 копии каждой плитки и один для руки этого игрока? Затем переходить от одного к другому, как список?

Это Enum :

public enum Tile {
    M1(0, MANZU, 1),
    M2(1, MANZU, 2),
    M3(2, MANZU, 3),
    M4(3, MANZU, 4),
    M5(4, MANZU, 5),
    M6(5, MANZU, 6),
    M7(6, MANZU, 7),
    M8(7, MANZU, 8),
    M9(8, MANZU, 9),

    P1(9, PINZU, 1),
    P2(10, PINZU, 2),
    P3(11, PINZU, 3),
    P4(12, PINZU, 4),
    P5(13, PINZU, 5),
    P6(14, PINZU, 6),
    P7(15, PINZU, 7),
    P8(16, PINZU, 8),
    P9(17, PINZU, 9),

    S1(18, SOHZU, 1),
    S2(19, SOHZU, 2),
    S3(20, SOHZU, 3),
    S4(21, SOHZU, 4),
    S5(22, SOHZU, 5),
    S6(23, SOHZU, 6),
    S7(24, SOHZU, 7),
    S8(25, SOHZU, 8),
    S9(26, SOHZU, 9),

    TON(27, FONPAI, 0),//東
    NAN(28, FONPAI, 0),//南
    SHA(29, FONPAI, 0),//西
    PEI(30, FONPAI, 0),//北

    HAK(31, SANGEN, 0),//白
    HAT(32, SANGEN, 0),//発
    CHN(33, SANGEN, 0);//中

    private int code;
    private TileType type;
    private int number;

    Tile(int code, TileType type, int number) {
        this.code = code;
        this.type = type;
        this.number = number;
    }

Всего 1 ответ


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

Во-первых, когда у вас есть набор возможных плиток, стопка или колода всех плиток определенно не должны быть перечислением. Скорее это должен быть List (или другая коллекция, которая допускает дублирование). Таким образом, вы можете перетасовать это, иметь дело с этим и т.д.

Во-вторых, ваше имя enum действительно содержит 2 элемента информации - тип и номер. Это часто является признаком того, что вам лучше разделить их.

Если цель использования enum состоит в том, чтобы разрешить особые случаи для определенных тайлов, то вы можете объединить подход, используя свой enum для реализации интерфейса.

Вот потенциальный альтернативный дизайн для вас, чтобы рассмотреть:

enum TileType { ... };

interface Tile {
    String getName();
    int getCode();
    TileType getType();
}

class StandardTile implements Tile {
    ...
}

enum FonpaiTile implements Tile {
    TON, NAN, SHA, PEI;
    public TileType getType() { return TileType.FONPAI; }
}

enum SangenTile implements Tile {
    HAK, HAT, CHN;
    public TileType getType() { return TileType.SANGEN; }
}

class TileSet {
    private final Set<Tile> tiles = new HashSet<>();
    private int id = 0;
    public TileSet() {
        // create all the standard and special tiles and add to set
    }
}

class Pool {
    private final List<Tile> tiles = new ArrayList<>();

    public Pool() {
        TileSet tileSet = new TileSet();
        for (int i = 0; i < 4; i++)
            tiles.addAll(tileSet);
        ...
        Collections.shuffle(tiles);
    }

    public Tile takeTile() {
        return tiles.remove(0);
    }

    public boolean isEmpty() {
        return tiles.isEmpty();
    }
}

Таким образом, вы все равно можете использовать такие условия, как tile == SangenTile.CHN чтобы при необходимости кодировать специальные условия.


Есть идеи?

10000