Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Тетрис на mvc

22.06.2014, 22:34. Показов 2358. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрасти евриван) Как Вы? Все у Вас в порядке?) Думаю да) А я опять к Вам со своими проблемами( Наверное уже достал Вас хи-хи) Ладно, сразу к теме

Итак, хочу реализовать Тетрис. Когда-то давно я его писал, и в принципе все меня устраивало, пока не прочитал про рефакторинг, паттерны, каркасы и тд. Я понял, что код мой - это ужас!)
Решил заняться плотно каркасом MVC и реализовал несколько приложений на нем, в частности, игру "ЗМЕЙКА" (скоро выложу ее сюда, для Вашей оценки). И вот пришло время Тетриса.
Все шло гладко, тупо следуя каркасу MVC, где то отходя от него, где-то нет, но принцип не нарушал. И вот тут начались трудности.
Я выкладываю Вам два проекта, первый OldTetris, где описал мой старый тетрис, и NewTetris, где следовательно MVC-шный тетрис. Точнее в новом проекте я выкладываю только тупо падение фигур и все, чтобы не загружать процесс объяснения моих трудностей. Я думаю этого достаточно.
Итак, взгляните, в проекте OldTetris, когда я нажимаю клавиши(зажимаю) - влево, вправо, то у меня сдвиг идет очень быстро. Это я добивался тем, что создавал новый поток, который руководил смещением координаты y(падение фигуры вниз) а в основном потоке уже отслеживал нажатие клавиш.
Вопрос: Как мне добиться такого же в моем новом проекте NewTetris? Сейчас, если Вы запустите NewTetris проект, то увидите, что при нажатии - влево, вправо, фигуры идет тупо по диагонали влево или вправо. Не очень красиво согласитесь? Более красивее было в OldTetris. Но я не знаю как
создать похожее именно в новом проекте - если создаю новый поток, так же как и в OldTetris, то происходил мигание какое-то, если по другому покручу - нарушается концепция MVC. Короче как не крутил, ничего у меня не вышло(

Поэтому я обращаюсь к Вам, Уважаемые Форумчане) Я думаю Вы мне поможете организовать такое движение фигуры влево и вправо, как я хочу и как было у меня в прошлом проекте. Конечно если Вы поняли о чем Я))
Спасибо)
Вложения
Тип файла: 7z NewTetris.7z (548.7 Кб, 40 просмотров)
Тип файла: 7z OldTetris.7z (619.2 Кб, 26 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2014, 22:34
Ответы с готовыми решениями:

Тетрис на C++
Вот надо написать тетрис на курсовую. Проблема в том, что незнаю с чего начать. Есть , что то вроде гайдов по написанию подобного? И еще,...

Тетрис
Задали сделать тетрис на Турбо СИ но незнаю даже с чего начать....только учить начали и уже курсак((

Тетрис на С++
Помогите доработать игру. запутался с _kbhit() и _getch() нужно сделать чтобы фигура постоянно падала, а во время нажатия клавиш смещалась....

17
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
23.06.2014, 02:10
Old tetris


Перемещать фигуры в другом потоке это бред.
New tetris норм
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
23.06.2014, 22:37  [ТС]
Jupiter, я понимаю,что движение фигуры в новом потоке, это бред. Но как мне осуществить такое же быстрое движение фигуры влево или вправо как в старом тетрисе?без нового потока не получается(
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
26.06.2014, 23:30  [ТС]
ну что,кто нибудь ответит?)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
26.06.2014, 23:57
Bretbas, Конечно нужно проверять, но я бы попробовал реализовать что-то вроде double buffering для консоли, чтобы избежать мигания.
Сделать массив, который будет представлять весь нужный экран, сначала отражать изменения в этом массиве, а потом разом отрисовывать его. Тогда по сути становятся не нужны функции наподобие SetConsoleCursorPos, которые главным образом и создают мигание.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
27.06.2014, 00:33  [ТС]
DrOffset, знаем эту фичу) но пока рано) я пока пишу игрушки в текстовом режиме,потом когда буду переходить на графический режим,будем изучать)
мне не то что мигание нужно убрать,его то я уберу,мне нужно сделать так,чтобы при зажатие кнопок влево или вправо,фигура перемещалась быстрее,чем вниз) Если взглянешь на проект OldTetris,то увидешь,что я это реализовал,но реализовал с помощью второго потока(во втором потоке у меня изменяется координата y-вниз,а в главном потоке по нажатию клавиш влево или вправо,изменяется координата x) из за этого создается эффект,что фигура двигается по зажатию клавиш вправо или влево быстрее.Вот что мне нужно реализовать в NewTetris
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.06.2014, 03:31
Цитата Сообщение от Bretbas Посмотреть сообщение
DrOffset, знаем эту фичу) но пока рано) я пока пишу игрушки в текстовом режиме
Ты не понял. Это не фича. Это технология. Пофиг где ее применять. Это идиома. Принцип. Подход, если хочешь. Я и предлагаю тебе ее использовать именно в текстовом режиме.
Прочитай еще раз мое сообщение.

