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

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

27.07.2016, 11:30. Показов 6139. Ответов 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 / 1574 / 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 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
04.08.2016, 18:10
Цитата Сообщение от Sergio89 Посмотреть сообщение
а проверку по списку, в который я заношу кубики, когда их отрисовываю.
А что проверки по массиву недостаточно?
0
4031 / 2643 / 582
Регистрация: 11.09.2009
Сообщений: 9,438
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 / 1574 / 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru