LINUX.ORG.RU

header тетриса

 ,


0

2

Типа Tetris:


class Point {

public:

    GLdouble X, Y;

    /*...*/

}

class Size{

public:

    GLdouble W, H;

    /*...*/

}

class Block{

public:
    virtual void move(Container &c, MoveRegion &moveRegion) = 0;
    virtual void rotate(/*...*/) = 0;
    virtual void checkCollision();

    /*...*/

}

class Container {

public:
    vector<Block*> c;

}

class MoveRegion {

public:
    Point p;
    Size s;

}

class Cube: public Block{

public:
    
    /*...*/

    void move(Container &c, MoveRegion &moveRegion);
    void rotate(/*...*/);
    virtual void checkCollision();

}

class InvertT: public Block;
class L: public Block;
class InvertL: public Block
class Z: public Block;
class InvertZ: public Block;
class Line: public Block;

Как бы улучшить эту заготовку. Стоит ли писать шаблоны для move, rotate и checkCollision или не стоит париться, так как блоков всего семь. Кто-нибудь еще пользуется мониторами с W/H = 4:3?


угумс не 4:3 но 5:4 чтоли... точно ещё много.

Thero ★★★★★ ()

надо добавить в Block:

virtual void blast()

с помощью которой можно расстрелять пару кубиков под деталькой

добавить бонусы, к примеру, монетку, задерживающую время

добавить бонус за SMS, позволяющий ввести детальку произвольной формы, ее можно будет сконструировать в специальном плагине для GIMP за $0.99 и использовать 1 раз.

добавить возможность добавлять друзей и строить им тетрисные башни, пока их нет онлайн

надо разрешить воровать у друзей блоки

и киллерфича: вводим понятие врагов и позволяем им в любое время когда вы строите башенку ввести еще одну фигуру параллельно с вашей, которая будет падать параллельно и для упралвения ею игроку придется переключаться мышкой то с одной, то с другой.

опять же, SMS фигурка произвольной формы для врагов, в 2 раза дороже чем для себя и друзей.

BaBL ★★★★★ ()

И как же будут проверяться столкновения у наследников Block? Если рассматривать его просто как множество из 4 блоков, то достаточно сдвинуть блоки на 1 пункт вниз и проверить на пересечение с матрицей занятых клеток (из уже установленных блоков), если пересечения нет - всё ок, продолжаем движение, если нет - значит блок приземлился и мы можем добавить его к матрице занятых клеток, а также проверить эту матрицу на наличие заполненных строк и удалить их. Собственно вместо 7 классов наследников block будет один класс и фабрика, хранящая 7 вариаций блока и выдающая за раз одну из них.

quiet_readonly ★★★★ ()
Ответ на: комментарий от quiet_readonly

Вас понял! Конечно же нужна матрица! Была мысль построить все на ее основе, да как-то забылась. Множить классы, функции и строить деревья if-else - не элегантно, согласен. Обойдемся одним Block'ом и ... семью конструкторами (поля типа - зло)? Что вы имели ввиду под фабрикой?

puding ()
Ответ на: комментарий от puding

Фабрика - паттерн проектирования. Если класс можно создавать разными способами, то логику создания выносят в статические методы самого класса или в отдельный класс (фабрику, factory), разница - как между функией и функтором, т.е. статические методы всегда выдают один и тот же результат, а фабрику (или функтор) можно сконфигурировать в рантайме.

Теперь насчёт случая с тетрисом: тут нет разницы, загонять создание блока в статические методы, в конструктор Block или фабрику BlockFactory, но фабрика могла бы ещё и определять начальное положение блока для игрового поля с размерами HxW, причём h и w передаются классу-фабрике лишь один раз.

Если передавать размеры поля и enum, указывающий тип блока, в конструктор - хуже не будет. Просто на днях я столкнулся с весёлым кодом одного румына, там класс имеет конструкторы Class(const bool &value) и Class(Class *copied), так вот если такому классу передать в качестве параметра const Class *, то вместо ожидаемого копирования он выберет конструктор Class(const bool &value), в моём случае это приводило к краху приложения. Так что неплохо иметь ввиду, что такое фабрика и почему создание класса переносят из конструкторов в статические методы с разными названиями или в отдельный класс.

quiet_readonly ★★★★ ()

Когда много свободного времени, я пытаюсь написать тетрис, на не знакомом мне языке программирования, с целью немного вникнуть него, а тебе зачем?

pkurg ★★★ ()
Ответ на: комментарий от pkurg

Чтобы въехать в C++ и OpenGL, пока только в 2D, а потом уже в 3D.

puding ()
Ответ на: комментарий от schizoid

Да хотел сделать изменяемое в зависимости от форматного соотношения сторон экрана поле для блоков. Но, почитав вики и посты quiet_readonly, решил сделать «константную» матрицу 10x20.

puding ()
Ответ на: комментарий от puding

ну раз OpenGL, так может 10х10х20 ? со свободной камерой?

BaBL ★★★★★ ()
Ответ на: комментарий от Sphinx

Спешите видеть, плюсовики-затейники решают задачу написания тетриса

Уж лучше пусть тетрис пишут, чем очередной долбаный аудиоплеер

fang ()

Если бы не названия функций с маленькой буквы, я бы подумал на Малова.

quiet_readonly ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.