Я пишу Тетрис-клон, это почти сделано, за исключением столкновений. Например, для того, чтобы переместить часть Z Я использую метод:Тетрис Вращение без массивов
void PieceZ::movePieceDown()
{
drawBlock (x1,y1++);
drawBlock (x2,y2++);
drawBlock (x3,y3++);
drawBlock (x4,y4++);
}
и для того, чтобы повернуть кусочек я использую сеттер (поскольку координаты являются частными). Для вращения я использую 90 градусов по часовой стрелке матрицы вращения. Например, если я хочу, чтобы переместить (x1, y1) и (x2, y2) мое происхождение, чтобы получить х и у нового блока:
newX = (y1-y2) + x2;
newY = (x2-x1) + y2 + 1;
Это работает в какой-то степени, это начинается как:
0 0 0 0
0 1 1 0
0 0 1 1
0 0 0 0
Тогда, как и планировалось, что поворачивается:
0 0 0 1
0 0 1 1
0 0 1 0
0 0 0 0
а потом поворачивается к отрезку S:
0 0 0 0
0 0 1 1
0 1 1 0
0 0 0 0
И затем он просто чередуется между вторым и третьим этапами.
Мои вычисления ошибочны, но я не могу понять, где, мне просто нужно немного намекнуть.
Чтобы убедиться, что преобразование верно, поверните сам источник. Результат должен состоять в том, чтобы блок не двигался. В вашем случае 'newX' остается' x2', но 'newY' становится' y2 + 1', вместо оставшегося 'y2'. – Dialecticus
Кроме того, разные координаты не должны существовать в одном выражении. Поскольку вы вращаете кусок, все значения, которые влияют на координацию 'x', должны иметь вид' y', и все, что влияет на 'y', должно быть' x' в природе. – Dialecticus
Блок, который вы используете в качестве источника, обновляется после того, как вы вычислили , но прежде чем вы начнете вычислять и , поэтому не все блоки используют одинаковые исходные координаты. Вы должны сохранить копию , которая останется неизменной на протяжении всего расчета преобразования. –