Javenue logo

Javenue

Программирование на Java

Информационные технологии

Java игра Пятнашки - Swing GUI

Дело было вечером. Делать было нечего.

Вот и решил написать простенькую игрушку на Java. Первое, что пришло на ум, - знаменитая игра "пятнашки". Дружественный интерфейс :) решено было создать с использованием Java Swing.


Игра Пятнашки на Java

Скачать игру можно здесь - Пятнашки (5Kb). Предполагается, что как минимум JRE - Java Runtime Environment - у вас есть. Если так - просто дваджы кликните на pyatnashki.jar или по-взрослому запустите из консоли с помощью команды:

    java -jar pyatnashki.jar

С момента написания мною этого поста, уже более 100 человек просили выслать им исходный код. Конечно же все просьбы я удовлетворил. Думаю, все-таки стоит выложить исходный код и алгоритм данной программы на всеобщее обозрение - скачать java код пятнашек.

Код писался давно (в 2005 году) и на скорую руку, так что не судите строго. Как-нибудь обязательно найду время и приведу все в порядок.

Ну а пока что несколько комментариев по коду. Кстати, небольшую обзорную статью про Java Swing можно найти здесь.

Для создания меню написан следующий метод:

    private void createMenu() {
        JMenuBar menu = new JMenuBar();
        JMenu fileMenu = new JMenu("File");

        for (String fileItem : new String [] { "New", "Exit" }) {
            JMenuItem item = new JMenuItem(fileItem);
            item.setActionCommand(fileItem.toLowerCase());
            item.addActionListener(new NewMenuListener());
            fileMenu.add(item);
        }
        fileMenu.insertSeparator(1);

        menu.add(fileMenu);
        setJMenuBar(menu);
    }

В экземпляр класса JMenuBar - специальной панели для меню - добавляем необходимые нам менюшки. В нашем случае это File, который состоит из нескольких пунктов JMenuItem.

С каждым пунктом меню можно ассоциировать слушатель события нажатия пользователем. Я сделал общий слушатель - NewMenuListener, который наследуется от ActionListener. Чтобы различать пункты меню, предварительно для каждого пункта был установлен алиас с помощью вызова setActionCommand. Для группировки пунктов меню пригодится метод insertSeparator.

Метод generate случайным образом размещает пятнашки. Вы наверное обратили внимание на то, что генерация происходит в цикле до тех пор, пока метод canBeSolved не вернет значение true.

Все дело в том, что половина всех возможных комбинаций пятнашек не имеет решения. То есть вы получите практически собранную головоломку, в которой цифры 14 и 15 перепутаны местами.

    private boolean canBeSolved(int[] invariants) {
        int sum = 0;
        for (int i = 0; i < 16; i++) {
            if (invariants[i] == 0) {
                sum += i / 4;
                continue;
            }

            for (int j = i + 1; j < 16; j++) {
                if (invariants[j] < invariants[i])
                    sum ++;
            }
        }
        System.out.println(sum % 2 == 0);
        return sum % 2 == 0;
    }

Способ определения того, является ли комбинация решаемой, был взят с Wikipedia:

Пусть квадратик с числом i расположен до (если считать слева направо и сверху вниз) k квадратиков с числами меньшими i. Будем считать n_i = k , то есть если после костяшки с i-м числом нет чисел, меньших i, то k = 0. Также введем число e — номер ряда пустой клетки (считая с 1). Если сумма

Инвариант пятнашек

является нечётной, то решения головоломки не существует.

Наконец, метод checkWin проверят после каждого хода, решена ли головоломка. Если решена, то выводится сообщение о победе.

Чтобы вывести всплывающее сообщение используется метод JOptionPane.showMessageDialog(). MessageDialog бывают нескольких видов и определяются константами:

  • сообщение об ошибке - ERROR_MESSAGE;
  • информационное сообщение - INFORMATION_MESSAGE;
  • предупреждение - WARNING_MESSAGE;
  • вопрос - QUESTION_MESSAGE;
  • обічное сообщение - PLAIN_MESSAGE.

Кроме всплывающих диалогов есть еще другие диалоги, например ConfirmDialog или InputDialog. О них я подробнее расскажу в других статьях по графическим интерфейсам.

Вот и все на сегодня. Жду вопросов и комментариев.



Комментариев: 2

  Выйти

  * для публикации комментариев нужно  

Антон Петров:

скажи я вот коопилирую твою прогу а мне выдают ошибку Ошибка: ( 9 , 8 ) Java : класс Пятнашки является публичным , должен быть объявлен в файле с именем Pyatnashki.java

Konstantin Chapiuk:

Ну как бы в этом сообщении об ошибке и кроется ответ на вопрос ) Либо назови класс Pyatnashki, либо переименуй файл в Пятнашки.java