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+ створив клас для малювання ігрового поля та фігур.