Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
sashasava
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 9
#1

Подскажите как грамотно нарисовать на экране лабиринт - Программирование Android

23.10.2013, 00:19. Просмотров 1378. Ответов 7
Метки нет (Все метки)

Здравствуйте, так получилось, что мне срочно нужно сделать программу на андройде не имея при этом опыта. Поэтому учусь на ходу и быстро) Суть задачи в том, что нужно на экране с заданными размерами нарисовать рандомный лабиринт с одним правильным проходом. И у меня появились некоторые вопросы :
Если на java код выглядит примерно так (фрагмент) :
Java
1
2
3
4
5
6
7
   
for (int x = 1; x <= N; x++) {
      for (int y = 1; y <= N; y++) {
            if (east[x][y])  StdDraw.line(x + 1, y, x + 1, y + 1);
       }
 }
StdDraw.show(1000);
то как мне правильно заменить stddraw в androide? Чуть почитав про я нашел класс PathShape, где можно рисовать с помощью moveto, lineto. Правильный ли это выбор?

Допустим я смогу нарисовать лабиринт на "холсте" , но мне ещё нужно отдельной кнопкой показывать решение.
Если мое решение рисования лабиринта выглядит примерно так, т.е. я одной функцией возвращаю объект Path и потом рисую его в методе onDraw.
Java
1
2
3
4
5
6
7
8
9
10
11
12
    
        public Path vert( int x, int y) {
        Path path = new Path();
        path.moveTo(x,y);
        path.lineTo(x+10,y);
        return path;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(vert(10,10), paint);
    }
Как сделать так, чтобы два разных холста наложились друг на друга и я бы смог сначала нарисовать лабиринт, а потом по отдельной кнопки на этом лабиринте появилась другая картинка с решением?

Заранее извиняюсь если в чем-то напутал или сказал глупость, и если вас не затруднит, в ответе давайте мини-примерчики или объясните более доходчиво. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2013, 00:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подскажите как грамотно нарисовать на экране лабиринт (Программирование Android):

Нарисовать лес на экране (нарисовать дерево, и размножить его на экране) - Pascal ABC
73. Нарисовать лес на экране (нарисовать дерево, и размножить его на экране)

Создание графическго редактора - как грамотно нарисовать дугу? - Геометрия
Добрый день! Создаю граф редактор. Рисую на Сanvas из фпод GraphicsContext. Для прорисовки дуги собираюсь использовать метод arc(double...

Нарисовать лабиринт - Pascal ABC
64. Нарисовать лабиринт

Игра лабиринт. ИИ в лабиринте. Как задать лабиринт - Графика и игры
У меня есть следующее задание: Дано: - робот - лабиринт Задание: - Нужно реализовать искусственный интеллект для робота,...

Как нарисовать на экране круг нужным радиусом? - Delphi
Как нарисовать на экране круг нужным радиусом? Напр., user вводит в Edit1 число 15 и рисуется круг с R=15см. User берет линейку и измеряет...

Нарисовать лабиринт с помощью DataGridView - C#
Я должна сама нарисовать лабиринт(его стены, вход и выход).Потом найти наиболее короткий путь до выхода. Подумала, что нужно рисовать на...

7
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
23.10.2013, 01:39 #2
Java
1
2
3
4
5
6
7
8
    @Override
   protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
         drawMaze(canvas);
         if(mShowSolution) {
               drawSolution(canvas);
         }
   }
