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

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

23.10.2013, 00:19. Просмотров 1503. Ответов 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):

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

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

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

Нарисовать лабиринт
Помогите пожалуйста нарисовать лабиринт

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

Как нарисовать на экране круг нужным радиусом?
Как нарисовать на экране круг нужным радиусом? Напр., user вводит в Edit1 число...

7
V0v1k
1160 / 984 / 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
1160 / 984 / 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
1160 / 984 / 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
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
25.10.2013, 13:41 #8
покажите полный лог ошибки.

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

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

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

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

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


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

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

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