Статистика |
|
|
Как написать тетрис
С чего начинается тетрис? А он начинается с матрицы, которая имеет определенные размеры. Я не знаю каких размеров должен быть стандартный стакан, в который падают фигуры и поэтому будем считать что он 10 клеток в ширину и 20 в высоту. По этому пространству могут передвигаться фигуры, но возникает другой вопрос - как определить вышла ли фигура за рамки массива? Для этого необходимо создать стенки стакана и дно, что, естественно, приведет к увеличению матрицы, а именно +2 в ширину и +1 в высоту. Можно сделать так же верхнюю стенку стакана, столкновение с которой будет сигнализировать о том, что "Game Over". Итак нужно создать матрицу 12x21, либо вектор это уже дело вкуса(по мне так вектор вкуснее). Матрица будет содержать информацию о мире. То есть это будет как бы глобальная матрица. Значения в данном упрощенном случае, которые может принимать каждая ячейка матрицы, могут быть либо 0, либо 1. Естественно, если в ячейке значение 1, то она считается заполненной иначе пустой. При инициализации приложения либо при начале новой игры нужно обнулять глобальную матрицу и заполнять стенки и дно значениями 1. Теперь займемся фигурами. Предположим что есть некий вектор(либо матрица), в котором хранится текущая фигура. Все фигуры в тетрисе состоят из 4 залитых ячеек, а соответственно вектора из 16 значений вполне хватит. Фигура, через определенные промежутки времени, опускается на одно значение вниз. При нажатии на клавиши влево-вправо так же фигура движется и поэтому в обоих случаях необходимо проверять следующее положение фигуры на столкновение с глобальной матрицей. Если столкновение при следующем шаге падения происходит, значит текущие данные фигуры проецируются в глобальную матрицу, если столкновение происходит при нажатии клавиш управления движением, то фигура просто не движется в указанную сторону. С вращением фигуры могут возникнуть некоторые проблемы, а именно нужно проверять следующее состояние фигуры после поворота, и если столкновение происходит то восстановить предыдущее иначе оставить текущее. Так как я написал тетрис на скорую руку, он является образцом упрощенного варианта, хотя сейчас в процессе написания статьи я осознаю то, что правильнее было бы передавать функции проверки столкновений массив , а не заставить функцию работать с массивом текущей фигуры. В момент каждой проекции вектора текущей фигуры в глобальную матрицу значений необходимо проверять наличие заполненных рядов. Проверка должна осуществляться снизу вверх и при обнаружении полностью заполненного ряда нужно сдвинуть все вышеидущие ряды вниз на 1 значение.
|