1
sashasava
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 9
23.10.2013, 23:40  [ТС] #3
По ходу появился ещё один вопрос, мое решение лабиринта состоит в том, что рекурсивно проходим лабиринт при этом на каждом шагу рисуем кружок, но так получилось что я не могу рисовать на подобии "рисования лабиринта" , а тут получается придется взять один canvas и в него каждый раз рисовать кружочки для решения. Так вот как это реализовать? что мне поставить кроме закоментированных строк?
Кликните здесь для просмотра всего текста
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
    public void solve(int x, int y) {
        Path path = new Path();
        if (x == 0 || y == 0 || x == N+1 || y == N+1) return ;
        if (done || visited[x][y]) return ;
        visited[x][y] = true;
 
        //StdDraw.setPenColor(StdDraw.BLUE);
        //StdDraw.filledCircle(x + 0.5, y + 0.5, 0.25);
        //StdDraw.show(30);
        path.moveTo(x*10+5, y*10+5); path.lineTo(x*10+8, y*10+8);
        // reached middle
        if (x == N/2 && y == N/2) done = true;
 
        if (!north[x][y]) solve(x, y + 1);
        if (!east[x][y])  solve(x + 1, y);
        if (!south[x][y]) solve(x, y - 1);
        if (!west[x][y])  solve(x - 1, y);
 
        if (done) return;
 
        //StdDraw.setPenColor(StdDraw.GRAY);
        //StdDraw.filledCircle(x + 0.5, y + 0.5, 0.25);
        //StdDraw.show(30);
    }
 
    // solve the maze starting from the start state
    public void solve() {
        for (int x = 1; x <= N; x++)
            for (int y = 1; y <= N; y++)
                visited[x][y] = false;
        done = false;
        solve(1, 1);
    }
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 00:20 #4
ничего не понял.
0
sashasava
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 9
24.10.2013, 00:47  [ТС] #5
Цитата Сообщение от V0v1k Посмотреть сообщение
ничего не понял.
Я перечитал свое предыдущее сообщение и тоже усомнился в его адекватности) Сейчас попробую объяснить . Под спойлером в прошлом сообщении есть рекурсивная функция. Каждый раз она рисует с помощью StdDraw. Так вот как мне заменить этот код в андройде , чтобы после выполнения этой функции был какой-нибудь объект, который я бы мог нарисовать на экране. Т.е. мне нужно делать так, чтобы рисовалось все на один холст. Вроде и сейчас как-то все непонятно сказал, но может быть вы уловили суть? Само решение просто, но я не могу это реализовать. Вот пример как я сделал само рисование.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Path path = new Path();
private Path draw() {
        if (south[x][y]) path.moveTo(x, y); path.lineTo(x+dx, y);
        return path;
}
private void drawMaze(Canvas canvas) {
        canvas.drawPath(draw(),paint);
}
@Override
protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
 
        paint.setColor(Color.RED);
        paint.setStrokeWidth(2);
        drawMaze(canvas);
}

Но таким способ сделать с той функцией у меня не получается , т.к. не могу вернуть path. Кстати я понимаю что все плохо в логике кода, может подскажите как сделать грамотней?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
24.10.2013, 13:31 #6
просто найдите аналоги в андроидовских классах
например:
Java
1
2
//StdDraw.setPenColor(StdDraw.GRAY);
paint.setColor(Color.GRAY);
0
sashasava
0 / 0 / 0
Регистрация: 22.10.2013
Сообщений: 9
25.10.2013, 02:30  [ТС] #7
Пожалуй остался всего один вопрос. У меня есть главный экран с кнопками , который появляется первым при запуске приложения. В нем я нажимаю кнопку и открывается картинка с нарисованным лабиринтом. Т.е. в setContentView( draw) , где draw просто рисует лабиринт на экране. Но мне нужно чтобы рядом с лабиринтом была кнопка, которая показывала бы решение. А значит, нужно создать ещё один xml файл, где нужно описать кнопку и сам этот draw. А далее уже использовать setContentView(R.layout.***.xml). Я попробовал описать в хml файле test.test.MyDraw и дать ему границы 300 на 300, а внизу под ним была бы кнопка. Но он не смог отрендерить (пишет ArrayIndexOutOfBoundsException= 2).
Так вот вопрос, это единственный способ соединить нарисованный холст с кнопкой на одном экране или возможно есть другие способы? Может можно обработать двойное нажатие на экран или что-то типо того.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.10.2013, 13:41 #8
покажите полный лог ошибки.

Добавлено через 1 минуту
Цитата Сообщение от sashasava Посмотреть сообщение
Так вот вопрос, это единственный способ соединить нарисованный холст с кнопкой на одном экране или возможно есть другие способы?
можно еще динамически создать лаяут и засунуть туда кнопку и MyDraw
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2013, 13:41
Привет! Вот еще темы с ответами:

Как нарисовать на экране символы поверх всех окон - C++ Builder
Здравствуйте! Если на мультимедийной клавиатуре нажать какую нить мультимедийную кнопку то на дисплее выскакивает большими буквами...

Как нарисовать точку на экране поверх всех окон? - C++
Нужно вывести по центру экрана точку поверх всех окон, тоесть не только в моём приложении а вообще поверх всех.

.NET 4.x Как нарисовать на экране заданное количество окружностей и окружности не должны пересекаться? - C#
Здравствуйте хорошие программеры, я с C# слабак и только начинаю изучать. Есть вопрос по теме: С помощью генератора случайных чисел...

Подскажите, пожалуйста, как в паскале на экране вывести 0.5 или 1/2? - Free Pascal
Подскажите, пожалуйста, как в паскале на экране вывести 0.5 или 1/2? Заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
25.10.2013, 13:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru