Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2014, 18:34   #131
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Если хочется классов, то кто же их начинает с названий, да еще и с вспомогательных классов, а не основных. Перед созданием классов нужно хорошо и долго думать, а точнее проектировать, чтобы потом не лепить костыли. В данном случае нас волнует чисто игровая логика и ничего более.
Логично создать класс Игра, который будет рулить всем игровым процессом.
Создали экземпляр класса и автоматом получили набор из пустого стакана и кучи методов для процесса игры.
Стакан - тупо двумерный массив. Можно взять простой вариант с булевыми данными (занята ячейка или свободна), можно хранить цвет ячейки и 0 (чёрный цвет) будет означать свободную ячейку, можно создать свой тип для этого. Я бы не парился и хранил цвет (одноцветный вариант не сильно легче, чтобы стоило делать такую некрасивую игру). Игра должна давать информацию по падающей фигуре и давать возможность повернуть, подвинуть, а так же обрабатывать "ход" (когда фигура падает на одну позицию вниз или она уже упала и нужно сгенерировать новую). скорость игры, имя игрока и прочие гадости так уж откровенно к механике игры не относятся и в принципе их можно в этот класс не пихать, но пусть тоже будут в куче, дабы впоследствии не плодить сущности.
Под фигуру тоже можно выделить класс удобства ради. В принципе, это тупой двумерный массив, по типу стакана в "Игре", но есть подозрение, что нужно еще добавить координату центра фигуры (для вращений). Под разные фигуры я бы классы не лепил, а создал конструктор Фигура(Тип, Цвет, Поворот). Можно и как "фабрику" оформить: Игра.Фигура = Фигура.СоздатьПалку(Красный, ВертикальнаяПалка). Позиция фигуры в стакане фигуру совершенно не волнует, поэтому её логичнее также в игре хранить. В общем, почти всё попадает в один класс Игра или Тетрис или как там его назовёте. В Фигуре только заполнение нужных ячеек в двумерном массиве и его повороты будут.
Дальше думайте как лучше сделать проверки на предмет уже упавшей фигуры, как не давать двигать фигуру за пределы стакана и прочие мелочи.
Вообще, учитесь - учитесь на своих ошибках. Пишите как думается, там либо поймёте как надо было и что не так или не поймёте. То, что я написал тут, другой человек распишет совсем иначе и у него всё будет не менее кошерно, еще и паттерны может будут активно применяться. На начальном этапе набивайте шишки своими собственными классами, да сюда заходите с готовыми набросками, а мы охотно поругаем, если сами в процессе не поймёте что где не так.

Последний раз редактировалось pu4koff; 23.09.2014 в 18:37.
pu4koff вне форума Ответить с цитированием
Старый 23.09.2014, 20:06   #132
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Я бы сделал клетки в стакане указателями на класс который будет выдавать фигура. Таким образом можно будет заполнять клетки по разному - кружочками, квадратиками, картинками и т.д.
Таким образом у нас 5 классов - Тетрис, Стакан, Фигура, Клетка и Рисователь.
Рисователь - аналог HDC и будет выводить графичные примитивы на разные устройства - конзоль, DirectX, OpenGL, tty printer...
waleri вне форума Ответить с цитированием
Старый 23.09.2014, 22:22   #133
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Я бы сделал клетки в стакане указателями на класс который будет выдавать фигура. Таким образом можно будет заполнять клетки по разному - кружочками, квадратиками, картинками и т.д.
Таким образом у нас 5 классов - Тетрис, Стакан, Фигура, Клетка и Рисователь.
А я не понял мысль. Клетку из списка я бы выкинул. ИМХО типа клетки хватит:
Код:
enum CellType { 
  Circle, Rect, Picture
};
Стакан - это
Код:
CellType **array;
(это я типа про заполнение кружочками... - хотя яне знаю о чем идет речь и зачем там кружочки...). Поясните пожалсто

