Project's Implications - gotcreme/Tetris GitHub Wiki

GIST:

Проект: Tetris.

Tetris – реалізація класичної гри тетріс. В проекті було реалізовано повністю функціонуючу гру, а саме:

  • 7 ігрових фігур, що складаються з чотирьох блоків та випадково генеруються;
  • Ігрове поле розміром 10 x 22;
  • 5 клавіш для руху та обертання фігур;
  • Режим відображення фантомної фігури, яка показує розташування фігури, якщо користувач скине її вниз;
  • Режим відображення наступної фігури, що буде згенерована після поточної;
  • Система нарахування очок;
  • Збільшення швидкості падіння фігурок, для підвищення складності ігрового процесу;

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

Ігрова логіка розміщена в окремі зборці GameEngine, тобто повністю відділена від графічної реалізації проекту.

Мова реалізації: C#.

Графічна реалізація: GDI+;


Experience/Challenges:

STAR #1

Situation: Створення програмного представлення ігрової дошки та фігури.

Task: Ігрова дошка повинна мати чітко визначений розмір та вміти розміщувати у собі ігрові фігурки. Потрібно придумати спосіб взаємодії між ігровою дошкою та фігуркою.

Action: Було вирішено створити два класи: Board - для ігрової дошки та Piece - для ігрової фігурки. Клас GameBoard інкапсулює двовимірний масив типу int чітко визначеного розміру(10 x 22), елементами котрого є ігрові блоки. Клас Piece також інкапсулює двовимірний масив типу int розміром (4 x 4), якщо у певній координаті цього масиву розміщується блок фігурки, то значення відповідного елементу масиву є ненульовим, і доріювнює числу від 1 до 7 (всього наявно 7 різних типів фігурок) в залежності від типу фігурки, в іншому випадку, значенням елементу масиву є нуль. Ці ж правила були застосовані при розміщенні фігурки на ігровому полі.

Result: Фігурки коректно взаємодіють з ігровим полем та розміщуються на ньому.

STAR #2

Situation: Створення фантомного образу фігурки.

Task: Створити фантомний образ (тінь) для поточної фігурки для того, щоб користувачу було видно місцерозташування фігурки на ігровому полі, якщо він вирішить скинути її вниз.

Action: Для вирішення цієї задачі вирішив відштовхуватись від наявної змінної _currPiece типу Piece, що представляє собою поточну фігурку. В класі Board, що являє собою ігрове поле, створив метод з сигнатурою: public void FixShadowPiece(Piece piece, int posX, int posY), в який передається поточна фігурка і координати її розміщення на ігровому полі. В цьому методі, для фантомної фігурки, створюється нова змінна типу Piece, обчислюються координати для її розташування на ігровому полі (відповідно до переданих координат у параметрах), після чого вона фіксується на ньому.

Result: Знайдено ефективний спосіб створення фантомної фігурки - доволі важливого ігрового елементу, що покращує якість ігрового процесу.

STAR #3

Situation: Створення класу, який оперуватиме логікою гри.

Task: Відділити ігрову логіку від графічної реалізації.

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

Result: В результаті було створено клас, який оперує всією логікою гри, та не залежить від графічної реалізації.

STAR #4

Situation: Написання Unit - тестів.

Task: Протестувати статичний конструктор класу PieceFactory, який по замовчуванню є закритим.

Action: Вирішив створити окремий відкритий статичний метод, який виконуватиме ініціалізацію необхідних компонентів класу PieceFactory, та викликатиметься з конструктору класу.

Result: Конструктор класу PieceFactory успішно протестований.

STAR #5

Situation: Реалізація графічної частини гри засобами GDI+.

Task: Використовуючи засоби GDI+, реалізувати механізм для малювання ігрового поля та фігурок.

Action: Оскільки такі сутності, як ігрове поле та фігурка, були представлені у вигляді двохвимірного масиву, було прийнято рішення створити окремий клас Grid, який містить в собі двохвимірний масив елементів типу Panel. Цей клас містить наступний метод для малювання: public void Draw(int[,] array). В даний метод передається масив, що представляє собою ігрове поле, або ж фігурку, і на основі числових значень цього масиву (кожне число відповідає певному кольору блоку) малюється послідовність блоків відповідними кольорами.

Result: Засобами GDI+ створив клас для малювання ігрового поля та фігур.