Реализация поля, игроков и enum к этим игрокам

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

Итак, я в игре должна создать от 1 до 6 игроков, каждый из них должен иметь по 2 фигуры, которые могут ходить по полю, обращение к фигурам должно происходить через их цвет(enum). Например вывод через toString будет выглядеть так - "PINK - A, PINK - B"(это пример одного игрока, у которого две фишки, разумеется у других будут собственные цвета, но принцип такой же).

  1. Как сделать автоматически чтобы я только вводила число игроков и они создавались автоматически без того, чтобы я не создавала обьект отдельно вручную вписывая постоянно enum?
  2. Я создала поле в 19 ячеек как массив. Как сделать так, чтобы некоторые ячейки этого поля имели определенные свойства и связать это с фигурками? Например, при посещении этого поля фигурка прыгнет на 2 хода вперед?
  3. Немного не понимаю как реализовать метод для выбора и передвижения фигур.

Буду благодарна за помощь и идеи


Ответы (1 шт):

Автор решения: Alexandr

Попробовал накидать пример создания игроков и ячеек. По поводу дополнительных свойств - можно добавить наследников класса Cell или добавить какой-нибудь новый enum со списком возможных свойств.

Код:

import lombok.Builder;
import lombok.Getter;
import lombok.ToString;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {

    enum PlayerColor {
        RED, BLUE, YELLOW, GREEN, GREY, PURPLE
    }

    enum FigureId {
        A, B
    }

    @Getter
    @Builder
    @ToString
    static class Player {
        private PlayerColor color;
    }

    @Getter
    @Builder
    @ToString
    static class Figure {
        private Player player;
        private FigureId id;
    }

    @Getter
    @Builder
    @ToString
    static class Cell {
        private int x;
        private int y;
        private Figure figure;

        public void moveTo(
                Cell cell) {
            cell.figure = figure;
            figure = null;
        }
    }

    public static void main(String... args) throws Exception {
        int numberOfPlayers = 2;
        int numberOfCells = 5;

        // Создание игроков
        List<Player> players =
                IntStream.range(0, numberOfPlayers)
                        .mapToObj(p -> Player.builder()
                                .color(PlayerColor.values()[p])
                                .build())
                        .collect(Collectors.toList());

        // Создание фигур
        List<Figure> figures =
                players.stream()
                        .flatMap(p -> Arrays.stream(FigureId.values())
                                .map(id ->
                                        Figure.builder()
                                                .id(id)
                                                .player(p)
                                                .build()))
                        .collect(Collectors.toList());

        // Создание ячеек
        List<Integer> indexes =
                IntStream.range(0, numberOfCells * numberOfCells)
                        .boxed()
                        .collect(Collectors.toList());
        List<Integer> randomIndexes =
                randomElements(
                        indexes,
                        figures.size());
        List<Cell> cells =
                indexes.stream()
                        .map(i -> {
                            int randomIndex = randomIndexes.indexOf(i);
                            return Cell.builder()
                                    .x((i / numberOfCells) + 1)
                                    .y((i % numberOfCells) + 1)
                                    .figure(randomIndex != -1 ? figures.get(randomIndex) : null)
                                    .build();
                        })
                        .collect(Collectors.toList());
        System.out.println(
                cells.stream()
                        .map(Object::toString)
                        .collect(Collectors.joining(", \n")));
    }

    private static <T> List<T> randomElements(
            List<T> list,
            int count) {
        List<T> temp =
                new ArrayList<>(list);
        Collections.shuffle(temp);
        return temp.subList(0, count);
    }

}

Результат:

Main.Cell(x=1, y=1, figure=null), 
Main.Cell(x=1, y=2, figure=null), 
Main.Cell(x=1, y=3, figure=null), 
Main.Cell(x=1, y=4, figure=null), 
Main.Cell(x=1, y=5, figure=null), 
Main.Cell(x=2, y=1, figure=null), 
Main.Cell(x=2, y=2, figure=null), 
Main.Cell(x=2, y=3, figure=Main.Figure(player=Main.Player(color=RED), id=B)), 
Main.Cell(x=2, y=4, figure=Main.Figure(player=Main.Player(color=BLUE), id=B)), 
Main.Cell(x=2, y=5, figure=null), 
Main.Cell(x=3, y=1, figure=null), 
Main.Cell(x=3, y=2, figure=null), 
Main.Cell(x=3, y=3, figure=null), 
Main.Cell(x=3, y=4, figure=null), 
Main.Cell(x=3, y=5, figure=null), 
Main.Cell(x=4, y=1, figure=null), 
Main.Cell(x=4, y=2, figure=null), 
Main.Cell(x=4, y=3, figure=null), 
Main.Cell(x=4, y=4, figure=Main.Figure(player=Main.Player(color=BLUE), id=A)), 
Main.Cell(x=4, y=5, figure=null), 
Main.Cell(x=5, y=1, figure=null), 
Main.Cell(x=5, y=2, figure=Main.Figure(player=Main.Player(color=RED), id=A)), 
Main.Cell(x=5, y=3, figure=null), 
Main.Cell(x=5, y=4, figure=null), 
Main.Cell(x=5, y=5, figure=null)
→ Ссылка