Последний раз редактировалось rrrFer; 23.09.2014 в 23:18.
rrrFer вне форума Ответить с цитированием
Старый 23.09.2014, 22:57   #134
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Я бы сделал клетки в стакане указателями на класс который будет выдавать фигура. Таким образом можно будет заполнять клетки по разному - кружочками, квадратиками, картинками и т.д.
Таким образом у нас 5 классов - Тетрис, Стакан, Фигура, Клетка и Рисователь.
Рисователь - аналог HDC и будет выводить графичные примитивы на разные устройства - конзоль, DirectX, OpenGL, tty printer...
Чё псих? Перечиси 1000 р на мой кошелёк, не только в консоли зделаю, но и твоём кошельке.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 24.09.2014, 00:25   #135
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
А я не понял мысль. Клетку из списка я бы выкинул. ИМХО типа клетки хватит:
Ну в принципе хватит и в принципе все классы можно выкинуть.
Идея такова:
Код:
Рисовальщик dc;
Стакан[x][y]->Paint(dc);
А иначе будет:
Код:
Рисовальщик dc;
switch(Стакан[x][y])
{
  case Circle: dc.Something(); break; 
  // Тут таких кейсов может быть много.
}
При таком раскладе, всем будет пофиг из чего именно состоят фигурки - кружочки и квадратики это просто условность.

Последний раз редактировалось waleri; 24.09.2014 в 00:28.
waleri вне форума Ответить с цитированием
Старый 24.09.2014, 07:39   #136
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Неправильная связь нарисовалась. Современный тренд в том, что стакан вообще не должен знать, что его кто-то рисует. Он находится в слое Model, а рисовать его нужно в слое View. Рисовальщик может знать о стакане, а стакан вообще о его существовании не должен подозревать, даже на уровне абстрактных классов и интерфейсов.
pu4koff вне форума Ответить с цитированием
Старый 24.09.2014, 07:50   #137
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Неправильная связь нарисовалась. Современный тренд в том, что стакан вообще не должен знать, что его кто-то рисует. Он находится в слое Model, а рисовать его нужно в слое View. Рисовальщик может знать о стакане, а стакан вообще о его существовании не должен подозревать, даже на уровне абстрактных классов и интерфейсов.
Мля, как ты прав!!!
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 09.10.2014, 18:12   #138
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

Почитал вас и то же решил написать свой Тетрис.
У меня уже были попытки, написать в консоли, я тогда кроме условий циклов и массивов ни чего не знал. Змейка получилась, а вот тетрис не осилил, завяз в собственном коде.
Ну вот попытка номер два, вроде работает. Но еще тестирую.
Писал в Qt Creator, под Linux, можете под винду собрать. Ни какого Open GL.

К стати возник вопрос- почему при каждом запуске программы функция rand выдает разные значения?
Вложения
Тип файла: zip Tetris.zip (8.1 Кб, 12 просмотров)

Последний раз редактировалось SAMOUCHKA; 09.10.2014 в 19:01.
SAMOUCHKA вне форума Ответить с цитированием
Старый 09.10.2014, 19:02   #139
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Замечательно! Тут можно смело добавить репутации!

Исполняемый файл для Windows (5 MБайт): https://yadi.sk/d/3R9pzIrPbuQZT

Управление. Перемещение: стрелки. Поворот: клавиши Z, X.
Начало игры: пробел. Пауза: пробел

А можно было бы в меню сделать пункт "Помощь" и пункт новая игра

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

Было бы отлично что-то внести. 10 уровней, например. Чтобы скорость увеличивалась. И чтобы что-то менялось. Например, новые фигуры появлялись или ещё что-то. Какой-нибудь финал бы
Изображения
Тип файла: png 391.png (25.8 Кб, 78 просмотров)

Последний раз редактировалось 8Observer8; 09.10.2014 в 19:04.
8Observer8 вне форума Ответить с цитированием
Старый 09.10.2014, 19:05   #140
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

я отредактировал пост заменил файл, там косяк один был.
Да надо ввести новые уровни. Пока я просто добивался правильной работы
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C тетрис Цукер Помощь студентам 0 21.11.2011 22:53
Тетрис на си фыф123 Помощь студентам 1 22.06.2011 10:48
Тетрис Александр123456 Общие вопросы C/C++ 1 02.12.2010 23:15
Тетрис k1r1ch Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 02.01.2010 12:20
массив и тетрис sid Паскаль, Turbo Pascal, PascalABC.NET 2 04.04.2007 14:41