1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70

Объясните реализацию логики тетриса

27.07.2016, 11:30. Показов 6347. Ответов 65

Студворк — интернет-сервис помощи студентам
Добрый день я учу Java и пробую практиковаться. Собрал свой первый арканойд на JavaFX. Теперь пытаюсь собрать тетрис. Сделал класс поля с массивом нулей и нарисовал его. Для тестирования загнал в этот массив вручную вместо нулей несколько единиц в качестве возможной фигурки и все это рендерится в одном методе по условию проверки на 1 или 0.

Но я не понимаю как мне передавать в массив фигурку и двигать ее там, перерисовывая весь массив на каждый сдвиг фигурки ? Если я правильно понимаю конечно. Нигде нет подробного объяснения. Подскажите как надо и как лучше
Миниатюры
Объясните реализацию логики тетриса  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.07.2016, 11:30
Ответы с готовыми решениями:

Объясните реализацию формы
Есть форма, приложенная на скрин шоте. Я не совсем понимаю метод реализации данной формы. Что это получается какой то input text + select...

Объясните реализацию интерфейсов на примере интерфейса IAny
На лекциях про IAny ничего не объясняли, но в билете есть такой вопрос. Поиск в интернет выдал только такой кусок кода. Помогите пожалуйста...

пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки.
В файле input.txt находится неизвестное количество вещественных чисел в интервале . Выцапарать их оттуда, отсортировать по убыванию модуля...

65
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
31.07.2016, 14:56  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Sergio89, вы толком не можете сформулировать вопрос, поэтому вам никто не отвечает.
Я пытаюсь понять как мне рисовать фигурку, что тут не ясного.
Первый способ (современный) рисовать ее и двигать поверх доски,как отдельный элемент
при столкновении удалять и перерисовывать ее на доску как часть массива.

Второй способ (олдскульный) рисовать и двигать фигуру прям в массиве доски и постоянно перерисовывать доску.

в начале я хотел сделать по второму способу и хотел спросить как же мне там управлять фигурой.
Теперь после неудачный попыток я уже запутался вообще и не знаю, что и как лучше делать.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
02.08.2016, 15:45
нате читайте
http://mech.math.msu.su/~shvet... deas.xhtml
0
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
02.08.2016, 17:56  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
О Спасибо
я уже немного подразобрался ) научился выводить фигурки на доску рандомно )
теперь думаю над алгоритмом падения и проверки столкновений
0
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
03.08.2016, 23:59  [ТС]
могу опускать и останавливать фигурку - но падение никак не привязано к массиву доски,
то есть фигурка не знает на каком ряду находится и сколько занимает столбцов, а двигается в данный момент за счет изменения своих графических координат объекта сцены Java FX (класс Pane), в котором лежат составные квадраты фигурки. Не могу понять как мне сравнить элементы в ряду доски с элементами в фигурке.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
04.08.2016, 08:36
Sergio89, вы математику в школе учили? Сравнивайте координаты фигуры относительно координат доски.
0
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
04.08.2016, 12:03  [ТС]
Картина со старой темы другого форума (там были уже делавшие тетрис и немного смогли немного подсказать автору)
Здесь же все туго с советами - приходится писать самому себе, типа мысли в слух.

Массив с фигурой опускается вниз
перед этим проверяется нет ли в строке под ним препятствия (клетки со значением 1)
если есть - надо проверить в одном ли ряду находится единицы фигурки и единица "препятствия"

Что я упустил ? нюансов проверки много и сложно мне написать все сходу.