По поводу обработки событий. Я думаю нужно сделать так, как сделано в windows api. Очередь сообщений, события попадают туда: события нажатия клавиш, события обновления консоли и события таймера. По таймеру будет осуществляться перерисовка, для отображения падения фигурки. Обработчики событий вправо и влево будут двигать координаты, а пробела - переворачивать.
Насчет второго потока. Я не думаю, что это такая уж и плохая идея. Только во второй поток я бы вынес как раз отслеживание нажатий, а не отрисовку. Этот второй поток клал бы в очередь сообщений основного потока сообщения о нажатиях клавиш. А основной поток, обрабатывая все эти сообщения, выполнял бы сдвиг, перерисовку и переворот фигурок. Таймер же можно не сочинять, их на выбор в win api достаточно, см. например функцию timeSetEvent.
Но на самом деле в windows есть способ отлова клавиш гораздо прямее: см. функцию SetWindowsHookEx. Через нее регистрируешь callback, который и будет ставить события о нажатиях в твою очередь сообщений (его естественно нужно будет написать самому). Второй поток не нужен и дело в шляпе.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2014, 04:18
Bretbas, что-то твои тетрисы, у меня, не хотят нормально работать. Старый зависает при нажатии на любую стрелку, новый вообще не реагирует на клавиши.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.06.2014, 04:42
alsav22, а у него там не стрелки, а WASD раскладка, а поворот на пробел
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2014, 04:50
Цитата Сообщение от DrOffset Посмотреть сообщение
WASD раскладка, а поворот на пробел
Попробовал WASD, не реагирует, только поворот (пробел) работает. Даже если на каких-то и работает, то зависания, при нажатии на стрелки, не должно быть.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
27.06.2014, 05:00  [ТС]
попробуй перейти на английскую расскладку)это недоработка
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.06.2014, 06:23
Цитата Сообщение от Bretbas Посмотреть сообщение
попробуй перейти на английскую расскладку
Заработало (на английской). Странно, вроде бы пробовал до этого раскладку менять. Зависание, при нажатии стрелок, тоже недоработка?
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.06.2014, 01:10  [ТС]
не понимаю про какое зависание ты говоришь. Может это из за того,что перерисовка модели фигуры у меня идет так же и при изменении координаты x? Тогда убери операцию notify() в методе set_x_pos(int) в классе модели фигуры.

Добавлено через 9 минут
DrOffset, блина,не хочу я пока переходить на твою идею( хочу реализовать своим подходом) Просто мне тогда придется менять не только тетрис,если менять подход( мне нужно всего лишь скоростное передвижение фигуры влево или вправо при ЗАЖАТИИ клавиш стрелок лево и право
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
28.06.2014, 01:48
Bretbas, хук на перехват нажатий попробуй для начала реализовать.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2014, 01:50
Цитата Сообщение от Bretbas Посмотреть сообщение
не понимаю про какое зависание ты говоришь.
Обыкновенное. При нажатии на любую стрелку появляется мигающий курсор. Если после этого нажать на любую клавишу управления движением ('a', 'd'), то результат на скрине. Jupiter, во втором посте, на то же указывал.
Цитата Сообщение от Bretbas Посмотреть сообщение
Тогда убери операцию notify() в методе set_x_pos(int) в классе модели фигуры.
Оно мне надо? Это мой код или твой?
Миниатюры
Тетрис на mvc  
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.06.2014, 02:04  [ТС]
alsav22, вообще хрен знает оО
у меня почему то все ровно
DrOffset, ладно,попробуем...я наверное кстати выложу на днях свои проектики)

Добавлено через 3 минуты
alsav22, это старый проект,писал его давненько...тяжело щас разбирать. Про notify() ,это я говорил про NewTetris
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.06.2014, 02:31
Цитата Сообщение от Bretbas Посмотреть сообщение
вообще хрен знает
Если собрать release и запустить, то начальную картинку не выводит (start и пр.), просто мигающий курсор.
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
29.06.2014, 00:21  [ТС]
переходите на новую тему,друзья)

https://www.cyberforum.ru/cpp-... ost6376221
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.06.2014, 00:21
Помогаю со студенческими работами здесь

Тетрис на c++
Я решил проверить свои скудные знания языка и написать всем известную игру тетрис. Вот что получилось. #include <iostream> ...

Тетрис
Пишу на c++ for DOS! Вобщем не могу сделать передвижение фигуры влево или вправо при нажатии на клавишу. Вот код падения фигуры в...

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

Игра тетрис
Помогите, ребята. Мне нужно сдать курсовую по игре тетрис, может есть у кого самый простой тетрис, где падают фигуры, или какой-то анолог...

Тетрис: начало
Здравствуйте. Захотелось мне сделать тетрис. Консольный, некрасивый, но рабочий. Так как мой скилл программирования невысок, то решил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru