Шахматы на android [закрыт]

110
17 февраля 2021, 15:40
Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 1 год назад.

Улучшить вопрос

Пишу шахматы с простеньким (пока что) ИИ на java. Уже вся логика игры есть. Написал простенькую визуализацию на javafx, все нормально. Решил переписать на свой android и понял, что это волокита та еще. Я прошу помочь с написанием по большей части графики. Итак, что мне нужно:

1) У меня есть png всех фигур и доски тоже. Нужно чтобы доска была в центре по всей ширине экрана. При этом я должен знать ее верхний левый угол, чтобы

2) еще должен быть listener для нажатия по экрану и с помощью координат угла доски я определял какая клетка нажата (что-то типа i = (int) getX / CELL_SIZE)) для совершения хода player.move(x1,y1,x2,y2).

3) На доске должны быть фигурки. У меня уже есть метод player.move(). После него должны произойти обновления позиций. То есть я пробегаю forx(1...8) fory(1...8), получаю метод toString() фигуры на этой позиции (например получаю BLACK_BISHOP) и вас прошу помочь только чтобы на этой позиции выводилась png фигуры toString(). Ну и наверное, это должно с каждым ходом перерисовываться.

Использую android studio.

Answer 1

Удачность описанного движка вызывает некоторые сомнения... Но если работает, то это не по теме :)

Во первых очень надеюсь, что ваш движок абстрагирован от интерфейса, иначе придется править почти все...

Вам нужно в первую очередь определиться со способом управления. Либо вы используете drag & drop, либо первым тапом выделяете клетку с фигурой, вторым- клетку куда хотите эту фигуру переместить.

Если первый вариант, то вам придется делать примерно следующее:

  • Создаем класс клетки, наследованный от View. Он должен знать какая он клетка(координаты), и в зависимости от координат определять свой цвет и закрашиваться им
  • Основное поле содержит наследованный от AbsoluteLayout(мне кажется с ним получить квадратные клетки будет проще всего) элемент. В нем программно создаем 64 клетки, в методе layout определяем ширину нашей доски, вычисляем положение каждой клетки и передаем в нее, вызывая для каждой клетки ее layout(l,t,r,b)
  • Создаем класс фигуры. Он должен знать что это за фигура и иметь ссылку на свою клетку. Из клетки он берет rigth, top, left, bottom и ставит себе себе такие же. Из типа фигуры - нужную картинку и отрисовывает внутри себя. Так мы получаем размеченное поле с фигурами на нем
  • Фигурки учим передвигаться с помощью Drag & Drop. Он реализован в андроиде, гуглите

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

Попробуйте податься в какой-то из вариантов, будут более конкретные вопросы - пишите

Пример для второго варианта

public class BoardView extends View {
    private int width = 0, height = 0;
    private float startx, starty, board_size;
    private Paint black = new Paint();
    private Paint white = new Paint();
    {
        black.setColor(Color.BLACK);
        white.setColor(Color.WHITE);
    }
    public BoardView(Context context) {
        super(context);
    }
    public BoardView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public BoardView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    public void layout(int l, int t, int r, int b) {
        super.layout(l, t, r, b);
        //layout срабатывает, когда уже точно определено положение вьюшки
        //запоминаем в этот момент ширину и высоту
        width = r - l;
        height = b - t;
        //определяем размер доски в пикселях и координаты верхнего левого угла
        if (width > height) {
            starty = 0;
            startx = (width - height) / 2f;
            board_size = height;
        } else {
            startx = 0;
            starty = (height - width) / 2f;
            board_size = width;
        }
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //рисуем черный квадрат во всю доску
        canvas.drawRect(startx, starty, startx + board_size, starty + board_size, black);
        //и теперь белые квадратики в шахматном порядке
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if((i + j)%2 == 0)
                    continue;
                canvas.drawRect(
                        startx + i * board_size / 8f,
                        starty + j * board_size / 8f,
                        startx + (i + 1) * board_size / 8f,
                        starty + (j + 1) * board_size / 8f,
                        white);
            }
        }
    }
}
READ ALSO
CompletableFuture not completed

CompletableFuture not completed

Request прекрасно работает - уходит на сервер, сервер его принимаетЗатем должен прийти ответ от сервера

94
Помогите с BeanPostProcessor, не отрабатывает

Помогите с BeanPostProcessor, не отрабатывает

Всем приветСтолкнулся с такой проблемой: Написал свой BeanPostProcessor для того, чтобы все методы, которые помечены моей аннотацией @Timing, выводил...

102
Получить доступ к переменной из класса наследника

Получить доступ к переменной из класса наследника

Мне нужно записать переменную page из класса bumaga в массив All чтобы потом её вывестиКак это сделать с помощью get и set?

129
Возможно ли boolean перевести в int

Возможно ли boolean перевести в int

Возможно ли boolean перевести в int для сортировки с помощью Comparable

102