Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 70

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

27.07.2016, 11:30. Показов 6402. Ответов 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
4069 / 2677 / 587
Регистрация: 11.09.2009
Сообщений: 9,560
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
Ответ Создать тему
Новые блоги и статьи
[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. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru