Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.04.2023
Сообщений: 13

Двемерный Строковый массив для игрового поля. Проверить дорогу

07.04.2023, 13:12. Показов 1057. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, ребята!
Может ли кто-нибудь помочь мне решить мою задачу?
У меня есть двумерный массив строк, который должен представлять игровое поле. Поле состоит из стены ('#'), маршрута (' ') и линии старта/финиша ('<' или '>'), указывающей направление движения влево или вправо.
Я должен проверить, действительно ли игровое поле. Поле действительное, если маршрут от начала (стартовая линия с рдной стороны) до конца (стартовая линия с другой стороны)не перекрыт стеной. Если например следуя одному маршруту зашел в тупик, но можна вернуться и пойти другим маршрутом (картинка 2), то дорога является действительной, потому что можна все таки дойти до цели. Изображения помогут понять, как может выглядеть игровое поле и как двигаться от начала до конца.
Нам запретили использовать awt или swing.
Очень надеюсь, что смог доступно обяснить задачу и кто то сможет мне помочь.

Java
1
2
3
4
boolean fieldIsValid(String [][] field){
.....
 
}
Миниатюры
Двемерный Строковый массив для игрового поля. Проверить дорогу   Двемерный Строковый массив для игрового поля. Проверить дорогу   Двемерный Строковый массив для игрового поля. Проверить дорогу  

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2023, 13:12
Ответы с готовыми решениями:

Создать массив для игрового поля крестиков-ноликов
Создать массив 13Х13 и заполнить его символами так, чтобы получилось игровое поле для крестиков-ноликов

Создать массив для игрового поля крестиков-ноликов
Создать массив 13Х13 и заполнить его символами так, чтобы получилось игровое поле для крестиков-ноликов.

Двемерный массив
Создать двумерный массив и записать в него 3 строки, после чего вывести массив на экран. Значение массива составляет строка : I am the...

16
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
07.04.2023, 13:26
Цитата Сообщение от maxpavlenko Посмотреть сообщение
Двемерный

Не по теме:

Кликните здесь для просмотра всего текста

2
8 / 6 / 2
Регистрация: 25.12.2011
Сообщений: 116
07.04.2023, 16:12
Для проверки, является ли игровое поле действительным, можно использовать алгоритм поиска в глубину (Depth First Search, DFS). Этот алгоритм позволяет проверить, существует ли маршрут от начала до конца поля без перекрытий стеной.
Вот примерный код:
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
public class GameFieldValidator {
    private static final char WALL = '#';
    private static final char ROUTE = ' ';
    private static final char START_LEFT = '<';
    private static final char START_RIGHT = '>';
 
    public static boolean isValid(char[][] field) {
        int startX = -1, startY = -1;
        for (int i = 0; i < field.length; i++) {
            for (int j = 0; j < field[0].length; j++) {
                if (field[i][j] == START_LEFT || field[i][j] == START_RIGHT) {
                    startX = i;
                    startY = j;
                    break;
                }
            }
            if (startX != -1) break;
        }
        if (startX == -1) return false;
 
        return dfs(field, startX, startY, -1, -1);
    }
 
    private static boolean dfs(char[][] field, int x, int y, int prevX, int prevY) {
        if (x < 0 || y < 0 || x >= field.length || y >= field[0].length) return false;
        if (field[x][y] == WALL) return false;
        if (field[x][y] == START_LEFT && prevY > y) return false;
        if (field[x][y] == START_RIGHT && prevY < y) return false;
        if (field[x][y] == START_LEFT && prevX == x && prevY < y) return false;
        if (field[x][y] == START_RIGHT && prevX == x && prevY > y) return false;
        if (field[x][y] == START_LEFT && prevX != -1 && prevX != x) return false;
        if (field[x][y] == START_RIGHT && prevX != -1 && prevX != x) return false;
        if (field[x][y] == START_LEFT && y == field[0].length - 1) return true;
        if (field[x][y] == START_RIGHT && y == 0) return true;
 
        char tmp = field[x][y];
        field[x][y] = WALL; // посетили ячейку, пометили стеной
        boolean result = dfs(field, x + 1, y, x, y) || dfs(field, x - 1, y, x, y) ||
                dfs(field, x, y + 1, x, y) || dfs(field, x, y - 1, x, y);
        field[x][y] = tmp; // восстановили ячейку
        return result;
    }
}
1
0 / 0 / 0
Регистрация: 07.04.2023
Сообщений: 13
07.04.2023, 17:21  [ТС]
Спасибо большое за ответ.
У меня почему то результат всегда false.
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
07.04.2023, 18:05
Цитата Сообщение от kalder Посмотреть сообщение
посетили ячейку, пометили стеной
Изменять состояние объекта, владения надо которым ты не имеешь, это разве не зло?
Цитата Сообщение от kalder Посмотреть сообщение
dfs(field, x + 1, y, x, y) || dfs(field, x - 1, y, x, y) ||
                dfs(field, x, y + 1, x, y) || dfs(field, x, y - 1, x, y);
