Edit: я думаю, что вы можете иметь другую абстрактную функцию, такую как performAction
в Entity
классе, и переопределить этот метод в каждом подклассе, а именно Wall
и Space
в этом случае.Когда вы пройдете через массив позже, вы можете просто
Entity entity = maze[row][col];
entity.performAction();
Java выяснить, какой подкласс performAction
использовать во время выполнения.
=========================================================================== Один из вариантов - сохранить два дополнительных ArrayList
как поля.Например,
List<Entity> walls;
List<Entity> spaces;
Инициализируйте их внутри конструктора.
public Maze() {
this.walls = new ArrayList<Entity>();
this.spaces = new ArrayList<Entity>();
}
Внутри самого внутреннего цикла в Maze.create()
вы можете использовать их для списков, чтобы отслеживать стены и пространства.
for(int col = 0; col < Max_Maze_Column; col++){
if (line_content.charAt(col) == '*') {
maze[row][col] = new Wall('*', row, col);
this.walls.add(maze[row][col]);
}
if (line_content.charAt(col) == ' ') {
maze[row][col] = new Space(' ', row, col);
this.spaces.add(maze[row][col]);
}
}
Вы можете получить каждую отдельную стену и пространство через индексный доступ.Для размера, просто позвоните walls.size()
и spaces.size()
.Для произвольного доступа вы можете использовать
// int max = walls.size() or spaces.size()
Random seed = new Random();
// Generate a random integer from 0 to (max - 1)
int index = seed.nextInt(max);
Второй вариант может использовать оператор instanceof
, когда вы проходите через массив позже.Например,
Entity entity = maze[row][col];
if (entity instanceof Wall) {
Wall wall = (Wall) entity;
// do something with wall
} else if (entity instanceof Space) {
Space space = (Space) entity;
// do something with space
}