Тетріс на c дотримання правил - it notes

Правила тетриса досить прості:

  1. Гра починається з появи випадкової падаючого елемента у верхній центральній частині ігрового поля. Цей елемент може контролювати гравець;
  2. Коли активний елемент стосується своєю нижньою частиною дна ігрового поля або зайнятого блоку, то через кілька ігрових кроків він фіксується і його позиція більше не підвладна гравцеві;
  3. Якщо в ігровому полі утворюються повністю заповнені ряди з непустих блоків, то вони зникають, а верхні ряди зсуваються вниз;
  4. Після кожного фіксування ігрового елемента з'являється новий, як на початку гри;
  5. Якщо знову з'явився елемент відразу має зіткнення, тобто знаходиться в некоректному стані, то гра закінчена;
  6. Виграти в тетріс, на жаль, не можна.

А тепер подивимося, як всі ці перевірки можна записати за допомогою коду C ++.

Поява нового елемента

При ініціалізації моделі активний ігровий елемент знаходиться в нейтральному стані з порожньою внутрішньої матрицею (див. Патерн Null Object). Така перевірка виконується за допомогою функції-члена isNull ():

Формування нового елемента виконуємо на початку функції-члена doStep (). яка викликається для кожного ігрового кроку (за таймером з Контролера):

Формування випадкового елемента здійснюється в функції TetrisItem :: generateRandom ():

Перевірка Game Over

У функцію doStep () зручно додати і перевірку на закінчення гри:

Запитати у моделі про те, чи не закінчена гра, можна за допомогою isGameOver ():

Активний елемент на дні

Коли нижня частина активного елементу в щось впирається, то ми дозволяємо йому трохи "поползать":

Тетріс на c дотримання правил - it notes

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

Фіксування активного елементу

Нас не влаштовує, що зараз активний елемент просто зникає після падіння. Зробимо так, щоб всі його блоки стали частиною ігрового поля:

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

Очищення заповнених рядів і підвищення складності

Модель практично закінчена. Залишається додати лише кілька заключних штрихів. Ось алгоритм очищення ігрового поля від заповнених рядів:

Викликати clean () потрібно відразу ж після коду фіксування елемента:

Тетріс на c дотримання правил - it notes

За кожен прибраний ряд кількість набраних очок збільшується на одиницю. За кожні набрані 10 очок складність гри зростає (шляхом нарощування швидкості на одиницю):

Насправді, функція incScore () вийшла не найвдалішою (див. Принцип єдиної відповідальності): вона має побічний ефект (збільшує швидкість). Однак для такої простої гри це виявилося не критично. Можливо, що в більш складному проекті довелося б її переробити.

Остання дрібниця

Швидкість падіння елемента може змінюється не тільки в результаті виклику incSpeed ​​(). але і з волі гравця. Для цього вдосконалюємо нашу модель наступним чином:

висновок

На цьому ми завершуємо знайомство з Моделлю гри тетріс. А наступного разу переходимо до короткого огляду реалізацій Уявлення і Контролера.


Тетріс на C ++: Динамічна модель


Тетріс на C ++: Виявлення зіткнень


Тетріс на C ++: Статична модель


Тетріс на C ++: Подання та Контролер


Тетріс на C ++: Введення


Віддалене управління комп'ютером через мережу: Передача подій клавіатури (Linux / X11)


Віддалене управління комп'ютером через мережу: Передача подій клавіатури (Win32)


Віддалене управління комп'ютером через мережу: Передача подій миші