Рекурсивные алгоритмы вообще ненадежны. Особенно с таким-то потенциально огромным стеком.

Еще запуск isValid неправильный в корне. Надо брать от направления старта клетку.

Я уже решал похожую задачу, надо только направление добавить в клетку старта. Проверить игровое поле на валидность
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
09.04.2023, 15:48

Не по теме:

korvin_, это двемерский


0
0 / 0 / 0
Регистрация: 07.04.2023
Сообщений: 13
10.04.2023, 09:42  [ТС]
Спасибо большое, я пересмотрел ваш вариант решения подобной задачи. Пока ещё не все понял, я новичок пока.
Вы могли бы мне помочь решить задачу не используя *awt. Нам запретили использовать awt и swing.
Спасибо за любой ответ.
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
10.04.2023, 11:14
maxpavlenko, там awt нужен для функции хэша и equals. Можно самому написать, в принципе-то. Еще там Mutable объект в качестве ключа используется, что конечно неправильно.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
import java.util.*;
 
public class Main {
    public boolean fieldIsValid(String[][] field) {
        var struct = new Struct();
        for (int i = 0; i < field.length; ++i) {
            for (int j = 0; j < field[i].length; ++j) {
                struct.put(new Tile(new Position(i, j), switch (field[i][j]) {
                    case " " -> Tile.Type.ROAD;
                    case "<", ">" -> Tile.Type.START;
                    default -> Tile.Type.WALL;
                }, switch (field[i][j]) {
                    case "<" -> Tile.Direction.WEST;
                    case ">" -> Tile.Direction.EAST;
                    default -> Tile.Direction.NULL;
                }));
            }
        }
 
        return struct.isValid();
    }
 
    public static void main(String[] args) {
 
    }
}
 
class Point {
    private int x, y;
 
    public Point() {
        this(0, 0);
    }
 
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public Point(Point point) {
        this(point.getX(), point.getY());
    }
 
    public void setLocation(Point point) {
        x = point.getX();
        y = point.getY();
    }
 
    public int getX() {
        return x;
    }
 
    public int getY() {
        return y;
    }
 
    public void move(int x, int y) {
        this.x += x;
        this.y += y;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Point that)) return false;
        return getX() == that.getX() && getY() == that.getY();
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(getX(), getY());
    }
}
 
class ImmutablePoint extends Point {
    private final int x, y;
 
    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public final int getX() {
        return x;
    }
 
    public final int getY() {
        return y;
    }
 
    @Override
    public final boolean equals(Object o) {
        return super.equals(o);
    }
 
    @Override
    public final int hashCode() {
        return super.hashCode();
    }
}
 
class Position extends ImmutablePoint {
    public Position(int x, int y) {
        super(x, y);
    }
}
 
record Tile(Position pos, Tile.Type type, Tile.Direction direction) {
    public enum Type {
        WALL, ROAD, START
    }
 
    public enum Direction {
        NORTH(0, 1), SOUTH(0, -1), WEST(-1, 0), EAST(1, 0), NULL(0, 0);
        final int x, y;
 
        Direction(int x, int y) {
            this.x = x;
            this.y = y;
        }
 
        public void move(Point p) {
            p.move(x, y);
        }
 
        public Direction reverse() {
            return switch (this) {
                case NULL -> NULL;
                case SOUTH -> NORTH;
                case NORTH -> SOUTH;
                case WEST -> EAST;
                case EAST -> WEST;
            };
        }
    }
 
}
 
class Struct {
    private final Map<Point, Node> map;
 
 
    public Struct(Tile... tiles) {
        map = new HashMap<>();
        for (var t : tiles) put(t);
    }
 
    public void put(Tile tile) {
        map.put(tile.pos(), new Node(false, tile));
    }
 
    private boolean dfs(Tile.Direction direction, Node start) {
        Deque<Node> stack = new ArrayDeque<>();
        for (var n : map.entrySet()) n.getValue().isPassed = false;
 
        var noidBuff = start;
        final var pointBuff = new Point(noidBuff.tile.pos());
 
        start.isPassed = true;
        direction.move(pointBuff);
        noidBuff = map.get(pointBuff);
        if (noidBuff.tile.type() == Tile.Type.ROAD) stack.addFirst(map.get(pointBuff));
        direction.reverse().move(pointBuff);
 
        while (stack.size() != 0) {
            noidBuff = stack.pollFirst();
            pointBuff.setLocation(noidBuff.tile.pos());
            noidBuff.isPassed = true;
            for (var d : Tile.Direction.values()) {
                d.move(pointBuff);
                noidBuff = map.get(pointBuff);
                if (noidBuff.tile.type() == Tile.Type.ROAD || !noidBuff.isPassed) stack.addFirst(noidBuff);
                if (noidBuff.tile.type() == Tile.Type.START && direction.reverse() == d) return true;
                d.reverse().move(pointBuff);
            }
        }
        return false;
    }
 
    public boolean isValid() {
        for (var n : map.entrySet()) {
            if (n.getValue().tile.type() == Tile.Type.START) {
                if (dfs(n.getValue().tile.direction(), n.getValue())) {
                    return true;
                }
            }
        }
        return false;
    }
 
    private static class Node {
        boolean isPassed;
        Tile tile;
 
        public Node(boolean isPassed, Tile tile) {
            this.isPassed = isPassed;
            this.tile = tile;
        }
    }
}
Тестовые данные прислали бы, я-то не хочу сам треки делать.

Добавлено через 48 минут
Сам попроверял, пару условий неверно сделал. Вроде работает
Кликните здесь для просмотра всего текста
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
import java.util.*;
 
public class Main {
    public static boolean fieldIsValid(String[][] field) {
        var struct = new Struct();
        for (int i = 0; i < field.length; ++i) {
            for (int j = 0; j < field[i].length; ++j) {
                struct.put(new Tile(new Position(j, i), switch (field[i][j]) {
                    case " " -> Tile.Type.ROAD;
                    case "<", ">" -> Tile.Type.START;
                    default -> Tile.Type.WALL;
                }, switch (field[i][j]) {
                    case "<" -> Tile.Direction.WEST;
                    case ">" -> Tile.Direction.EAST;
                    default -> Tile.Direction.NULL;
                }));
            }
        }
 
        return struct.isValid();
    }
 