Как понять с какой строки начать проверку ?
в момент появления фигурка может занимать разное пространство в верху экрана.
Как сопоставлять ячейки фигурки с ячейками доски, чтобы столкновение срабатывало именно в том ряду,
где находится препятствие
Миниатюры
Объясните реализацию логики тетриса  
0
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
04.08.2016, 12:22  [ТС]
PS
Ладно хоть тему не удаляют, как на некотором быдлоресурсе с названием бытового прибора
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
04.08.2016, 12:35
Цитата Сообщение от Sergio89 Посмотреть сообщение
Ладно хоть тему не удаляют, как на некотором быдлоресурсе с названием бытового прибора
Дак а что вы ожидаете то? Конкретные ответы получают на конкретные вопросы.
0
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
04.08.2016, 12:47  [ТС]
Цитата Сообщение от neske Посмотреть сообщение
Дак а что вы ожидаете то? Конкретные ответы получают на конкретные вопросы.
Сложно назвать конкретный вопрос - потому что задача комплексная, плюс надо в код смотреть.
Ну выложу я имеющийся код на гидхаб, кто-то захочет в нем копаться ?
(хотя там особо разбираться не в чем - 4 небольших класса )
Я пытаюсь находить нужные мне паттерны в исходниках разных платформ, но мне не все понятно
как могу пытаюсь описать процесс в надежде, что зайдет человек, который уже делал и опишет как он делал.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
04.08.2016, 12:54
Ты объясни, чего тебе не понятно то.
Берешь фигуру, обходишь все клетки, проверяешь, что клетка, которая ниже текущей не содержит препятствие, если для каждой из клеток фигуры условие выполняется, добавляешь 1 к координате Y.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
04.08.2016, 13:05
может этой теме место в разделе, где обсуждают алгоритмы?
0
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
04.08.2016, 13:10  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
Ты объясни, чего тебе не понятно то.
Берешь фигуру, обходишь все клетки, проверяешь, что клетка, которая ниже текущей не содержит препятствие, если для каждой из клеток фигуры условие выполняется, добавляешь 1 к координате Y.
проблема в определении клетки ниже текущей - я не знаю как увязать индексы массива фигурки с индексами массива доски. Не хочется в двойной цикл фигурки засовывать еще один двойной цикл для обхода доски.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
04.08.2016, 13:37
Цитата Сообщение от Sergio89 Посмотреть сообщение
Не хочется в двойной цикл фигурки засовывать еще один двойной цикл для обхода доски.
А прийдется. тетрис не писал, но детальки таким образом на листе раскладывал. Аккурат четыре цикла. НУ правда их 133-ий пень секунд 15-20 грыз на полное заполнение листа заготовками.
Да кстати для ускорения определения уперлась фигура или не уперлась заведи одномерный массив по ширине стакана, в котором держи номер максимально верхней заполненой ячейки, фигуру сравнивай с этим массивом. При ширине фигуры это всего 4 сравнения максимум на шаг модели.
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
04.08.2016, 14:36
Если текущая клетка X,Y, то ниже текущей X,Y+1.
0
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
04.08.2016, 18:07  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
Если текущая клетка X,Y, то ниже текущей X,Y+1.
вы опять не поняли ) я не настолько тупой, чтобы проблема была в Y+1 )

У меня нет координат связанных с ячейками
Есть графические координаты объекта сцены, которые я на данный момент изменяю на размер одного квадратика (15px+1px) и все. это никак пока не связано с индексами в массиве доски

Добавлено через 19 минут
Может так хоть станет понятнее ))
А то мне кажется, что мне объясняют то, чего в коде у меня попросту нет

Класс фигурки считывает Enum c массивами форм.
Сам Enam нет смысла показывать там все понятно - список названий и соответствующий массив

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public  class Shape extends Pane {
 
    private Figures shape;
    private int [][] matrix;
    private int posX = 0;
    private int posY = 0;
    Rectangle rect;
    private boolean isFalling = true;
    private boolean isExist;
 
    List<Rectangle> rects = new ArrayList<Rectangle>();
    public Shape(){
        matrix = new int[4][2];
        setShape(Figures.BLANK);
    }
 
    public void setShape(Figures fig) {
        for(int i =0; i<4;i++){
            for(int j=0; j<2;j++) {
                matrix[i][j] = fig.arr[i][j];
            }
        }
        shape = fig;
    }
 
    public void shapeRandom(){
        Random ran = new Random();
        int x = Math.abs(ran.nextInt())%6+1;
        Figures[] pieces = Figures.values();
        setShape(pieces[x]);
    }
 
    public void draw (){
        for(int i =0; i<4;i++){
            for(int j=0; j<2;j++) {
                if(matrix[i][j] == 1){
                    rect = new Rectangle(15,15);
                    rect.setFill(Color.RED);
                    rect.setTranslateY(i*(15+1));
                    rect.setTranslateX(j*(15+1));
                    rects.add(rect);
                    getChildren().add(rect);
                }
            }
        }
    }

Класс поля, в который будут попадать упавшие фигурки

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Board extends Pane {
    private static final int ROWS = 24;
    private static final int COLS = 18;
 
    private static int[][] board = new int[ROWS][COLS];
    private List<Rectangle> landed = new ArrayList<Rectangle>();
    private Rectangle rect;
 
    public Board(){
        for(int i = 0; i<ROWS; i++){
            for(int j = 0; j<COLS; j++){
                board[i][j] = 0;
            }
        }
    }
 
    public void update(){
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                if (board[i][j] == 1) {
                    rect = new Rectangle(15, 15);
                    rect.setFill(Color.RED);
                    rect.setTranslateY(i * (15 + 1));
                    rect.setTranslateX(j * (15 + 1));
                    landed.add(rect);
                    getChildren().add(rect);
                }
            }
        }
    }

