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

Скачать игру можно здесь - Пятнашки (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. О них я подробнее расскажу в других статьях по графическим интерфейсам.
Вот и все на сегодня. Жду вопросов и комментариев.
Комментариев: 3
Выйти
Антон Петров:
скажи я вот коопилирую твою прогу а мне выдают ошибку Ошибка: ( 9 , 8 ) Java : класс Пятнашки является публичным , должен быть объявлен в файле с именем Pyatnashki.java
Konstantin Chapiuk:
Ну как бы в этом сообщении об ошибке и кроется ответ на вопрос ) Либо назови класс Pyatnashki, либо переименуй файл в Пятнашки.java
Sergey Tkach:
так как ошибку эту исправить?