    public static void main(String[] args) {
        String[][] track0 = {{"#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"}, {"#", "#", "#", " ", " ", ">", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", " ", ">", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", " ", ">", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"},};
        String[][] track1 = {{"#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"}, {"#", "#", "#", " ", " ", ">", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", " ", ">", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", " ", ">", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", " ", " ", " ", " ", " ", " ", " ", "#", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "#"}, {"#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#", "#"},};
        System.out.println(fieldIsValid(track0));//true
        System.out.println(fieldIsValid(track1));//false
    }
}
 
class Point {
    private int x, y;
 
    public Point() {
        this(0, 0);
    }
 
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public Point(Point point) {
        this(point.getX(), point.getY());
    }
 
    public void setLocation(Point point) {
        x = point.getX();
        y = point.getY();
    }
 
    public int getX() {
        return x;
    }
 
    public int getY() {
        return y;
    }
 
    public void move(int x, int y) {
        this.x += x;
        this.y += y;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Point that)) return false;
        return getX() == that.getX() && getY() == that.getY();
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(getX(), getY());
    }
}
 
class ImmutablePoint extends Point {
    private final int x, y;
 
    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public final int getX() {
        return x;
    }
 
    public final int getY() {
        return y;
    }
 
    @Override
    public final boolean equals(Object o) {
        return super.equals(o);
    }
 
    @Override
    public final int hashCode() {
        return super.hashCode();
    }
}
 
class Position extends ImmutablePoint {
    public Position(int x, int y) {
        super(x, y);
    }
}
 
record Tile(Position pos, Tile.Type type, Tile.Direction direction) {
    public enum Type {
        WALL, ROAD, START
    }
 
    public enum Direction {
        NORTH(0, 1), SOUTH(0, -1), WEST(-1, 0), EAST(1, 0), NULL(0, 0);
        final int x, y;
 
        Direction(int x, int y) {
            this.x = x;
            this.y = y;
        }
 
        public void move(Point p) {
            p.move(x, y);
        }
 
        public Direction reverse() {
            return switch (this) {
                case NULL -> NULL;
                case SOUTH -> NORTH;
                case NORTH -> SOUTH;
                case WEST -> EAST;
                case EAST -> WEST;
            };
        }
    }
 
}
 
class Struct {
    private final Map<Point, Node> map;
 
 
    public Struct(Tile... tiles) {
        map = new HashMap<>();
        for (var t : tiles) put(t);
    }
 
    public void put(Tile tile) {
        map.put(tile.pos(), new Node(false, tile));
    }
 
    private boolean dfs(Tile.Direction direction, Node start) {
        Deque<Node> stack = new ArrayDeque<>();
        for (var n : map.entrySet()) n.getValue().isPassed = false;
 
        var noidBuff = start;
        final var pointBuff = new Point(noidBuff.tile.pos());
 
        start.isPassed = true;
        direction.move(pointBuff);
        noidBuff = map.get(pointBuff);
        if (noidBuff.tile.type() == Tile.Type.ROAD) stack.addFirst(map.get(pointBuff));
        direction.reverse().move(pointBuff);
 
        while (stack.size() != 0) {
            noidBuff = stack.pollFirst();
            pointBuff.setLocation(noidBuff.tile.pos());
            noidBuff.isPassed = true;
            for (var d : Tile.Direction.values()) {
                d.move(pointBuff);
                noidBuff = map.get(pointBuff);
                if (noidBuff.tile.type() == Tile.Type.ROAD && !noidBuff.isPassed) stack.addFirst(noidBuff);
                if (noidBuff.tile.type() == Tile.Type.START && direction == d) return true;
                d.reverse().move(pointBuff);
            }
        }
        return false;
    }
 
    public boolean isValid() {
        for (var n : map.entrySet()) {
            if (n.getValue().tile.type() == Tile.Type.START) {
                if (dfs(n.getValue().tile.direction(), n.getValue())) {
                    return true;
                }
            }
        }
        return false;
    }
 
    private static class Node {
        boolean isPassed;
        Tile tile;
 
        public Node(boolean isPassed, Tile tile) {
            this.isPassed = isPassed;
            this.tile = tile;
        }
    }
 
//    @Override
//    public String toString() {
//        Point location = new Point(0, 0), dimension = new Point(100, 10);
//        StringBuilder strb = new StringBuilder();
//        for (int i = location.getY(); i < dimension.getY(); ++i) {
//            for (int j = location.getX(); j < dimension.getX(); ++j) {
//                var v = map.get(new Point(j, i));
//                if (v != null)
//                    strb.append(switch (v.tile.type()) {
//                        case WALL -> "#";
//                        default -> v.isPassed ? "+" : " ";
//                    });
//            }
//            strb.append(System.lineSeparator());
//        }
//        return strb.toString();
//    }
}
1
0 / 0 / 0
Регистрация: 07.04.2023
Сообщений: 13
10.04.2023, 11:19  [ТС]
Тестовые данные у меня есть в JSON. Мне лучше скопировать их сюда в виде массива или загрузить JSON?
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
10.04.2023, 11:39
maxpavlenko, ну если есть тест, который не проходит, то в виде массива лучше, конечно.
0
0 / 0 / 0
Регистрация: 07.04.2023
Сообщений: 13
10.04.2023, 12:45  [ТС]
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
private char[][] trackNotValid =
            {
                    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
                    {'#', '#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', '#', '#'},
                    {'#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '<', '<', '<', '<', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', ' ', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', '#', '#', '#', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
                    {'#', '#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
 
            };
 
 
    private char[][] trackValid =
            {
                    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
                    {'#', '#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', '#', '#'},
                    {'#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', '#', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', '#', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '<', '<', '<', '<', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', ' ', ' ', '#'},
                    {'#', '#', '#', '#', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', ' ', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', '#', '#', '#', ' ', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', ' ', ' ', '#'},
                    {'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
                    {'#', '#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#'},
                    {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
 
            };
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
10.04.2023, 12:53
Цитата Сообщение от maxpavlenko Посмотреть сообщение
'<', '<', '<', '<',
Нарисуй, как ты представляешь похождения.
0
0 / 0 / 0
Регистрация: 07.04.2023
Сообщений: 13
10.04.2023, 13:08  [ТС]
Ну вот здесь я мог бы пойти двумя дорогами, но обе перекрыты стеной, поэтому трек не действителен.
Миниатюры
Двемерный Строковый массив для игрового поля. Проверить дорогу  
0
0 / 0 / 0
Регистрация: 07.04.2023
Сообщений: 13
10.04.2023, 13:22  [ТС]
Здесь я могу спокойно пройти, даже е сти я пойду дорогой 2, я все равно могу вернуться и пойти правильным путем.
Миниатюры
Двемерный Строковый массив для игрового поля. Проверить дорогу  
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
10.04.2023, 21:13
Все равно не понял. Я просто намеренно считаю start клетки стенами. Если мы сквозь них ходить сможем, то вот подобное можно сделать.
Если > и < не значит направление, а можно ходить и вних и вверх, то надо просто перебор всех направлений возможных делать в isValid, как у меня было изначально.
Миниатюры
Двемерный Строковый массив для игрового поля. Проверить дорогу  
0
0 / 0 / 0
Регистрация: 07.04.2023
Сообщений: 13
10.04.2023, 23:46  [ТС]
Прошу прощения. Я что то уже сам совсем запутался и неверно указал направление линии старта (направление должно било быть влево). Попробую объяснить ещё раз. Движение должно начинаться на линии старта (на любой из клеток линии старта). То есть я стою на линии и двигаюсь по направлению указанному стрелкой. Когда я делаю первый шаг, я схожу с линии старта в указанном направлении на первую свободнуюю клетку (' '). Потом я должен пройти по дороге и опять дойти до линии старта. То есть когда поле действительно, то должен быть свободной путь из белых полей до лини старта с другой стороны в том же направлении (в данной ситуации опять влево). Очень надеюсь, что это поможет вам понять мою задачу и спасибо большое за потраченное время.
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
11.04.2023, 02:29
Цитата Сообщение от maxpavlenko Посмотреть сообщение
я схожу с линии старта в указанном направлении на первую свободнуюю клетку (' ')
Где эта клетка? Тут еще проблема в том, что я могу вообще сразу прыгнуть в стартовую клетку. Слепой глухого, короче.
Нужно вводить еще два направления "^", "∨"

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

Забыл как вывести двемерный массив
а точнее квадратную матрицу ХД

EF. Строковый атрибут для поля
Каким образом, и можно ли вообще, задать маску для поля класса? Что-то вроде: ..... public String Title { get; set;...

Строковый массив (объявить пустой глобальный строковый массив из 16 элементов)
Подскажите, как объявить пустой глобальный строковый массив из 16 элементов? в качестве элементов будут указаны пути к графическим...

Создание игрового поля для арканоида
Всем привет! Нужна помощь) В общем, нужно создать стенки для игры арканоид При запуске выходит меню, как нажимаешь на 1, выходит...

Реализовать класс для поддержки игрового поля
А) Реализовать класс для поддержки игрового поля размерностью 3*3, каждый квадрат поля может находиться в одном из 3 состояний –...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru