Задание: Осталось совсем немного! У нас есть способ вычислить эффективность любого хода, а также мы можем их сравнивать между собой.

Давай реализуем метод autoMove в классе Model, который будет выбирать лучший из возможных ходов и выполнять его.

Сделаем так:

1) Создадим локальную PriorityQueue с параметром Collections.reverseOrder() (для того, чтобы вверху очереди всегда был максимальный элемент) и размером равным четырем.

2) Заполним PriorityQueue четырьмя объектами типа MoveEfficiency (по одному на каждый вариант хода).

3) Возьмем верхний элемент и выполним ход связанный с ним.

После реализации метода autoMove добавим его вызов в метод keyPressed класса Controller по нажатию на клавишу A (код — KeyEvent.VK_A).

P.S. В качестве факультативного задания можешь почитать про указатели на методы и попробовать передать аргумент в метод getMoveEfficiency используя оператор «::«. Для метода left должно получиться getMoveEfficiency(this::left). Альтернативно можешь использовать внутренний анонимный класс.

Моя реализация методов:

public void autoMove() {
    PriorityQueue<MoveEfficiency> moves = new PriorityQueue<>(Collections.reverseOrder());
    moves.offer(getMoveEfficiency(new Move() {
        @Override
        public void move() {
            left();
        }
    }));
    moves.offer(getMoveEfficiency(new Move() {
        @Override
        public void move() {
            right();
        }
    }));
    moves.offer(getMoveEfficiency(new Move() {
        @Override
        public void move() {
            up();
        }
    }));
    moves.offer(getMoveEfficiency(new Move() {
        @Override
        public void move() {
            down();
        }
    }));
    moves.peek().getMove().move();
}

@Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == VK_ESCAPE) {
        resetGame();
    }
    if (e.getKeyCode() == VK_Z) {
        model.rollback();
    }
    if (!model.canMove()) {
        view.isGameLost = true;
    }
    if (!view.isGameLost && !view.isGameWon) {
        if (e.getKeyCode() == VK_LEFT) {
            model.left();
        }
        if (e.getKeyCode() == VK_RIGHT) {
            model.right();
        }
        if (e.getKeyCode() == VK_UP) {
            model.up();
        }
        if (e.getKeyCode() == VK_DOWN) {
            model.down();
        }
        if (e.getKeyCode() == VK_R) {
            model.randomMove();
        }
        if (e.getKeyCode() == VK_A) {
            model.autoMove();
        }
    }
    if (model.maxTile == WINNING_TILE) {
        view.isGameWon = true;
    }
    view.repaint();
}

Валидатор выдаёт ошибку, все четыре необходимых пункта (какой конкретно не проходит - не могу посмотреть) в моём коде, вроде бы, выполняются. Что ему не нравится?

задан 20 Мар, 06:51

FullHD's gravatar image

FullHD
245
одобрено: 0%

изменено 20 Мар, 06:52


Размер очереди должен быть 4. В конструктор первым параметром передай

ссылка

опубликован 20 Мар, 13:38

alucard's gravatar image

alucard
362
одобрено: 100%

Благодарю.

(20 Мар, 19:19) FullHD
Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×11

Задан: 20 Мар, 06:51

Просмотров: 332 раз

Отредактирован: 20 Мар, 19:19