Все это используется в классе Main создающее окно JavaFX
тоже думаю нет смысла его показывать как и энам.
Все практически тоже самое как если бы это было на swing

Добавлено через 2 часа 24 минуты
JavaFX вынуждает изменить подход и использовать его API
походу мне придется использовать не проверку по массивам, а проверку по списку, в который я заношу кубики, когда их отрисовываю.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
04.08.2016, 18:10
Цитата Сообщение от Sergio89 Посмотреть сообщение
а проверку по списку, в который я заношу кубики, когда их отрисовываю.
А что проверки по массиву недостаточно?
0
4064 / 2672 / 587
Регистрация: 11.09.2009
Сообщений: 9,525
04.08.2016, 18:19
Цитата Сообщение от Sergio89 Посмотреть сообщение
У меня нет координат связанных с ячейками
Есть графические координаты объекта сцены
В этом и есть ваша беда. Вы пытаетесь мыслить не теми категориями.
Попробуйте сначала продумать и прорисовать на бумажке алгоритм, а потом уж подбирайте инструмент, каким его реализовать.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
04.08.2016, 18:32
Цитата Сообщение от Sergio89 Посмотреть сообщение
У меня нет координат связанных с ячейками
Есть графические координаты объекта сцены, которые я на данный момент изменяю на размер одного квадратика (15px+1px) и все. это никак пока не связано с индексами в массиве доски
блин, координаты стакана знаешь, координаты фигурки знаешь, размер клетки знаешь, в чем вообще проблема то?
И вообще, делай все внутри массива и потом отображай его на свою формочку.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
04.08.2016, 19:04
Цитата Сообщение от xoraxax Посмотреть сообщение
И вообще, делай все внутри массива и потом отображай его на свою формочку.
Абсолютно правильный подход - разделение модели и отображения.
0
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70
04.08.2016, 19:07  [ТС]
блин, координаты стакана знаешь, координаты фигурки знаешь, размер клетки знаешь, в чем вообще проблема то?
И вообще, делай все внутри массива и потом отображай его на свою формочку.
xoraxax на форуме
просто путаницы много
у фигурки и у доски массив сам по себе,
кубики, из которых нарисована фигурка, лежат в списке ArrayList и каждый кубик со своими координатами
компонент JavaFX, в котором находятся нарисованные кубики сам по себе и своими координатами.

из-за этого постоянно теряюсь
плюс у меня есть подозрение, что при рисовании нового кубика в стакане,
поверх старых рисуются дубликаты на тех же координатах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2016, 19:07
Помогаю со студенческими работами здесь

Программирование тетриса
Ребята , есть попытка создания игры &quot;ТЕТРИС&quot; на VS 2010 . Железо PC не позволяет поздние версии.Но суть вопроса не в этом. Дело в том,...

Программирование тетриса
Ребята , есть попытка создания игры &quot;ТЕТРИС&quot; на VS 2010 . Железо PC не позволяет поздние версии.Но суть вопроса не в этом. Дело в том,...

Проблема тетриса
Привет, форум. Появлялась идея изучить хотя-бы азы PyGame, принял решение написать Тетрис. Мой код конечно так себе ибо я не знаю как в...

Графическая часть Тетриса
Помогите с графической частью Тетриса. Создание стакана, фигур и их вывод. Пишу для графического окна. (Гуглом пользоваться умею, но...

Статьи по созданию тетриса
Всем привет. Есть ли какие нибудь статьи по созданию тетриса на vb.net? Если знаете какие нибудь, то скиньте пожалуйста. Заранее спасибо


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru