2015-03-22 4 views
0

Я кодирую тетрис в Qt C++ на данный момент. Игра почти завершена, и единственное, что мне нужно добавить, это вращение. Теперь, с чем я борюсь, это теория вращения. Тетрис имеет 7 различных видов камней (I, S, Z, L, J, T, O). Есть ли какой-либо алгоритм или что-то подобное с поворотами от разных фигур?Tetris rotation C++

Что я предпочитаю не делать, это иметь корпус переключателя для 7 разных форм для обработки поворотов. Также, если фигура, подобная L, вращается, она имеет 4 разных положения, которые нужно обрабатывать разными.

Так что единственное, о чем я думал, это попросить форму, а затем и позицию. Это предоставит мне несколько переключателей, иначе если в коммутаторе ... Значит много набирать и много проверять на компилятор.

P.S. Мой камень структура выглядит следующим образом :(Steine ​​= Немецкий язык для камня, Art = форма)

struct position 
{ 
    int X; 
    int Y; 
}; 

struct Steine 
{ 
    struct position* Position; 
    int Art; 
}; 
+1

Интересной частью будет то, как камни используются в модели сетки, например. как вы проверяете полные строки. – jhnnslschnr

+0

Уже есть несколько сообщений на тему вращения Tetris, даже на C++ или с Qt [здесь один] (http://stackoverflow.com/questions/7932723/), [здесь еще один] (http://stackoverflow.com/ q/233850/211160), один на [gamedev.SE] (http://gamedev.stackexchange.com/q/17974). Можете ли вы четко объяснить, где вы застряли, что они не отвечают? Это займет больше общего кода ... хотя сначала прочитайте [MCVE] (http://stackoverflow.com/help/mcve)! * (Sidenote: в C++ вы можете просто сказать 'position * Position' вместо' struct position * Position', но где позиция, указанная здесь здесь?) * – HostileFork

+0

'Steine', содержащий указатель на' position', не смотреть прямо. Он должен просто содержать «позицию» напрямую. И, пожалуйста, постарайтесь придерживаться английского языка в программном коде или, по крайней мере, перевести все, прежде чем публиковать сообщения на международном уровне. Кстати, «Искусство» в этом контексте лучше всего переводится как «добро», а не как «форма». –

ответ

1

Вы можете использовать 2D массив представления BOOL для каждой формы. Затем, когда вы вращаете какой-то конкретный массив, вы вращаете эту фигуру (возможно, код при инициализации генерирует все вращения) и проверяйте, не находится ли какой-либо пиксель за пределами границ тетриса, или если вращающаяся фигура не должна вращаться, потому что некоторые из ее пикселей будут быть на той же позиции, что и уже существующий пиксель из предыдущих фигур.

Редактировать: Да, как вы сами сказали, лучше всего попробовать на бумаге/краске, чтобы проверить это (о средней точке вращения). Для каждой фигуры вы в итоге получаете 3x3 или 4x4. для 3x3 вы вращаетесь вокруг средней точки, например, для 4x4 вокруг 1x1 (где индекс идет от 0 до 3). Это несколько, как я пошел за своим тетрисом 9 лет назад или около того.

+0

'2D массив представления bool' +1. Если у вас есть специальное лечение для каждого типа камня, измените его на этот массив. – deviantfan

+0

Так что я действительно не хотел говорить о кодировании, но, как вы, ребята, всегда отвечаете в методах, как его кодировать, я поделюсь своей идеей позади моего кода. На данный момент у меня есть 2 2D-поля.Один заполняется 1 и 0 (может быть, и bool) 0 для пустого 1 для полного. Другое поле говорит мне, какой камень находится в определенных местах (у меня разные цвета для разных фигур). Я мог бы суммировать это только с одним 2D-массивом, но на данный момент это так. – FrontMobe

+0

Итак, еще раз, я знаю, как использовать эти 2D-массивы (границы и т. Д.). Мой вопрос остается. Как я могу повернуть фигуру? Где находится средняя точка? Я действительно говорю об этой теории. Как я могу определить этот момент? Если у меня есть квадрат, то просто сказать, что он посередине, но в некоторых случаях середина находится в камне, а не вокруг. Есть ли техника для ее определения? – FrontMobe