Як написати свій тетріс на java за півгодини

Як написати свій тетріс на java за півгодини

Нам, як завжди, знадобляться:

  • 30 хвилин вільного часу;
  • Налагоджена робоче середовище, тобто JDK і IDE (наприклад, Eclipse);
  • Бібліотека LWJGL (версії 2.x.x) для роботи з графікою (опціонально). Зверніть увагу, що для LWJGL версій вище 3 потрібно написати код, що відрізняється від того, що наведено в статті;
  • Спрайт, тобто картинки плиток всіх можливих станів (порожня, і зі ступенями двійки до 2048). Можна намалювати самому, або завантажити що використовувалися при написанні статті.

З чого почати?

Почати варто з головного керуючого класу, який в нашому проекті знаходиться вище за інших за рівнем абстракції. Взагалі відмінний рада - на початку роботи завжди пишіть код виду if (getKeyPressed ()) doSomething (). так ви швидко визначите фронт робіт.

Всі дані від введення ми просто зберігаємо в відповідні поля, дії на основі них буде виконувати метод logic ().

Тепер вже потихеньку стає зрозуміло, що нам необхідно. По-перше, нам потрібні клавіатурний і графічний модулі. По-друге, потрібно якось зберігати напрям, який гравець вибрав для зсуву. Друге завдання вирішується просто - створимо enum з трьома станами: AWAITING, LEFT, RIGHT. Навіщо потрібен AWAITING. Щоб зберігати інформацію про те, що зрушення не потрібно (використання в програмі null слід всіма силами уникати). Перейдемо до інтерфейсів.

Інтерфейси для клавіатурного і графічного модулів

Так як багатьом не подобається, що я пишу ці модулі на LWJGL, я вирішив в статті приділити час тільки інтерфейсів цих класів. Кожен може написати їх за допомогою тієї GUI-бібліотеки, яка йому подобається (або взагалі зробити консольний варіант). Я ж по-старому реалізував їх на LWJGL, код можна подивитися тут в папках graphics / lwjglmodule і keyboard / lwjglmodule.

Інтерфейси ж, після додавання в них всіх згаданих вище методів, будуть виглядати наступним чином:

Якщо ви вирішили не використовувати LWJGL і написали свої класи, що реалізують GraphicsModule і KeyboardHandleModule. то тут потрібно вказати їх конструктори замість, відповідно new LwjglGraphicsModule () і new LwjglKeyboardHandleModule ().

А ось тепер ми переходимо до класу, який відповідає за зберігання інформації про ігровому полі і її оновлення.

клас GameField

Цей клас повинен, по-перше, зберігати інформацію про поле і про падаючої фігурі, а по-друге, містити методи для їх поновлення, і отримання про них інформації - крім тих, які ми вже використали, необхідно написати метод, який повертає колір осередки по координатам, щоб графічний модуль міг отрисовать поле.

Почнемо по порядку.

Зберігати інформацію про поле ...

countFilledCellsInLine = new int [COUNT_CELLS_Y + OFFSET_TOP];

«Що це за OFFSET_TOP?» - запитаєте ви. OFFSET_TOP це кількість не відображаються осередків зверху, в яких створюються падаючі фігури. Якщо фігурі не зможе «випасти» з цього простору, і хоч одна осередків theField вище рівня COUNT_CELLS_Y буде заповнена, це буде означати, що поле переповнене і користувач програв, тому OFFSET_TOP повинен бути строго більше нуля.

Далі в конструкторі варто заповнити масив theField значеннями константи EMPTINESS_COLOR. а countFilledCellsInLine - нулями (друге в Java не потрібно, при ініціалізації масиву все int 'и рівні 0). Або можна створити кілька шарів вже заповнених осередків - на GitHub ви можете побачити реалізацію саме другого варіанту.

А що це там за spawnNewFigure (). Чому ініціалізація фігури винесена в окремий метод?

Ви правильно здогадалися, spawnNewFigure () дійсно инициализирует поле figure. А в окремий метод це винесено, тому що нам доведеться робити ініціалізацію кожен раз, коли буде створюватися нова фігура.