JavaRush/Java блог/Архив info.javarush/Сделал игру "Восьмяшки"
don_bunny
26 уровень

Сделал игру "Восьмяшки"

Статья из группы Архив info.javarush
участников

Салют, друзья!

Пару дней назад я подумал, что одним чтением лекций и решением типовых задач сыт не будешь. Во всяком случае, полученные знания нужно не просто отрабатывать на "кошках", но и куда-то направлять. Конечно же, мне захотелось сделать игру ^_^. Немного поразмыслив, нашёл наиболее доступной тему двумерных массивов ("Пятнашки", 2048, Тетрис, да хоть змейку запускай!).

Восьмяшки, Console

Остановился на "Пятнашках" (благо, вырос на этой игре. Знаю, что и как там работает). В общем, решение принято, код начал писаться. Перво-наперво всё опробовал в консоли. Поле 2х2 собирать для теста, конечно же, не комильфо. Слишком часто выпадают тупиковые комбинации. А вот 3х3 уже приятнее (кстати, именно из-за размеров поля было принято название игры). В процессе столкнулся с потоками (Наконец-то! Мы столкнулись лицом к лицу с врагом. Оказывается, их можно укротить и научить работать тебе на благо. Я счастлив)).

Работа с библиотекой SWING

Чуть позже просмотрел возможности библиотеки SWING и успешно облачил игру в какой-ни какой интерфейс. Теперь в игре доступен выбор поля. Тест показал, что игра без проблем обрабатывает все ошибки. А при работе с полем 3х3 даёт 100% ответ на вопрос "Решается ли задача?". К сожалению, примера кода под рукой не было. Пришлось всю логику писать самому. Возможно наличие велосипедов (если таковые есть, тыкните меня в них носом, пожалуйста). Так же у меня огромные вопросы по чистоте и удобочитаемости кода. Очень хочется, чтобы меня если и не благодарили за чистый код, то уж точно не проклинали за мусор))) И конечно же - наличие комментариев - где их не хватает? Если у вас есть рекомендации/пожелания по коду - дайте знать. Если вы хотите присоединиться к проекту - дайте знать. С удовольствием объединюсь с кем-нибудь для работы над этим и другими проектами. ссылка на GitHub
Комментарии (14)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Joysi
Уровень 41
4 мая 2016, 21:01
Привет!
Хорошо, что изучаете новое (Swing, я сам, правда, смотрю в сторону JavaFx2 в части десктоп GUI).
Немного замечаний:
1) Чуть причесать User Interface (для малых размеров, например, 4х4 — не влезают надписи и заголовок окна).
2) По коду.
2.1) Сама IDEA подсказывает что лучше сделать private поля объекта.
2.2) Reader — весь функционал в одном файле. Ладно тут логика и реакция на действия пользователя простая. А что чуть посложнее (например Minesweaper) — код будет сильно разбухать. Я бы разбил на три класса: Matrix (игровое поле), handler( реакцию на разбор действий пользователя) и основной цикл игры. А тут получается что handler определяет логику завершения игры.
Я не знаю на каком уровне JavaRush Вы сейчас. Но в 20х есть задачи на разработки игр с учетом прозрачной композиции кода.

А так — хорошо.
don_bunny
Уровень 26
5 мая 2016, 17:40
Спасибо за рекомендации.
Уже привязал размеры окна к задаваемому размеру поля. Думаю, что можно поле ограничить в 7 ячеек. Уж больно долго собирается головоломка))

Joysi, у меня к вам вопрос по Git. Я старался все бинарники игнорировать. Однако, если игнорировать бинарники классов из папки
\out\production\BarleyBreak\
, то после первого клонирования репозитория (на машину, где не было этого проекта) возникают проблемы с инициализацией классов. Как быть? На данный момент эта папка не добавлена в игнор-лист.
Fry
Уровень 41
5 мая 2016, 17:43
мавеном собирать проект
don_bunny
Уровень 26
5 мая 2016, 17:51
Уже разобрался. Когда заметил «проблему», я совсем не подумал о компиляции перед запуском))
don_bunny
Уровень 26
5 мая 2016, 17:52
Maven нужно предварительно устанавливать?
Fry
Уровень 41
5 мая 2016, 17:59
да
don_bunny
Уровень 26
5 мая 2016, 18:12
Maven сложен в освоении?
don_bunny
Уровень 26
5 мая 2016, 18:16
О каких приватных полях вы говорили? Мне IDEA ничего не предлагает, ничего не подчёркивает.
Я тут подумал, может речь идёт о булевых gameOver и stopThread?
Сделал их приватными. На всякий случай))
AndreGold
Уровень 28
5 мая 2016, 18:50
BarleyBreak.iml тоже в .gitignore добавьте, это файл от Intellij Idea, как и папка .idea.

По факту в репозитории на гитхабе у Вас должны быть только «сорцы» и помник.

И разделите логику в классах.
Название классов, должно само за себя говорить, чтобы Вы могли опеределить, что делает/или каково описание класса даже не взглянув на его код.
А у Вас
public class Reader extends JFrame


ни в жизнь бы не догадался о том, для чего предназначен этот класс
AndreGold
Уровень 28
5 мая 2016, 18:55
в принципе в этом ничего плохого нет, все через это приходили, понимание, как действовать через ООП стиль придет с желанием подрефакторить свой код, и переписав раз 10 разными путями вы поймете, что да как.

Еще классы, связаны между собой, такого быть не должно, Вы взаимойдествуете с JFrame в одном классе и в другом тоже.
Joysi
Уровень 41
5 мая 2016, 19:26
я об
JButton b1;
JLabel l0, l1, l2, l3;
JTextField t1, t2;
eHandler handler = new eHandler();
ArrayList<JButton> buttons = new ArrayList<JButton>();
String[][] matrix;
String[][] result;
int counter = 0;
boolean gameOver = false;
boolean stopThread = false;

Ну и название переменных более осмысленные сделать…
don_bunny
Уровень 26
6 мая 2016, 01:03
Класс Reader теперь абстрактный FrameCreator, от него унаследовал два класса MainFrame и FieldFrame. Постарался максимально спрятать реализацию в классы. Общие поля вывел во FrameCreator. Там же оставил слушателя.

Перенести туда же размеры создаваемых классов не сумел. В результате получал пустую форму MainFrame, а FieldName был настолько малым по высоте, что туда даже не вмещались кнопки. Однако, клавиши с цифрами на форме были-таки)

Я всё правильно сделал?
don_bunny
Уровень 26
7 мая 2016, 00:14
Кажется, я понял, о чём вы) Выложился сегодня на свой максимум. Как ещё улучшить — не знаю)
Joysi
Уровень 41
7 мая 2016, 01:32
Уже много лучше.
Рефакторить можно много, каждый сам определяет его остановку. Например, вынести все константы (в том числе и строковые в единое хранилище — Properties и т.п., чтобы не лазить в код классов, например, если вы захотели поменять размер кнопок, сменить сообщения и т.п. ).