|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
|
Объясните реализацию логики тетриса27.07.2016, 11:30. Показов 6399. Ответов 65
Добрый день я учу Java и пробую практиковаться. Собрал свой первый арканойд на JavaFX. Теперь пытаюсь собрать тетрис. Сделал класс поля с массивом нулей и нарисовал его. Для тестирования загнал в этот массив вручную вместо нулей несколько единиц в качестве возможной фигурки и все это рендерится в одном методе по условию проверки на 1 или 0.
Но я не понимаю как мне передавать в массив фигурку и двигать ее там, перерисовывая весь массив на каждый сдвиг фигурки ? Если я правильно понимаю конечно. Нигде нет подробного объяснения. Подскажите как надо и как лучше
0
|
|
| 27.07.2016, 11:30 | |
|
Ответы с готовыми решениями:
65
Объясните реализацию формы Объясните реализацию интерфейсов на примере интерфейса IAny пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки. |
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 04.08.2016, 21:48 | |||
|
А потом уже с FX всякими. Да кстати а в этой FX есть канвас чтобы рисовать как белый человек а не парится с шейпами?
0
|
|||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
|||
| 05.08.2016, 09:36 [ТС] | |||
|
я проверил - действительно при перерисовке поля поверх старых квадратов рисовались дубликаты. Исправил. теперь при каждой перерисовке очищается панелька доски, обнуляется список с квадратами и рисуется на панельке заново. теперь о самой проблеме. короче - то, что у меня сейчас есть работает графически за счет JavaFX. Я двигаю панельку с фигуркой и могу перерисовывать панельку с доской, но их массивы никак не взаимодействуют по сути .... и я пока не знаю как это сделать. Добавлено через 1 час 55 минут я нигде не смог найти алгоритм.Добавлено через 4 минуты Плюс фигура занимает всегда разное пространство в массиве, из-за чего я не могу завести массиву координату Point2D соответствующую индексам ячейки доски.
0
|
|||
|
4069 / 2677 / 587
Регистрация: 11.09.2009
Сообщений: 9,560
|
|||
| 05.08.2016, 15:56 | |||
![]() Если вы всерьёз решили переучиваться на программиста, вам предстоит ещё очень долгий путь. Начните с "крестиков-ноликов" 3Х3 клетки. Там гораздо проще объяснить всё, что вам будет непонятно. А если для вас основная задача - "найти", то чего мелочиться - ищите сразу готовую программу.
0
|
|||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
||
| 05.08.2016, 16:29 [ТС] | ||
я на самом деле не спрашиваю ничего сложного - даже для гуманитария. моя основная задача понять - собрать так называемые базовые паттерны (не путать с патернами проектирования) мне не хватает лишь правильного объяснения принципа. Нет статей, где бы все подробно бы пояснялось. И тут далеко ходить не надо. На этом форуме уже задавали подобные вопросы в других ветках и часто дальше 4х пустых ответов дело не заходило (пару раз вообще тупо ответов не было) По началу я хотел практиковаться на андройде, но мой комп не тянет одновременно запущенные IDE, эмулятор и браузер. по этому решил начать с JavaFX
0
|
||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 05.08.2016, 20:56 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
|||||||
| 05.08.2016, 22:59 [ТС] | |||||||
|
Есть два массива с разного размера: фигурка (4x4) и доска (24x18). У фигурки я сделал параметры начальной позиции X и Y, которыми можно указать индекс в массиве доски. и в дальнейшем изменяя эти координаты сдвигать фигурку. И тут пошла проблема как мне перенести фигурку на доску ? 1) фигурка занимает не весь свой массив (встречаются пустые области по краям) допустим если я возьму самую крайнюю координату у доски, то из-за пустот может быть зазор с краю. 2) Первый пункт можно частично решить, если я размещу единицы фигуры у левого края ее собственного массива. Но тогда если я смещу фигуру к правому краю, тогда массив фигур как бы может выходить за границу доски. Это же относится и к тому, когда фигура будет на дне стакана. 3) как мне сравнивать ячейки доски с ячейками фигурки - ведь индексы у них разные ? как я понимаю должно быть как-то так
вот в чем вся проблема ) мне бы посмотреть, где-то как это должно делаться
0
|
|||||||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 05.08.2016, 23:36 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
||||||
| 06.08.2016, 00:41 [ТС] | ||||||
|
вот допустим я делаю так
определяю область на доске, которая начинается с возвращаемых координат X и Y + ширины массива. Эту область мне надо проверить и изменить ) piece.getPosY() возвращает 0 piece.getPosY()+4 ограничение по высоте массива piece.getPosX() возвращает 5 piece.getPosX()+4 ограничение по ширине массива так что ли ? )
Плюс тут кроется еще одна проблема в том что фигура имеет разную ширину/длину и надо еще проверять, когда массив может выйти за пределы доски. Если эта фигура кубик, то половина массива пустая, а если горизонтальная линия то массив не может выйти за пределы
0
|
||||||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||||
| 06.08.2016, 01:32 | ||||||
|
Ну я бы вот так делал
Piece - массив координат у нижнего контура фигуры в СК фигуры. При повороте фигуры массив LowEdge подменяется. Добавлено через 1 минуту При этом невыход прямоугольника описанного вокруг фигуры обеспечивается при обработке перемещения влево-вправо Добавлено через 1 минуту В общем без ООП очень тяжко жить на свете, труднее чем без пулемета Добавлено через 5 минут Когда упала - переписываю значения из массива фигуры в массив доски, пересчитывая изменившуюся часть верхнего контура укладки. Потом проверяю строки на заполненность и удаляю 100% заполненные, соответсвенно вычитая количество удаленных строк из массива контура укладки. все.
0
|
||||||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
||
| 06.08.2016, 12:05 [ТС] | ||
массив координат ? вообще первый раз слышуЛадно забейте ... Добавлено через 2 часа 38 минут Это пример не типичного для меня паттерна цикла ) до тетриса не встречал в циклах пары переменных и итераторов )
0
|
||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 06.08.2016, 12:25 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
||
| 06.08.2016, 13:36 [ТС] | ||
|
И я об этом. просто хотел сказать. пробелы в понимании как раз из-за незнание разного типа подобных паттернов.
0
|
||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||||||
| 06.08.2016, 13:51 | ||||||
|
ну тут все просто. С++ это не бейсик и 3-ий параметр в for это не step а оператор выполняющийся перед каждой проверкой условия (то же самое во всех потомках - java js С# php и т.д).
Вот так было бы понятно? Это одно и тоже только разная форма записи, с for более короткая и читабельная.
0
|
||||||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
||
| 06.08.2016, 15:07 [ТС] | ||
|
ты лишь только объясни, что за массивы TopEdge и LowEdge и что в них хранится? А то у меня подобных структур нет.
0
|
||
|
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 06.08.2016, 15:30 | |
|
Board.TopEdge - массив по ширине стакана. в нем координата (номер) верхней занятой ячейки по каждому столбцу. (свойство стакана)
LowEdge - массив по ширине фигуры. координата нижней занятой клетки фигуры в системе корординат фигуры. т.е получается бамашка с закрашенными клеточками стакан. По ней скользит пленка по размерам фигуры (у каждой фигуры при каждом повороте свой размер) тоже с закрашенными летками. Для определения а не столкнулась ли достаточно нижнего контура фигуры и верхнего контура стакана
0
|
|
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
|||||||||||||||||
| 06.08.2016, 23:57 [ТС] | |||||||||||||||||
|
Добавлено через 8 часов 20 минут и так есть две новости - хорошая и не очень ) не очень - я так и не догнал как подобный массив нормально переносить на доску ![]()
![]() простой и более практичный способ ) Мне уже попадалось подобное решение, но теперь я осознал как применить это мне. Заменяем массив единиц 4x4 на массив относительны координат ячеек Прелесть даже в том, что не важен даже порядок пар в массиве.
{1,0}, {1,0}, {1,1}, {0,0} У класса фигуры есть параметры posX и posY, отвечающие за позицию фигуры на доске. От них и будут считаться все остальные ячейки. В результате мы можем получить в цикле идеально точные индексы всех клеток доски, по форме фигуры и сдвигать или стирать фигуру за счет изменения PosX и проверять не заняты ли эти клетки на доске Вот так.
0
|
|||||||||||||||||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
|
| 15.08.2016, 12:13 [ТС] | |
|
Почти готово
фигурки падают, двигаются, вращаются. https://github.com/ZackFox/Tet... src/sample Осталось сделать смещение строк после удаления , пока остаются пустые места Также поворот фигурки не доделан, нет ограничения - фигурка выходит за границу массива при повороте у стен. еще есть ненужное вращение квадрата - надо будет убрать
0
|
|
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
||||||
| 19.08.2016, 10:48 [ТС] | ||||||
|
Знаю что спрашивать в рунете почти бессмысленно и я пишу сам для себя - но я застрял
Все работает, строки удаляются и на первый взгляд проблем нет. Но я долго избегал решение последней проблемы. При повороте фигуры она выходит за границы доски и вызывает эксепшен. либо при повороте у препятствия фигура врастает в него. Я не знаю как это решить. Поворот просто делается и его нельзя вернут обратно, потому что состояния поворота нет - 3 фигуры делают поворот туда-обратно, другие 3 фигуры делают вращение вокруг себя. Чтобы как-то проверять, мне сначала все равно надо повернуть фигуру, но вернуть в предыдущее состояние в отрицательном случае возможности нет. Метод вращения
0
|
||||||
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
||
| 19.08.2016, 11:26 | ||
|
0
|
||
|
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
|
||
| 19.08.2016, 11:54 [ТС] | ||
|
0
|
||
| 19.08.2016, 11:54 | |
|
Программирование тетриса Программирование тетриса
Графическая часть Тетриса Статьи по созданию тетриса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача
Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
Сигнатура
func Fetch(urls string, maxConcurrent int) Result
Пример
urls :=. . .
|
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition)
Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
|
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
|
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool
Worker Pool — паттерн конкурентной обработки задач в Go.
Суть: фиксированное количество горутин-воркеров читают задачи из общего канала
и пишут результаты в общий канал результатов. . . .
|
|
[golang] Pipeline
alhaos 08.06.2026
Pipeline
Pipeline — паттерн конкурентной обработки данных в Go.
Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
|
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь
lIs4oanZS9Y
|
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|